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

pkg_config("target_defaults") {
  pkg_deps = [
    "libbrillo",
    "libchrome-${libbase_ver}",
    "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/ethernet_network.cc",
    "functions/generic_battery.cc",
    "functions/generic_network.cc",
    "functions/generic_storage.cc",
    "functions/mmc_storage.cc",
    "functions/nvme_storage.cc",
    "functions/sequence.cc",
    "functions/sysfs.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/file_utils.cc",
    "utils/type_utils.cc",
    "utils/value_utils.cc",
  ]
}

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

executable("runtime_probe_helper") {
  configs += [ ":target_defaults" ]
  sources = [
    "runtime_probe_helper.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-${libbase_ver}" ]
  }
  executable("runtime_probe_probestatement_fuzzer") {
    configs += [ "//common-mk/common_fuzzer" ]
    sources = [
      "runtime_probe_probestatement_fuzzer.cc",
    ]
    deps = [
      ":libruntime_probe",
    ]
    pkg_deps = [ "libchrome-test-${libbase_ver}" ]
  }
}
