# 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 = [
    ":imageloader",
    ":imageloader-adaptors",
    ":libimageloader_static",
    ":protos",
  ]
  if (use.test) {
    deps += [ ":run_tests" ]
  }
  if (use.fuzzer) {
    deps += [
      ":imageloader_helper_process_receiver_fuzzer",
      ":imageloader_manifest_fuzzer",
    ]
  }
}

pkg_config("target_defaults") {
  pkg_deps = [
    "devmapper",
    "libbrillo",
    "libchrome",
    "libcrypto",
    "libminijail",
    "vboot_host",
  ]

  if (use.fuzzer) {
    # Link against protobuf for fuzzers so we can use libprotobuf-mutator.
    pkg_deps += [ "protobuf" ]
  } else {
    pkg_deps += [ "protobuf-lite" ]
  }
}

proto_library("protos") {
  proto_in_dir = "."
  proto_out_dir = "include/imageloader"
  sources = [ "${proto_in_dir}/ipc.proto" ]
  if (use.fuzzer) {
    # Override optimize_for option in proto file.
    gen_cpp_mode = "speed"
  }
}

generate_dbus_adaptors("imageloader-adaptors") {
  dbus_adaptors_out_dir = "include/imageloader/dbus_adaptors"
  dbus_service_config = "dbus_adaptors/dbus-service-config.json"
  sources = [ "dbus_adaptors/org.chromium.ImageLoaderInterface.xml" ]
}

shared_library("libimageloader-manifest") {
  sources = [ "manifest.cc" ]
  configs += [ ":target_defaults" ]
}

static_library("libimageloader_static") {
  sources = [
    "component.cc",
    "dlc.cc",
    "global_context.cc",
    "helper_process_proxy.cc",
    "helper_process_receiver.cc",
    "imageloader.cc",
    "imageloader_impl.cc",
    "verity_mounter.cc",
    "verity_mounter_impl.cc",
  ]
  configs += [ ":target_defaults" ]
  deps = [
    ":imageloader-adaptors",
    ":libimageloader-manifest",
    ":protos",
  ]
}

pkg_config("imageloader_config") {
  pkg_deps = [ "libbrillo" ]
}

executable("imageloader") {
  sources = [ "imageloader_main.cc" ]
  configs += [
    ":target_defaults",
    ":imageloader_config",
  ]
  deps = [
    ":imageloader-adaptors",
    ":libimageloader_static",
  ]
}

if (use.test) {
  pkg_config("run_tests_config") {
    pkg_deps = [
      "libbrillo",
      "libcrypto",
    ]
  }

  executable("run_tests") {
    sources = [
      "component_test.cc",
      "dlc_test.cc",
      "global_context.cc",
      "imageloader.cc",
      "imageloader_test.cc",
      "manifest_test.cc",
      "test_utilities.cc",
      "verity_mounter_test.cc",
    ]
    configs += [
      "//common-mk:test",
      ":run_tests_config",
      ":target_defaults",
    ]
    deps = [
      ":libimageloader_static",
      "//common-mk/testrunner:testrunner",
    ]
  }
}

if (use.fuzzer) {
  pkg_config("run_fuzzer_config") {
    pkg_deps = [ "libprotobuf-mutator" ]
  }

  executable("imageloader_helper_process_receiver_fuzzer") {
    sources = [ "helper_process_receiver_fuzzer.cc" ]
    configs += [
      "//common-mk/common_fuzzer:common_fuzzer",
      ":run_fuzzer_config",
      ":target_defaults",
    ]
    deps = [ ":libimageloader_static" ]
  }

  executable("imageloader_manifest_fuzzer") {
    sources = [ "manifest_fuzzer.cc" ]
    configs += [
      "//common-mk/common_fuzzer",
      ":target_defaults",
    ]
    deps = [ ":libimageloader_static" ]
  }
}
