# 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",
    "libcros_config",
    "libec",
    "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",
    "biod_system.cc",
    "biometrics_daemon.cc",
    "cros_fp_biometrics_manager.cc",
    "cros_fp_device.cc",
    "cros_fp_firmware.cc",
    "crypto_init/bio_crypto_init.cc",
    "power_button_filter.cc",
    "power_manager_client.cc",
    "uinput_device.cc",
    "updater/cros_fp_updater.cc",
    "updater/update_utils.cc",
    "utils.cc",
  ]
  configs += [ ":target_defaults" ]
  pkg_deps = [ "vboot_host" ]
}

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 = [
    "crypto_init/bio_crypto_init.cc",
    "tools/bio_crypto_init_main.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" ]
  }
  executable("biod_test_runner") {
    sources = [
      "biod_crypto_test.cc",
      "biod_metrics_test.cc",
      "biod_storage_test.cc",
      "biod_system_test.cc",
      "cros_fp_biometrics_manager_test.cc",
      "cros_fp_device_test.cc",
      "cros_fp_firmware_test.cc",
      "crypto_init/bio_crypto_init_test.cc",
      "power_button_filter_test.cc",
      "power_manager_client_test.cc",
      "updater/cros_fp_updater_test.cc",
      "updater/update_utils_test.cc",
      "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" ]
  }
  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" ]
  }
}
