# 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/generate-dbus-adaptors.gni")
import("//common-mk/pkg_config.gni")
import("//common-mk/proto_library.gni")

group("all") {
  deps = [
    ":capture_packets",
    ":cups_uri_helper",
    ":debugd",
    ":debugd-adaptors",
    ":debugd_dbus_utils",
    ":dev_features_chrome_remote_debugging",
    ":dev_features_password",
    ":dev_features_rootfs_verification",
    ":dev_features_ssh",
    ":dev_features_usb_boot",
    ":external-proto",
    ":generate_logs",
    ":icmp",
    ":libdebugd",
    ":netif",
    ":network_status",
    ":scheduler_configuration_helper",
    ":usb4_devinfo_helper",
  ]
  if (use.test) {
    deps += [ ":debugd_testrunner" ]
  }
}

pkg_config("target_defaults") {
  defines = [
    "USE_CELLULAR=${use.cellular}",
    "USE_IWLWIFI_DUMP=${use.iwlwifi_dump}",
    "USE_TPM=${use.tpm}",
    "USE_ARCVM=${use.arcvm}",
  ]

  pkg_deps = [
    "dbus-1",
    "libbrillo",
    "libchrome",
    "libcryptohome-client",
    "liblzma",
    "libminijail",
    "vboot_host",
  ]
}

proto_library("external-proto") {
  proto_in_dir = "${sysroot}/usr/include/chromeos/dbus/cryptohome"
  proto_out_dir = "include"
  sources = [
    "${proto_in_dir}/key.proto",
    "${proto_in_dir}/rpc.proto",
  ]
}

generate_dbus_adaptors("debugd-adaptors") {
  dbus_service_config = "dbus_bindings/dbus-service-config.json"
  dbus_adaptors_out_dir = "include/debugd/dbus_adaptors"
  sources = [ "dbus_bindings/org.chromium.debugd.xml" ]
}

pkg_config("libdebugd_dependent_config") {
  pkg_deps = [ "libshill-client" ]
}

static_library("libdebugd") {
  sources = [
    "src/battery_tool.cc",
    "src/constants.cc",
    "src/container_tool.cc",
    "src/crash_sender_tool.cc",
    "src/cros_healthd_tool.cc",
    "src/cups_tool.cc",
    "src/debug_logs_tool.cc",
    "src/debug_mode_tool.cc",
    "src/debugd_dbus_adaptor.cc",
    "src/dev_features_tool.cc",
    "src/dev_mode_no_owner_restriction.cc",
    "src/dmesg_tool.cc",
    "src/ec_typec_tool.cc",
    "src/ectool_util.cc",
    "src/example_tool.cc",
    "src/helper_utils.cc",
    "src/icmp_tool.cc",
    "src/ipaddrs_tool.cc",
    "src/log_tool.cc",
    "src/memory_tool.cc",
    "src/netif_tool.cc",
    "src/network_status_tool.cc",
    "src/oom_adj_tool.cc",
    "src/packet_capture_tool.cc",
    "src/perf_tool.cc",
    "src/ping_tool.cc",
    "src/probe_tool.cc",
    "src/process_with_id.cc",
    "src/process_with_output.cc",
    "src/route_tool.cc",
    "src/sandboxed_process.cc",
    "src/scheduler_configuration_tool.cc",
    "src/session_manager_proxy.cc",
    "src/shill_scripts_tool.cc",
    "src/simple_service_tool.cc",
    "src/storage_tool.cc",
    "src/subprocess_tool.cc",
    "src/swap_tool.cc",
    "src/sysrq_tool.cc",
    "src/systrace_tool.cc",
    "src/tracepath_tool.cc",
    "src/u2f_tool.cc",
    "src/variant_utils.cc",
    "src/verify_ro_tool.cc",
    "src/wifi_fw_dump_tool.cc",
    "src/wifi_power_tool.cc",
  ]
  configs += [ ":target_defaults" ]
  all_dependent_configs = [ ":libdebugd_dependent_config" ]
  deps = [
    ":debugd-adaptors",
    ":external-proto",
  ]
}

static_library("debugd_dbus_utils") {
  sources = [
    "src/helpers/shill_proxy.cc",
    "src/helpers/system_service_proxy.cc",
  ]
  configs += [ ":target_defaults" ]
}

pkg_config("debugd_config") {
  pkg_deps = [ "protobuf" ]
}

executable("debugd") {
  sources = [ "src/main.cc" ]
  configs += [
    ":debugd_config",
    ":target_defaults",
  ]
  deps = [ ":libdebugd" ]
}

executable("capture_packets") {
  sources = [ "src/helpers/capture_packets.cc" ]
  configs += [ ":target_defaults" ]
  libs = [ "pcap" ]
}

executable("cups_uri_helper") {
  sources = [
    "src/helpers/cups_uri_helper.cc",
    "src/helpers/cups_uri_helper_utils.cc",
  ]
  configs += [ ":target_defaults" ]
}

executable("dev_features_chrome_remote_debugging") {
  sources = [ "src/helpers/dev_features_chrome_remote_debugging.cc" ]
  configs += [ ":target_defaults" ]
  deps = [ ":libdebugd" ]
}

executable("dev_features_password") {
  sources = [
    "src/helpers/dev_features_password.cc",
    "src/helpers/dev_features_password_utils.cc",
  ]
  configs += [ ":target_defaults" ]
  deps = [ ":libdebugd" ]
}

executable("dev_features_rootfs_verification") {
  sources = [ "src/helpers/dev_features_rootfs_verification.cc" ]
  configs += [ ":target_defaults" ]
  libs = [ "rootdev" ]
  deps = [ ":libdebugd" ]
}

executable("dev_features_ssh") {
  sources = [ "src/helpers/dev_features_ssh.cc" ]
  configs += [ ":target_defaults" ]
  deps = [ ":libdebugd" ]
}

pkg_config("dev_features_usb_boot_config") {
  pkg_deps = [ "vboot_host" ]
}

executable("dev_features_usb_boot") {
  sources = [ "src/helpers/dev_features_usb_boot.cc" ]
  configs += [
    ":dev_features_usb_boot_config",
    ":target_defaults",
  ]
  deps = [ ":libdebugd" ]
}

executable("generate_logs") {
  sources = [ "tools/generate_logs.cc" ]
  configs += [ ":target_defaults" ]
}

executable("icmp") {
  sources = [ "src/helpers/icmp.cc" ]
  configs += [ ":target_defaults" ]
}

executable("netif") {
  sources = [ "src/helpers/netif.cc" ]
  configs += [ ":target_defaults" ]
  deps = [ ":debugd_dbus_utils" ]
}

executable("network_status") {
  sources = [ "src/helpers/network_status.cc" ]
  configs += [ ":target_defaults" ]
  deps = [ ":debugd_dbus_utils" ]
}

executable("scheduler_configuration_helper") {
  sources = [
    "src/helpers/scheduler_configuration_helper.cc",
    "src/helpers/scheduler_configuration_utils.cc",
  ]
  configs += [ ":target_defaults" ]
}

pkg_config("usb4_devinfo_helper_config") {
  pkg_deps = [ "re2" ]
}

executable("usb4_devinfo_helper") {
  sources = [ "src/helpers/usb4_devinfo_helper.cc" ]
  configs += [
    ":target_defaults",
    ":usb4_devinfo_helper_config",
  ]
}

if (use.test) {
  pkg_config("debugd_testrunner_config") {
    pkg_deps = [
      "libchrome-test",
      "protobuf",
    ]
  }

  executable("debugd_testrunner") {
    sources = [
      "src/crash_sender_tool_test.cc",
      "src/dev_mode_no_owner_restriction_test.cc",
      "src/helper_utils_test.cc",
      "src/helpers/cups_uri_helper_test.cc",
      "src/helpers/cups_uri_helper_utils.cc",
      "src/helpers/dev_features_password_utils.cc",
      "src/helpers/dev_features_password_utils_test.cc",
      "src/helpers/scheduler_configuration_utils.cc",
      "src/helpers/scheduler_configuration_utils_test.cc",
      "src/log_tool_test.cc",
      "src/process_with_id_test.cc",
      "src/storage_tool_test.cc",
      "src/subprocess_tool_test.cc",
    ]
    configs += [
      "//common-mk:test",
      ":debugd_testrunner_config",
      ":target_defaults",
    ]
    libs = [ "m" ]
    deps = [
      ":debugd_dbus_utils",
      ":libdebugd",
      "//common-mk/testrunner",
    ]
  }
}
