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