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

  # NOSORT
  pkg_deps = [
    "libbrillo",
    "libchrome-${libbase_ver}",
    "libcros_config",
    "libmetrics",
    "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") {
  sources = [
    "biod_config.cc",
    "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",
    "ec_command_factory.cc",
    "fp_context_command.cc",
    "fp_context_command_factory.cc",
    "fp_flashprotect_command.cc",
    "fp_info_command.cc",
    "fp_mode.cc",
    "power_button_filter.cc",
    "power_manager_client.cc",
    "uinput_device.cc",
    "updater/cros_fp_updater.cc",
    "updater/update_utils.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" ]
  libs = [ "biod_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",
      "ec_command_async_test.cc",
      "ec_command_test.cc",
      "fp_context_command_factory_test.cc",
      "fp_context_command_test.cc",
      "fp_flashprotect_command_test.cc",
      "fp_info_command_test.cc",
      "fp_mode_test.cc",
      "power_button_filter_test.cc",
      "power_manager_client_test.cc",
      "tools/bio_crypto_init_test.cc",
      "updater/cros_fp_updater_test.cc",
      "updater/update_utils_test.cc",
    ]
    configs += [
      "//common-mk:test",
      ":libchrome_test_config",
      ":target_defaults",
    ]
    deps = [
      ":fake_libbiod",
      ":libbiod",
      "//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" ]
  }
}
