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

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

  # NOSORT
  pkg_deps = [
    "libbrillo",
    "libchrome",
    "libmetrics",

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

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

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

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

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

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

# Helper running as root after oobe_config_restore.
executable("rollback_finish_restore") {
  sources = [ "rollback_finish_restore_main.cc" ]
  configs += [ ":target_defaults" ]
  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") {
    sources = [
      "load_oobe_config_rollback_test.cc",
      "oobe_config_test.cc",
      "rollback_helper_test.cc",
      "rollback_openssl_encryption_test.cc",
    ]
    configs += [
      "//common-mk:test",
      ":target_defaults",
      ":test_config",
    ]
    deps = [
      ":liboobeconfig",
      ":librollback_helper",
      "//common-mk/testrunner",
    ]
  }
}
