# 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 = [
    ":protos",
    ":imageloader-adaptors",
    ":libimageloader_static",
    ":imageloader",
  ]
  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-${libbase_ver}",
    "libchrome-${libbase_ver}",
    "libcrypto",
    "libminijail",
    "protobuf-lite",
  ]
}

proto_library("protos") {
  proto_in_dir = "."
  proto_out_dir = "include/imageloader"
  sources = ["${proto_in_dir}/ipc.proto"]
}

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

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

if (use.test) {
  pkg_config("run_tests_config") {
    pkg_deps = [
      "libbrillo-${libbase_ver}",
      "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) {
  executable("imageloader_helper_process_receiver_fuzzer") {
    configs += [
      "//common-mk/common_fuzzer",
      ":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",
    ]
  }
}
