# 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",
    ":liboobeconfig",
    ":libload_oobe_config_usb",
    ":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}",
    "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",
    ":target_defaults",
  ]
  sources = [
    "load_oobe_config_rollback.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 = [
    ":liboobeconfig",
    ":libload_oobe_config_usb",
    ":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_helper.cc",
    "rollback_constants.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",
      "rollback_helper_test.cc",
      "oobe_config_test.cc",
      "save_oobe_config_usb_test.cc",
      "usb_utils_test.cc",
    ]
    deps = [
      ":liboobeconfig",
      ":libload_oobe_config_usb",
      ":librollback_helper",
      ":libsave_oobe_config_usb",
      "//common-mk/testrunner",
    ]
  }
}
