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