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

  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") {
  configs += [ ":target_defaults" ]
  sources = [
    "manifest.cc",
    "manifest.h",
  ]
}

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

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

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

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

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

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

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

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