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

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",
  ]
  defines = [ "USE_FACTORY_RUNTIME_PROBE=${use.factory_runtime_probe}" ]
}

static_library("libruntime_probe") {
  sources = [
    "component_category.cc",
    "field_converter.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_config_loader_impl.cc",
    "probe_function.cc",
    "probe_function_argument.cc",
    "probe_result_checker.cc",
    "probe_statement.cc",
    "system_property_impl.cc",
    "utils/edid.cc",
    "utils/file_utils.cc",
    "utils/input_device.cc",
    "utils/pipe_utils.cc",
    "utils/type_utils.cc",
    "utils/value_utils.cc",
  ]
  configs += [
    ":target_defaults",
    "system:libsystem_common_pkg_deps",
  ]
  deps = [ "system:libsystem" ]
}

executable("runtime_probe") {
  sources = [ "runtime_probe.cc" ]
  configs += [
    ":target_defaults",
    "system:libsystem_common_pkg_deps",
  ]
  deps = [ ":libruntime_probe" ]
  if (use.factory_runtime_probe) {
    output_name = "factory_runtime_probe"
  } else {
    sources += [ "daemon.cc" ]
  }
}

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

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

if (use.factory_runtime_probe) {
  action("factory_runtime_probe_installer") {
    script = "bundler.py"
    deps = [ ":runtime_probe" ]
    inputs = [ "$root_build_dir/factory_runtime_probe" ]
    outputs = [ "$root_build_dir/factory_runtime_probe_installer" ]
    args = [
             "--root-dir",
             getenv("SYSROOT"),
             "--target-path",
           ] + inputs +
           [
             "--bundle-description",
             "Installer of the standalone version of factory_runtime_probe.",
             "--output-path",
           ] + outputs
  }
}
