# 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 these shared libs.
# gnlint: disable=GnLintVisibilityFlags

import("//common-mk/pkg_config.gni")
import("//common-mk/proto_library.gni")

group("all") {
  deps = [
    ":attestation_client",
    ":attestationd",
    ":libattestation",
  ]
  if (use.test) {
    deps += [ ":attestation_testrunner" ]
  }
}

config("local_proto_include") {
  # This config is used when any build target used the local protobufs.
  # The local protobuf used some other protos in system_api, so we'll need
  # to fix the include path so that it builds correctly.
  include_dirs = [ "${sysroot}/usr/include/attestation/proto_bindings/" ]
}

pkg_config("target_defaults") {
  pkg_deps = [
    # This is a list of pkg-config dependencies
    "libbrillo-${libbase_ver}",
    "libchrome-${libbase_ver}",
  ]
  if (use.fuzzer) {
    pkg_deps += [ "protobuf" ]
  } else {
    pkg_deps += [ "protobuf-lite" ]
  }
  defines = [ "USE_TPM2=${use.tpm2}" ]
}

# A library for just the protobufs.
proto_library("proto_library_proto") {
  # Use -fPIC so this code can be linked into a shared library.
  use_pic = true
  proto_in_dir = "common"
  proto_out_dir = "include/attestation/common"
  proto_lib_dirs = [ "${sysroot}/usr/include/chromeos/dbus/attestation/" ]
  configs = [ ":local_proto_include" ]
  sources = [
    "${proto_in_dir}/database.proto",
  ]
  standalone = true
}

source_set("proto_library") {
  configs += [
    "//common-mk:nouse_thin_archive",
    "//common-mk:pic",

    # TODO: Use brillo/brillo_export.h instead to export symbols.
    "//common-mk:visibility_default",
    ":target_defaults",
  ]
  sources = [
    "common/print_attestation_ca_proto.cc",
    "common/print_interface_proto.cc",
    "common/print_keystore_proto.cc",
  ]
}

# A library for common code.
pkg_config("common_library_config") {
  pkg_deps = [
    "openssl",
    "vboot_host",
  ]
  libs = [ "tpm_manager" ]
}

config("common_library_with_tpm2_config") {
  libs = [ "trunks" ]
}

config("common_library_without_tpm2_config") {
  libs = [ "tspi" ]
}

source_set("common_library") {
  sources = [
    "common/crypto_utility_impl.cc",
    "common/tpm_utility_factory.cc",
  ]
  all_dependent_configs = [ ":common_library_config" ]
  configs += [
    "//common-mk:nouse_thin_archive",
    ":target_defaults",
    ":local_proto_include",
  ]
  deps = [
    ":proto_library",
    ":proto_library_proto",
  ]
  if (use.tpm2) {
    sources += [ "common/tpm_utility_v2.cc" ]
    all_dependent_configs += [ ":common_library_with_tpm2_config" ]
  } else {
    sources += [
      "common/tpm_utility_common.cc",
      "common/tpm_utility_v1.cc",
    ]
    all_dependent_configs += [ ":common_library_without_tpm2_config" ]
  }
}

# A library for client code.
source_set("client_library") {
  configs += [
    "//common-mk:pic",
    ":target_defaults",
    "//common-mk:nouse_thin_archive",
    ":local_proto_include",

    # TODO: Use brillo/brillo_export.h instead to export symbols.
    "//common-mk:visibility_default",
  ]
  sources = [
    "client/dbus_proxy.cc",
  ]
  deps = [
    ":proto_library",
    ":proto_library_proto",
  ]
}

# A shared library for clients.
shared_library("libattestation") {
  configs += [
    "//common-mk:nouse_thin_archive",
    ":local_proto_include",

    # TODO: Use brillo/brillo_export.h instead to export symbols.
    "//common-mk:visibility_default",
    ":target_defaults",
  ]
  deps = [
    ":client_library",
    ":proto_library",
    ":proto_library_proto",
  ]
}

# A client command line utility.
executable("attestation_client") {
  configs += [
    ":target_defaults",
    ":local_proto_include",
  ]
  sources = [
    "client/main.cc",
  ]
  deps = [
    ":client_library",
    ":common_library",
    ":proto_library",
    ":proto_library_proto",
  ]
  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_config") {
  libs = [ "chaps" ]
}

source_set("server_library") {
  sources = [
    "server/attestation_service.cc",
    "server/database_impl.cc",
    "server/dbus_service.cc",
    "server/pkcs11_key_store.cc",
  ]
  all_dependent_configs = [ ":server_library_config" ]
  configs += [
    ":target_defaults",
    ":local_proto_include",
  ]
  deps = [
    ":proto_library",
    ":proto_library_proto",
  ]
}

# The attestation daemon.
pkg_config("attestationd_config") {
  pkg_deps = [ "libminijail" ]
}

executable("attestationd") {
  sources = [
    "server/main.cc",
  ]
  configs += [
    ":attestationd_config",
    ":local_proto_include",
    ":target_defaults",
  ]
  deps = [
    ":common_library",
    ":proto_library",
    ":proto_library_proto",
    ":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",
  ]
}

if (use.test) {
  pkg_config("attestation_testrunner_config") {
    pkg_deps = [
      "libbrillo-test-${libbase_ver}",
      "libchrome-test-${libbase_ver}",
    ]
  }
  executable("attestation_testrunner") {
    configs += [
      "//common-mk:test",
      ":attestation_testrunner_config",
      ":local_proto_include",
      ":target_defaults",
    ]
    sources = [
      "attestation_testrunner.cc",
      "client/dbus_proxy_test.cc",
      "common/crypto_utility_impl_test.cc",
      "common/mock_crypto_utility.cc",
      "common/mock_tpm_utility.cc",
      "server/attestation_service_test.cc",
      "server/database_impl_test.cc",
      "server/dbus_service_test.cc",
      "server/mock_database.cc",
      "server/mock_key_store.cc",
      "server/pkcs11_key_store_test.cc",
    ]
    if (use.tpm2) {
      sources += [ "common/tpm_utility_v2_test.cc" ]
      libs = [
        "hwsec_test",
        "tpm_manager_test",
        "trunks_test",
      ]
    } else {
      sources += [ "common/tpm_utility_common_test.cc" ]
      libs = [ "hwsec_test" ]
    }
    deps = [
      ":client_library",
      ":common_library",
      ":proto_library",
      ":proto_library_proto",
      ":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-lite",
    ]
  }
}
