# 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-${libbase_ver}",
    "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",
    ]
  }
}
