# 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}",
    "protobuf-lite",
  ]
  if (use.tpm2) {
    defines = [ "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
}

static_library("proto_library") {
  configs -= [
    "//common-mk:pie",
    "//common-mk:use_thin_archive",
  ]
  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",
  ]
}

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

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

static_library("common_library") {
  sources = [
    "common/crypto_utility_impl.cc",
    "common/tpm_utility_factory.cc",
  ]
  all_dependent_configs = [ ":common_library_config" ]
  configs -= [ "//common-mk:use_thin_archive" ]
  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.
static_library("client_library") {
  # Use -fPIC so this code can be linked into a shared library.
  configs -= [
    "//common-mk:pie",
    "//common-mk:use_thin_archive",
  ]
  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",
  ]
  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 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",
    "tpm_manager",
  ]
}

static_library("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",
    ":target_defaults",
    ":local_proto_include",
  ]
  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",
      ":target_defaults",
      ":local_proto_include",
    ]
    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 = [
        "tpm_manager_test",
        "trunks_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",
    ]
  }
}
