# 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",
    ":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",
      ":utils_test",
    ]
  }
}

pkg_config("target_defaults") {
  defines = [
    "USE_LVM_STATEFUL_PARTITION=${use.lvm_stateful_partition}",
    "USE_ENCRYPTED_STATEFUL=${use.encrypted_stateful}",
  ]
  pkg_deps = [
    "libbrillo",
    "libchrome",
    "libcrypto",
    "libmetrics",
    "vboot_host",
  ]
  libs = [
    "rootdev",
    "secure_erase_file",
  ]
}

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

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

static_library("libclobber") {
  sources = [
    "clobber_state.cc",
    "clobber_ui.cc",
  ]
  configs += [ ":target_defaults" ]
  deps = [ ":utils" ]
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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