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