# 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 = [
    ":finish_oobe_auto_config",
    ":libload_oobe_config_usb",
    ":liboobeconfig",
    ":librollback_helper",
    ":libsave_oobe_config_usb",
    ":oobe_config_restore",
    ":oobe_config_save",
    ":rollback_finish_restore",
    ":rollback_prepare_save",
    ":store_usb_oobe_config",
  ]
  if (use.test) {
    deps += [ ":oobe_config_test" ]
  }
}

pkg_config("target_defaults") {
  defines = [ "USE_TPM2=${use.tpm2}" ]

  # NOSORT
  pkg_deps = [
    "libbrillo",
    "libchrome-${libbase_ver}",
    "libmetrics-${libbase_ver}",
    "libtpmcrypto",

    # system_api depends on protobuf (or protobuf-lite). It must
    # appear before protobuf or the linker flags won't be in the right
    # order.
    "system_api",
  ]
  if (use.fuzzer) {
    pkg_deps += [ "protobuf" ]
  } else {
    pkg_deps += [ "protobuf-lite" ]
  }
}

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

pkg_config("liboobeconfig_config") {
  pkg_deps = [
    "dbus-1",
    "libpower_manager-client",
  ]
}

# oobe_config library.
static_library("liboobeconfig") {
  configs += [ ":liboobeconfig_config" ]
  all_dependent_configs = [ ":target_defaults" ]
  sources = [
    "load_oobe_config_rollback.cc",
    "metrics.cc",
    "oobe_config.cc",
    "rollback_constants.cc",
  ]
  libs = [
    "policy",
    "tpmcrypto",
  ]
  deps = [ ":oobe_config_proto" ]
}

pkg_config("crypto") {
  pkg_deps = [
    "libcrypto",
    "libtpmcrypto",
  ]
}

static_library("libload_oobe_config_usb") {
  configs += [
    ":crypto",
    ":target_defaults",
  ]
  sources = [
    "load_oobe_config_usb.cc",
    "usb_utils.cc",
  ]
}

static_library("libsave_oobe_config_usb") {
  configs += [
    ":crypto",
    ":target_defaults",
  ]
  sources = [
    "save_oobe_config_usb.cc",
    "usb_utils.cc",
  ]
}

executable("finish_oobe_auto_config") {
  configs += [ ":target_defaults" ]
  sources = [ "save_oobe_config_usb_main.cc" ]
  deps = [ ":libsave_oobe_config_usb" ]
}

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

executable("oobe_config_save") {
  configs += [ ":target_defaults" ]
  sources = [ "oobe_config_save_main.cc" ]
  deps = [ ":liboobeconfig" ]
}

executable("oobe_config_restore") {
  configs += [
    ":crypto",
    ":target_defaults",
  ]
  sources = [
    "oobe_config_restore_main.cc",
    "oobe_config_restore_service.cc",
  ]
  deps = [
    ":libload_oobe_config_usb",
    ":liboobeconfig",
    ":oobe_config_restore_adaptors",
  ]
}

# rollback_helper library.
# Used by rollback_prepare_save and rollback_finish_restore.
static_library("librollback_helper") {
  configs += [ ":target_defaults" ]
  sources = [
    "rollback_constants.cc",
    "rollback_helper.cc",
  ]
}

# Helper running as root before oobe_config_save.
executable("rollback_prepare_save") {
  configs += [ ":target_defaults" ]
  sources = [ "rollback_prepare_save_main.cc" ]
  deps = [
    ":liboobeconfig",
    ":librollback_helper",
  ]
}

# Helper running as root after oobe_config_restore.
executable("rollback_finish_restore") {
  configs += [ ":target_defaults" ]
  sources = [ "rollback_finish_restore_main.cc" ]
  deps = [
    ":liboobeconfig",
    ":librollback_helper",
  ]
}

proto_library("oobe_config_proto") {
  proto_in_dir = "."
  proto_out_dir = "include/oobe_config"
  sources = [ "rollback_data.proto" ]
}

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

  executable("oobe_config_test") {
    configs += [
      "//common-mk:test",
      ":crypto",
      ":target_defaults",
      ":test_config",
    ]
    sources = [
      "load_oobe_config_rollback_test.cc",
      "load_oobe_config_usb_test.cc",
      "oobe_config_test.cc",
      "rollback_helper_test.cc",
      "save_oobe_config_usb_test.cc",
      "usb_utils_test.cc",
    ]
    deps = [
      ":libload_oobe_config_usb",
      ":liboobeconfig",
      ":librollback_helper",
      ":libsave_oobe_config_usb",
      "//common-mk/testrunner",
    ]
  }
}
