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

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