# 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 = [
    ":libruntime_probe",
    ":runtime_probe",
  ]
  if (use.test) {
    deps += [ ":unittest_runner" ]
  }
  if (use.fuzzer) {
    deps += [
      ":runtime_probe_probestatement_fuzzer",
      ":runtime_probe_resultchecker_fuzzer",
    ]
  }
}

pkg_config("target_defaults") {
  # NOSORT
  pkg_deps = [
    "libbrillo",
    "libchrome",
    "libcros_config",
    "libpcrecpp",
    "libshill-client",

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

static_library("libruntime_probe") {
  configs += [ ":target_defaults" ]
  sources = [
    "component_category.cc",
    "daemon.cc",
    "function_templates/network.cc",
    "function_templates/storage.cc",
    "functions/all_functions.cc",
    "functions/ata_storage.cc",
    "functions/cellular_network.cc",
    "functions/ectool_i2cread.cc",
    "functions/edid.cc",
    "functions/ethernet_network.cc",
    "functions/generic_battery.cc",
    "functions/generic_network.cc",
    "functions/generic_storage.cc",
    "functions/input_device.cc",
    "functions/memory.cc",
    "functions/mmc_storage.cc",
    "functions/nvme_storage.cc",
    "functions/sequence.cc",
    "functions/sysfs.cc",
    "functions/usb_camera.cc",
    "functions/vpd_cached.cc",
    "functions/wireless_network.cc",
    "probe_config.cc",
    "probe_function.cc",
    "probe_function_argument.cc",
    "probe_result_checker.cc",
    "probe_statement.cc",
    "utils/config_utils.cc",
    "utils/edid.cc",
    "utils/file_utils.cc",
    "utils/type_utils.cc",
    "utils/value_utils.cc",
  ]
}

executable("runtime_probe") {
  configs += [ ":target_defaults" ]
  sources = [ "runtime_probe.cc" ]
  deps = [ ":libruntime_probe" ]
}

if (use.test) {
  executable("unittest_runner") {
    configs += [
      "//common-mk:test",
      ":target_defaults",
    ]
    sources = [
      "functions/sequence_test.cc",
      "functions/sysfs_test.cc",
      "probe_config_test.cc",
      "probe_result_checker_test.cc",
      "probe_statement_test.cc",
      "utils/config_utils_test.cc",
    ]
    deps = [
      ":libruntime_probe",
      "//common-mk/testrunner",
    ]
    data = [
      "testdata/probe_config.json",
      "testdata/test.txt",
    ]
  }
}

if (use.fuzzer) {
  executable("runtime_probe_resultchecker_fuzzer") {
    configs += [ "//common-mk/common_fuzzer" ]
    sources = [ "runtime_probe_resultchecker_fuzzer.cc" ]
    deps = [ ":libruntime_probe" ]
    pkg_deps = [ "libchrome-test" ]
  }
  executable("runtime_probe_probestatement_fuzzer") {
    configs += [ "//common-mk/common_fuzzer" ]
    sources = [ "runtime_probe_probestatement_fuzzer.cc" ]
    deps = [ ":libruntime_probe" ]
    pkg_deps = [ "libchrome-test" ]
  }
}
