# 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 = [
    ":local_data_migration",
    ":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",
    "libtpmcrypto",
    "openssl",
  ]
  if (use.fuzzer) {
    pkg_deps += [ "protobuf" ]
  } else {
    pkg_deps += [ "protobuf-lite" ]
  }
}

config("target_defaults") {
  configs = [ ":target_default_deps" ]
  defines = [
    "USE_TPM_DYNAMIC=${use.tpm_dynamic}",
    "USE_TPM1=${use.tpm}",
    "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" ]
}

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

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

static_library("server_library") {
  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",
  ]
  configs += [ ":target_defaults" ]

  # 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",
  ]

  libs = [ "hwsec-foundation" ]

  all_dependent_configs = []

  deps = [ ":legacy_local_data_proto" ]

  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" ]
  }

  if (use.tpm) {
    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" ]
  }
}

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

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

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

  # 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",
      "libmetrics",
      "libtpm_manager-client",
      "libtpm_manager-client-test",
    ]
  }

  executable("tpm_manager_testrunner") {
    sources = [
      "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",
    ]
    configs += [
      "//common-mk:test",
      ":target_defaults",
      ":tpm_manager_testrunner_config",
    ]

    libs = [ "hwsec_test" ]

    deps = [
      ":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",
    ]

    if (use.tpm2) {
      sources += [
        "server/tpm2_initializer_test.cc",
        "server/tpm2_nvram_test.cc",
        "server/tpm2_status_test.cc",
      ]
      libs += [ "trunks_test" ]
    }
    if (use.tpm) {
      sources += [
        "server/tpm_connection_test.cc",
        "server/tpm_initializer_test.cc",
        "server/tpm_nvram_test.cc",
      ]
    }
  }
}
