# Copyright 2018 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.

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

group("all") {
  deps = [
    ":bio_crypto_init",
    ":bio_fw_updater",
    ":bio_wash",
    ":biod",
    ":biod_client_tool",
    ":libbiod",
  ]
  if (use.test) {
    deps += [ ":biod_test_runner" ]
  }
  if (use.fuzzer) {
    deps += [
      ":biod_crypto_validation_value_fuzzer",
      ":biod_storage_fuzzer",
    ]
  }
}

pkg_config("target_defaults") {
  # TODO(crbug.com/993557): Remove |fp_on_power_button| USE flag when nocturne
  # is EOL.
  if (use.fp_on_power_button) {
    defines = [ "FP_ON_POWER_BUTTON" ]
  }
  pkg_deps = [
    "libbrillo",
    "libchrome-${libbase_ver}",
    "libcros_config",
    "libmetrics-${libbase_ver}",
    "libpower_manager-client",
    "fmap",
    "openssl",

    # 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",
  ]
  if (use.fuzzer) {
    pkg_deps += [ "protobuf" ]
  } else {
    pkg_deps += [ "protobuf-lite" ]
  }
}

static_library("libbiod_proxy") {
  configs += [ ":target_defaults" ]
  sources = [
    "dbus/biometrics_manager_proxy_base.cc",
  ]
}

static_library("libbiod") {
  sources = [
    "biod_crypto.cc",
    "biod_metrics.cc",
    "biod_storage.cc",
    "biometrics_daemon.cc",
    "cros_fp_biometrics_manager.cc",
    "cros_fp_device.cc",
    "cros_fp_firmware.cc",
    "cros_fp_updater.cc",
    "ec_command_factory.cc",
    "fp_context_command.cc",
    "fp_context_command_factory.cc",
    "fp_mode.cc",
    "power_button_filter.cc",
    "power_manager_client.cc",
    "uinput_device.cc",
  ]
  configs += [ ":target_defaults" ]
}

static_library("fake_libbiod") {
  sources = [
    "fake_power_manager_client.cc",
  ]
  configs += [ ":target_defaults" ]
}

executable("biod") {
  sources = [
    "main.cc",
  ]
  configs += [ ":target_defaults" ]
  deps = [
    ":libbiod",
  ]
}

executable("bio_crypto_init") {
  sources = [
    "tools/bio_crypto_init.cc",
  ]
  configs += [ ":target_defaults" ]
  deps = [
    ":libbiod",
  ]
}

executable("bio_wash") {
  sources = [
    "tools/bio_wash.cc",
  ]
  configs += [ ":target_defaults" ]
  deps = [
    ":libbiod",
  ]
}

executable("biod_client_tool") {
  sources = [
    "tools/biod_client_tool.cc",
  ]
  configs += [ ":target_defaults" ]
  deps = [
    ":libbiod_proxy",
  ]
}

executable("bio_fw_updater") {
  sources = [
    "tools/bio_fw_updater.cc",
  ]
  configs += [ ":target_defaults" ]
  deps = [
    ":libbiod",
  ]
}

if (use.test) {
  pkg_config("libchrome_test_config") {
    pkg_deps = [ "libchrome-test-${libbase_ver}" ]
  }
  executable("biod_test_runner") {
    sources = [
      "biod_crypto_test.cc",
      "biod_metrics_test.cc",
      "biod_storage_test.cc",
      "cros_fp_biometrics_manager_test.cc",
      "cros_fp_device_test.cc",
      "cros_fp_firmware_test.cc",
      "cros_fp_updater_test.cc",
      "dbus/biometrics_manager_proxy_base_test.cc",
      "ec_command_async_test.cc",
      "ec_command_test.cc",
      "fp_context_command_factory_test.cc",
      "fp_context_command_test.cc",
      "fp_mode_test.cc",
      "power_button_filter_test.cc",
      "power_manager_client_test.cc",
      "tools/bio_crypto_init_test.cc",
    ]
    configs += [
      "//common-mk:test",
      ":libchrome_test_config",
      ":target_defaults",
    ]
    deps = [
      ":fake_libbiod",
      ":libbiod",
      ":libbiod_proxy",
      "//common-mk/testrunner",
    ]
  }
}

if (use.fuzzer) {
  pkg_config("libchrome_test_config") {
    pkg_deps = [ "libchrome-test-${libbase_ver}" ]
  }
  executable("biod_storage_fuzzer") {
    sources = [
      "biod_storage_fuzzer.cc",
    ]
    configs += [
      "//common-mk/common_fuzzer",
      ":libchrome_test_config",
      ":target_defaults",
    ]
    deps = [
      ":libbiod",
    ]
  }
  executable("biod_crypto_validation_value_fuzzer") {
    sources = [
      "biod_crypto_validation_value_fuzzer.cc",
    ]
    configs += [
      "//common-mk/common_fuzzer",
      ":libchrome_test_config",
      ":target_defaults",
    ]
    deps = [
      ":libbiod",
    ]
  }
}
