# Copyright 2019 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# TODO: Fix the visibility on some libs.
# gnlint: disable=GnLintVisibilityFlags

import("//common-mk/pkg_config.gni")
import("//common-mk/proto_library.gni")

group("all") {
  deps = [
    ":libtpm_manager",
    ":local_data_migration",
    ":tpm_manager_client",
    ":tpm_manager_test",
    ":tpm_managerd",
  ]
  if (use.test) {
    deps += [ ":tpm_manager_testrunner" ]
  }
}

pkg_config("target_default_deps") {
  # This is a list of pkg-config dependencies
  pkg_deps = [
    "libbrillo",
    "libchrome-${libbase_ver}",
    "libtpmcrypto",
    "openssl",
    "protobuf-lite",
  ]
}

config("target_defaults") {
  configs = [ ":target_default_deps" ]
  defines = [ "USE_TPM2=${use.tpm2}" ]
}

# A protobuf library of legacy local data.
proto_library("legacy_local_data_proto") {
  # Use -fPIC so this code can be linked into a shared library.
  use_pic = true
  proto_in_dir = "server"
  proto_out_dir = "include/tpm_manager/server"
  sources = [ "${proto_in_dir}/legacy_local_data.proto" ]
}

static_library("proto_library") {
  configs -= [
    "//common-mk:use_thin_archive",
    "//common-mk:pie",
  ]
  configs += [
    ":target_defaults",
    "//common-mk:nouse_thin_archive",

    # TODO: Use brillo/brillo_export.h instead to export symbols.
    "//common-mk:visibility_default",
    "//common-mk:pic",
  ]
  proto_in_dir = "common"
  sources = [ "${proto_in_dir}/print_tpm_manager_proto.cc" ]
}

# A shared library for clients.
shared_library("libtpm_manager") {
  configs += [ ":target_defaults" ]
  sources = [
    "client/tpm_manager_utility.cc",
    "client/tpm_nvram_dbus_proxy.cc",
    "client/tpm_ownership_dbus_proxy.cc",
  ]
  deps = [ ":proto_library" ]
}

# A client command line utility.
executable("tpm_manager_client") {
  configs += [ ":target_defaults" ]
  sources = [ "client/main.cc" ]
  deps = [
    ":libtpm_manager",
    ":proto_library",
  ]

  # NOSORT
  pkg_deps = [
    # system_api depends on protobuf (or protobuf-lite). It must appear
    # before protobuf here or the linker flags won't be in the right
    # order.
    "system_api",
    "protobuf",
  ]
}

# A library for server code.
config("server_library_tpm2_config") {
  libs = [ "trunks" ]
}

config("server_library_tpm1_config") {
  libs = [
    "hwsec",
    "tspi",
  ]
}

static_library("server_library") {
  configs += [ ":target_defaults" ]
  sources = [
    "server/dbus_service.cc",
    "server/local_data_migration.cc",
    "server/local_data_store_impl.cc",
    "server/openssl_crypto_util_impl.cc",
    "server/tpm_manager_metrics.cc",
    "server/tpm_manager_service.cc",
  ]
  if (use.tpm2) {
    sources += [
      "server/tpm2_initializer_impl.cc",
      "server/tpm2_nvram_impl.cc",
      "server/tpm2_status_impl.cc",
    ]
    all_dependent_configs = [ ":server_library_tpm2_config" ]
  } else {
    sources += [
      "server/tpm_connection.cc",
      "server/tpm_initializer_impl.cc",
      "server/tpm_nvram_impl.cc",
      "server/tpm_status_impl.cc",
    ]
    all_dependent_configs = [ ":server_library_tpm1_config" ]
  }
  deps = [
    ":legacy_local_data_proto",
    ":proto_library",
  ]

  # NOSORT
  pkg_deps = [
    # system_api depends on protobuf (or protobuf-lite). It must appear
    # before protobuf here or the linker flags won't be in the right
    # order.
    "system_api",
    "protobuf",
  ]
}

# The tpm_manager daemon.
pkg_config("tpm_managerd_config") {
  pkg_deps = [
    "libmetrics",
    "libminijail",
  ]
}

executable("tpm_managerd") {
  configs += [
    ":target_defaults",
    ":tpm_managerd_config",
  ]
  sources = [ "server/main.cc" ]
  deps = [
    ":proto_library",
    ":server_library",
  ]

  # NOSORT
  pkg_deps = [
    # system_api depends on protobuf (or protobuf-lite). It must appear
    # before protobuf here or the linker flags won't be in the right
    # order.
    "system_api",
    "protobuf",
  ]
}

config("local_data_migration_config") {
  libs = [ "tpmcrypto" ]
}

# Local data migrator.
executable("local_data_migration") {
  configs += [
    ":local_data_migration_config",
    ":target_defaults",
  ]
  sources = [ "server/local_data_migration_main.cc" ]
  deps = [ ":server_library" ]
}

# A library for externally useful tpm_manager_testtest code.
static_library("tpm_manager_test") {
  configs += [
    ":target_defaults",
    "//common-mk:nouse_thin_archive",
  ]
  configs -= [ "//common-mk:use_thin_archive" ]
  sources = [
    "common/mock_tpm_nvram_interface.cc",
    "common/mock_tpm_ownership_interface.cc",
  ]
  deps = [ ":proto_library" ]

  # NOSORT
  pkg_deps = [
    # system_api depends on protobuf (or protobuf-lite). It must appear
    # before protobuf here or the linker flags won't be in the right
    # order.
    "system_api",
    "protobuf",
  ]
}

if (use.test) {
  pkg_config("tpm_manager_testrunner_config") {
    pkg_deps = [
      "libbrillo-test",
      "libchrome-test-${libbase_ver}",
      "libmetrics",
    ]
  }

  executable("tpm_manager_testrunner") {
    configs += [
      "//common-mk:test",
      ":target_defaults",
      ":tpm_manager_testrunner_config",
    ]
    sources = [
      "client/tpm_manager_utility_test.cc",
      "client/tpm_nvram_dbus_proxy_test.cc",
      "client/tpm_ownership_dbus_proxy_test.cc",

      # "server/dbus_service_test.cc",
      "server/local_data_migration_test.cc",
      "server/mock_local_data_store.cc",
      "server/mock_openssl_crypto_util.cc",
      "server/mock_tpm_initializer.cc",
      "server/mock_tpm_nvram.cc",
      "server/mock_tpm_status.cc",
      "server/tpm_manager_metrics_test.cc",
      "server/tpm_manager_service_test.cc",
      "tpm_manager_testrunner.cc",
    ]
    if (use.tpm2) {
      sources += [
        "server/tpm2_initializer_test.cc",
        "server/tpm2_nvram_test.cc",
        "server/tpm2_status_test.cc",
      ]
      libs = [ "trunks_test" ]
    } else {
      sources += [
        "server/tpm_connection_test.cc",
        "server/tpm_initializer_test.cc",
      ]
      libs = [ "hwsec_test" ]
    }
    deps = [
      ":libtpm_manager",
      ":proto_library",
      ":server_library",
      ":tpm_manager_test",
    ]

    # NOSORT
    pkg_deps = [
      # system_api depends on protobuf (or protobuf-lite). It must appear
      # before protobuf here or the linker flags won't be in the right
      # order.
      "system_api",
      "protobuf",
    ]
  }
}
