# 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")

group("all") {
  deps = [
    ":dlcservice",
    ":dlcservice_adaptors",
    ":dlcservice_util",
    ":libdlcservice",
    ":libdlcservice_utils",
  ]
  if (use.test) {
    deps += [ ":dlcservice_tests" ]
  }
  if (use.fuzzer) {
    deps += [
      ":dlcservice_boot_device_fuzzer",
      ":dlcservice_boot_slot_fuzzer",
    ]
  }
}

pkg_config("target_defaults") {
  pkg_deps = [
    "libchrome-${libbase_ver}",
    "libbrillo",
    "libimageloader-client",
    "libimageloader-manifest",
    "libupdate_engine-client",

    # system_api depends on protobuf (or protobuf-lite). It must appear
    # before protobuf here or the linker flags won't be in the right
    # order.
    "system_api",
  ]
  if (use.fuzzer) {
    pkg_deps += [ "protobuf" ]
  } else {
    pkg_deps += [ "protobuf-lite" ]
  }
}

pkg_config("dlcservice_util_config") {
  pkg_deps = [
    "libdlcservice-client",
    "libminijail",
  ]
}

generate_dbus_adaptors("dlcservice_adaptors") {
  dbus_service_config = "dbus_adaptors/dbus-service-config.json"
  dbus_adaptors_out_dir = "include/dlcservice/dbus_adaptors"
  sources = [
    "dbus_adaptors/org.chromium.DlcServiceInterface.xml",
  ]
}

# DLC utils related files.
static_library("libdlcservice_utils") {
  configs += [ ":target_defaults" ]
  sources = [
    "utils.cc",
  ]
}

# DLC service related files.
static_library("libdlcservice") {
  configs += [ ":target_defaults" ]
  libs = [ "rootdev" ]
  sources = [
    "boot/boot_device.cc",
    "boot/boot_slot.cc",
    "daemon.cc",
    "dbus_adaptors/dbus_adaptor.cc",
    "dlc.cc",
    "dlc_manager.cc",
    "dlc_service.cc",
    "error.cc",
    "prefs.cc",
    "system_state.cc",
  ]
  deps = [
    ":dlcservice_adaptors",
    ":libdlcservice_utils",
  ]
}

# For dlcservice:
executable("dlcservice") {
  configs += [ ":target_defaults" ]
  sources = [
    "main.cc",
  ]
  deps = [
    ":libdlcservice",
  ]
}

# For dlcservice_util:
executable("dlcservice_util") {
  configs += [
    ":target_defaults",
    ":dlcservice_util_config",
  ]
  sources = [
    "tools/dlc_service_util.cc",
  ]
  deps = [
    ":libdlcservice_utils",
  ]
}

# For test:
if (use.test) {
  pkg_config("dlcservice_tests_config") {
    pkg_deps = [
      "libchrome-test-${libbase_ver}",
      "libimageloader-client-test",
      "libupdate_engine-client-test",
    ]
  }

  executable("dlcservice_tests") {
    configs += [
      "//common-mk:test",
      ":dlcservice_tests_config",
      ":target_defaults",
    ]
    sources = [
      "boot/boot_device_test.cc",
      "boot/boot_slot_test.cc",
      "dbus_adaptors/dbus_adaptor_test.cc",
      "dlc_manager_test.cc",
      "dlc_service_test.cc",
      "dlc_test.cc",
      "prefs_test.cc",
      "system_state_test.cc",
      "test_utils.cc",
      "utils_test.cc",
    ]
    deps = [
      ":libdlcservice",
      "//common-mk/testrunner",
    ]
  }
}

# For fuzzer
if (use.fuzzer) {
  pkg_config("dlcservice_fuzzer_config") {
    pkg_deps = [ "libchrome-test-${libbase_ver}" ]
  }
  executable("dlcservice_boot_slot_fuzzer") {
    configs += [
      "//common-mk/common_fuzzer",
      ":dlcservice_fuzzer_config",
      ":target_defaults",
    ]
    sources = [
      "boot/boot_slot_fuzzer.cc",
    ]
    deps = [
      ":libdlcservice",
    ]
  }
  executable("dlcservice_boot_device_fuzzer") {
    configs += [
      "//common-mk/common_fuzzer",
      ":dlcservice_fuzzer_config",
      ":target_defaults",
    ]
    sources = [
      "boot/boot_device_fuzzer.cc",
    ]
    deps = [
      ":libdlcservice",
    ]
  }
}
