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

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