# 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",
    "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/pipe_utils.cc",
    "utils/type_utils.cc",
    "utils/value_utils.cc",
  ]
  if (use.factory_runtime_probe) {
    sources += [ "helper_invoker_direct_impl.cc" ]
  } else {
    sources += [
      "daemon.cc",
      "helper_invoker_debugd_impl.cc",
    ]
  }
  configs += [ ":target_defaults" ]
}

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

if (use.test) {
  executable("unittest_runner") {
    sources = [
      "functions/sequence_test.cc",
      "functions/sysfs_test.cc",
      "probe_config_loader_impl_test.cc",
      "probe_config_test.cc",
      "probe_result_checker_test.cc",
      "probe_statement_test.cc",
    ]
    configs += [
      "//common-mk:test",
      ":target_defaults",
    ]
    data = [
      "testdata/probe_config.json",
      "testdata/test.txt",
    ]
    deps = [
      ":libruntime_probe",
      "//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
  }
}
