# 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" ]
  }
  if (use.fuzzer) {
    deps += [ ":tpm_manager_service_fuzzer" ]
  }
}

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}",
    "USE_TPM_INSECURE_FALLBACK=${use.tpm_insecure_fallback}",
    "USE_OS_INSTALL_SERVICE=${use.os_install_service}",
  ]
}

# 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/pinweaver_provision.cc",
    "server/tpm_allowlist_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",
  ]
  libs = [ "rootdev" ]
  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",
      ]
    }
  }
}

if (use.fuzzer) {
  executable("tpm_manager_service_fuzzer") {
    sources = [ "server/fuzzers/tpm_manager_service_fuzzer.cc" ]
    if (use.tpm) {
      sources += [ "server/fuzzers/tpm_fuzzer_utils_impl.cc" ]
    }
    if (use.tpm2) {
      sources += [ "server/fuzzers/tpm2_fuzzer_utils_impl.cc" ]
    }
    configs += [
      "//common-mk/common_fuzzer:common_fuzzer",
      "//common-mk:test",
      ":target_defaults",
      ":local_proto_include",
    ]
    libs = []
    if (use.tpm2) {
      libs += [ "trunks_test" ]
    }
    deps = [
      ":server_library",
      ":tpm_manager_service_fuzzer_data_proto",
    ]
    pkg_deps = [
      "libmetrics",
      "libprotobuf-mutator",
    ]
  }
  config("local_proto_include") {
    include_dirs = [ "${sysroot}/usr/include/tpm_manager/proto_bindings/" ]
  }
  proto_library("tpm_manager_service_fuzzer_data_proto") {
    proto_in_dir = "server/fuzzers"
    proto_out_dir = "include/tpm_manager/server/fuzzers"
    proto_lib_dirs = [ "${sysroot}/usr/include/chromeos/dbus/tpm_manager" ]
    configs = [ ":local_proto_include" ]
    sources = [ "${proto_in_dir}/tpm_manager_service_fuzzer_data.proto" ]
  }
}
