# 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 = [
    ":cros_installer",
    ":cros_oobe_crypto",
    ":evwaitkey",
  ]
  if (use.mtd) {
    deps += [ ":nand_partition" ]
  }
  if (use.test) {
    deps += [ ":cros_installer_test" ]
  }
}

pkg_config("target_defaults") {
  pkg_deps = [
    "libbrillo",
    "libchrome-${libbase_ver}",
    "vboot_host",
  ]
  include_dirs = [ "${sysroot}/usr/include/verity" ]
  libs = [ "dm-bht" ]
}

static_library("libcros_installer") {
  configs += [ ":target_defaults" ]
  sources = [
    "cgpt_manager.cc",
    "chromeos_install_config.cc",
    "chromeos_legacy.cc",
    "chromeos_postinst.cc",
    "chromeos_setimage.cc",
    "chromeos_verity.cc",
    "inst_util.cc",
  ]

  if (use.enable_slow_boot_notify) {
    sources += [ "slow_boot_notify_enable.cc" ]
  } else {
    sources += [ "slow_boot_notify_stub.cc" ]
  }
}

pkg_config("cros_installer_config") {
  pkg_deps = [ "libchrome-${libbase_ver}" ]
}

executable("cros_installer") {
  configs += [
    ":cros_installer_config",
    ":target_defaults",
  ]
  deps = [ ":libcros_installer" ]
  sources = [ "cros_installer_main.cc" ]
}

executable("evwaitkey") {
  configs += [ ":target_defaults" ]
  sources = [ "util/evwaitkey.c" ]
}

pkg_config("cros_oobe_crypto_config") {
  pkg_deps = [ "libcrypto" ]
}

executable("cros_oobe_crypto") {
  configs += [
    ":cros_oobe_crypto_config",
    ":target_defaults",
  ]
  sources = [ "util/cros_oobe_crypto.c" ]
}

if (use.mtd) {
  pkg_config("nand_partition_config") {
    pkg_deps = [ "libchrome-${libbase_ver}" ]
  }
  executable("nand_partition") {
    configs += [
      ":nand_partition_config",
      ":target_defaults",
    ]
    deps = [ ":libcros_installer" ]
    sources = [
      "nand_partition.cc",
      "nand_partition_main.cc",
    ]
  }
}

if (use.test) {
  pkg_config("cros_installer_test_config") {
    pkg_deps = [
      "libchrome-${libbase_ver}",
      "libchrome-test-${libbase_ver}",
    ]
  }
  executable("cros_installer_test") {
    configs += [
      "//common-mk:test",
      ":cros_installer_test_config",
      ":target_defaults",
    ]
    deps = [
      ":libcros_installer",
      "//common-mk/testrunner:testrunner",
    ]
    sources = [
      "chromeos_install_config_test.cc",
      "chromeos_legacy_test.cc",
      "inst_util_test.cc",
    ]
    if (use.enable_slow_boot_notify) {
      sources += [ "slow_boot_notify_test.cc" ]
    }
  }
}
