# 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",
  ]
  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_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",
  ]
  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 = [ "libminijail" ]
}

executable("tpm_managerd") {
  configs += [
    ":target_defaults",
    ":tpm_managerd_config",
  ]
  sources = [
    "server/main.cc",
  ]
  deps = [
    ":proto_library",
    ":server_library",
  ]
  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",
  ]
  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}",
    ]
  }

  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_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" ]
      libs = [ "hwsec_test" ]
    }
    deps = [
      ":libtpm_manager",
      ":proto_library",
      ":server_library",
      ":tpm_manager_test",
    ]
    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",
    ]
  }
}
