# 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 = [
    ":clobber-state",
    ":cros_sysrq_init",
    ":ext_pci_drivers_allowlist_init",
    ":file_attrs_cleaner_tool",
    ":net_poll_tool",
    ":periodic_scheduler",
    ":static_node_tool",
    ":usermode-helper",
  ]
  if (use.test) {
    deps += [
      ":clobber_state_test",
      ":file_attrs_cleaner_test",
      ":periodic_scheduler_test",
      ":usermode-helper_test",
    ]
  }
}

pkg_config("target_defaults") {
  pkg_deps = [
    "libbrillo",
    "libchrome",
    "libmetrics",
    "vboot_host",
  ]
  libs = [
    "rootdev",
    "secure_erase_file",
  ]
}

static_library("libcrossystem") {
  configs += [ ":target_defaults" ]
  sources = [
    "crossystem.cc",
    "crossystem_fake.cc",
    "crossystem_impl.cc",
  ]
}

executable("clobber-state") {
  configs += [ ":target_defaults" ]
  sources = [
    "clobber_state.cc",
    "clobber_state_main.cc",
    "clobber_ui.cc",
  ]
  deps = [ ":libcrossystem" ]
}

static_library("file_attrs_cleaner_lib") {
  configs += [ ":target_defaults" ]
  sources = [ "file_attrs_cleaner_lib.cc" ]
}

executable("file_attrs_cleaner_tool") {
  configs += [ ":target_defaults" ]
  deps = [ ":file_attrs_cleaner_lib" ]
  sources = [ "file_attrs_cleaner_tool.cc" ]
}

executable("periodic_scheduler") {
  configs += [ ":target_defaults" ]
  sources = [
    "periodic_scheduler.cc",
    "periodic_scheduler_main.cc",
  ]
}

executable("cros_sysrq_init") {
  configs += [ ":target_defaults" ]
  sources = [ "cros_sysrq_init.cc" ]
  pkg_deps = [ "vboot_host" ]
}

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

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

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

static_library("usermode-helper_lib") {
  configs += [ ":target_defaults" ]
  sources = [ "usermode-helper_lib.cc" ]
}

executable("usermode-helper") {
  configs += [ ":target_defaults" ]
  deps = [ ":usermode-helper_lib" ]
  sources = [ "usermode-helper.cc" ]
}

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

  executable("clobber_state_test") {
    configs += [
      "//common-mk:test",
      ":target_defaults",
      ":test_config",
    ]
    sources = [
      "clobber_state.cc",
      "clobber_state_test.cc",
      "clobber_ui.cc",
      "clobber_ui_test.cc",
    ]
    deps = [
      ":libcrossystem",
      "//common-mk/testrunner",
    ]
  }

  executable("file_attrs_cleaner_test") {
    configs += [
      "//common-mk:test",
      ":target_defaults",
      ":test_config",
    ]
    sources = [ "file_attrs_cleaner_test.cc" ]
    deps = [
      ":file_attrs_cleaner_lib",
      "//common-mk/testrunner",
    ]
  }

  executable("periodic_scheduler_test") {
    configs += [
      "//common-mk:test",
      ":target_defaults",
      ":test_config",
    ]
    sources = [
      "periodic_scheduler.cc",
      "periodic_scheduler_test.cc",
    ]
    deps = [ "//common-mk/testrunner" ]
  }

  executable("usermode-helper_test") {
    configs += [
      "//common-mk:test",
      ":target_defaults",
      ":test_config",
    ]
    sources = [ "usermode-helper_test.cc" ]
    deps = [
      ":usermode-helper_lib",
      "//common-mk/testrunner",
    ]
  }
}
