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

group("all") {
  deps = [
    ":anomaly_detector",
    ":crash_reporter",
    ":crash_sender",
    ":libcrash",
    ":libcrash_reporter",
  ]
  if (use.cheets) {
    deps += [ ":core_collector" ]
  }
  if (use.test) {
    deps += [
      ":anomaly_detector_test",
      ":crash_reporter_test",
    ]
  }
  if (use.fuzzer) {
    deps += [
      ":anomaly_detector_fuzzer",
      ":crash_sender_fuzzer",
    ]
  }
}

pkg_config("libcrash_config") {
  pkg_deps = [
    "libchrome-${libbase_ver}",
    "libsession_manager-client",
    "vboot_host",
    "zlib",
  ]
}

static_library("libcrash") {
  all_dependent_configs = [ ":libcrash_config" ]
  sources = [
    "paths.cc",
    "util.cc",
  ]
}

pkg_config("libcrash_reporter_config") {
  pkg_deps = [
    "libbrillo-${libbase_ver}",
    "libchrome-${libbase_ver}",
    "libdebugd-client",
    "libpcrecpp",
    "libsession_manager-client",
  ]
}

static_library("libcrash_reporter") {
  all_dependent_configs = [ ":libcrash_reporter_config" ]
  sources = [
    "arc_service_failure_collector.cc",
    "bert_collector.cc",
    "chrome_collector.cc",
    "crash_collector.cc",
    "crash_reporter_failure_collector.cc",
    "early_crash_meta_collector.cc",
    "ec_collector.cc",
    "generic_failure_collector.cc",
    "kernel_collector.cc",
    "kernel_warning_collector.cc",
    "selinux_violation_collector.cc",
    "service_failure_collector.cc",
    "udev_collector.cc",
    "unclean_shutdown_collector.cc",
    "user_collector.cc",
    "user_collector_base.cc",
  ]
  defines = [ "USE_DIRENCRYPTION=${use.direncryption}" ]

  if (use.cheets) {
    sources += [
      "arc_collector.cc",
      "arc_util.cc",
    ]
  }

  if (use.direncryption) {
    libs = [ "keyutils" ]
  }
}

pkg_config("crash_reporter_config") {
  pkg_deps = [
    "dbus-1",
    "libmetrics-${libbase_ver}",
    "libminijail",
  ]
}

executable("crash_reporter") {
  configs += [ ":crash_reporter_config" ]
  sources = [
    "crash_reporter.cc",
  ]
  defines = [ "USE_CHEETS=${use.cheets}" ]
  deps = [
    ":libcrash",
    ":libcrash_reporter",
  ]
}

pkg_config("libcrash_sender_config") {
  pkg_deps = [
    "libbrillo-${libbase_ver}",
    "libchrome-${libbase_ver}",
    "libmetrics-${libbase_ver}",
    "libminijail",
    "libsession_manager-client",
    "libshill-client",
  ]
  if (use.fuzzer) {
    pkg_deps += [ "protobuf" ]
  } else {
    pkg_deps += [ "protobuf-lite" ]
  }
}

proto_library("crash_sender_proto") {
  proto_in_dir = "./proto"
  proto_out_dir = "include/crash-reporter"
  sources = [
    "${proto_in_dir}/crash_sender.proto",
  ]
}

static_library("libcrash_sender") {
  all_dependent_configs = [ ":libcrash_sender_config" ]
  sources = [
    "crash_sender_util.cc",
  ]
  defines = [ "USE_CHROMELESS_TTY=${use.chromeless_tty}" ]
  deps = [
    ":crash_sender_proto",
  ]
}

executable("crash_sender") {
  sources = [
    "crash_sender.cc",
  ]
  deps = [
    ":libcrash",
    ":libcrash_sender",
  ]
}

pkg_config("anomaly_detector_config") {
  # Laikitu uses systemd, while the rest of Chrome OS uses only the journald
  # part of it, which has a different pkg-config name, but the same library.
  libs = [ "systemd" ]
  pkg_deps = [
    "libbrillo-${libbase_ver}",
    "libchrome-${libbase_ver}",
    "libmetrics-${libbase_ver}",
    "re2",

    # 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",
  ]
  if (use.fuzzer) {
    pkg_deps += [ "protobuf" ]
  } else {
    pkg_deps += [ "protobuf-lite" ]
  }
}

executable("anomaly_detector") {
  configs += [ ":anomaly_detector_config" ]
  sources = [
    "anomaly_detector.cc",
    "anomaly_detector_main.cc",
  ]
  deps = [
    ":libcrash",
  ]
  libs = [
    "system_api-metrics_event-protos",
    "system_api-anomaly_detector-protos",
  ]
}

if (use.cheets) {
  pkg_config("core_collector_config") {
    pkg_deps = [ "breakpad-client" ]
  }

  executable("core_collector") {
    configs += [ ":core_collector_config" ]
    sources = [
      "core-collector/core_collector.cc",
      "core-collector/coredump_writer.cc",
      "core-collector/coredump_writer.h",
    ]

    # This condition matches the "use_i686" helper in the "cros-i686"
    # eclass. The "amd64" check allows the "cros_i686" USE flag to be
    # enabled for an overlay inherited by non-x86 boards.
    if (use.cros_i686 && use.amd64) {
      configs -= [ "//common-mk:pie" ]
    }
  }
}

if (use.test || use.fuzzer) {
  pkg_config("crash_reporter_test_config") {
    pkg_deps = [
      "libchrome-test-${libbase_ver}",
      "libmetrics-${libbase_ver}",
      "libsession_manager-client-test",
      "libshill-client-test",
      "libdebugd-client-test",
    ]
  }

  static_library("libcrash_test_util") {
    all_dependent_configs = [
      ":crash_reporter_test_config",
      ":libcrash_config",
    ]
    configs += [
      "//common-mk:test",
      ":libcrash_reporter_config",
    ]
    sources = [
      "test_util.cc",
    ]
  }
}

if (use.test) {
  pkg_config("test_helper_config") {
    pkg_deps = [
      "libbrillo-${libbase_ver}",
      "libchrome-${libbase_ver}",
      "libchrome-test-${libbase_ver}",
    ]
  }

  executable("lock_file_tester") {
    configs += [
      "//common-mk:test",
      ":test_helper_config",
    ]
    sources = [
      "lock_file_tester.cc",
    ]
  }

  executable("hold_lock_file") {
    configs += [
      "//common-mk:test",
      ":test_helper_config",
    ]
    sources = [
      "hold_lock_file.cc",
    ]
  }

  executable("crash_reporter_test") {
    configs += [
      "//common-mk:test",
      ":crash_reporter_test_config",
    ]
    sources = [
      "arc_service_failure_collector_test.cc",
      "bert_collector_test.cc",
      "chrome_collector_test.cc",
      "crash_collector_test.cc",
      "crash_collector_test.h",
      "crash_reporter_failure_collector_test.cc",
      "crash_reporter_logs_test.cc",
      "crash_sender_util_test.cc",
      "early_crash_meta_collector_test.cc",
      "ec_collector_test.cc",
      "generic_failure_collector_test.cc",
      "kernel_collector_test.cc",
      "kernel_collector_test.h",
      "kernel_warning_collector_test.cc",
      "paths_test.cc",
      "selinux_violation_collector_test.cc",
      "service_failure_collector_test.cc",
      "testrunner.cc",
      "udev_collector_test.cc",
      "unclean_shutdown_collector_test.cc",
      "user_collector_test.cc",
      "util_test.cc",
    ]
    defines = [ "USE_CHROMELESS_TTY=${use.chromeless_tty}" ]
    deps = [
      ":hold_lock_file",
      ":libcrash",
      ":libcrash_reporter",
      ":libcrash_sender",
      ":libcrash_test_util",
      ":lock_file_tester",
    ]

    if (use.cheets) {
      sources += [
        "arc_collector_test.cc",
        "arc_util_test.cc",
      ]
    }
  }

  executable("anomaly_detector_test") {
    configs += [
      "//common-mk:test",
      ":anomaly_detector_config",
      ":crash_reporter_test_config",
    ]
    sources = [
      "anomaly_detector.cc",
      "anomaly_detector_test.cc",
      "test_util.cc",
    ]
    deps = [
      ":libcrash",
      "//common-mk/testrunner:testrunner",
    ]
    libs = [ "system_api-anomaly_detector-protos" ]
  }
}

if (use.fuzzer) {
  executable("crash_sender_fuzzer") {
    configs += [ "//common-mk/common_fuzzer:common_fuzzer" ]
    deps = [
      ":libcrash",
      ":libcrash_sender",
      ":libcrash_test_util",
    ]
    sources = [
      "crash_sender_fuzzer.cc",
    ]
  }

  executable("anomaly_detector_fuzzer") {
    configs += [
      "//common-mk/common_fuzzer:common_fuzzer",
      ":anomaly_detector_config",
    ]
    deps = [
      ":libcrash_test_util",
    ]
    sources = [
      "anomaly_detector.cc",
      "anomaly_detector_fuzzer.cc",
    ]
    libs = [ "system_api-anomaly_detector-protos" ]
  }
}
