# 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/pkg_config.gni")

group("all") {
  deps = [
    ":btdispatch",
    ":libcommon",
    ":libdispatcher",
  ]
  if (use.test) {
    deps += [ ":bluetooth_test" ]
  }
}

pkg_config("target_defaults") {
  pkg_deps = [
    "libcros_config",
    "dbus-1",
    "libbrillo",
    "libchrome-${libbase_ver}",

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

static_library("libcommon") {
  sources = [
    "common/dbus_client.cc",
    "common/dbus_daemon.cc",
    "common/exported_object_manager_wrapper.cc",
    "common/property.cc",
    "common/runtime_flags.cc",
    "common/util.cc",
  ]
  configs += [ ":target_defaults" ]
  defines =
      [ "USE_BLUETOOTH_SUSPEND_MANAGEMENT=${use.bluetooth_suspend_management}" ]
}

static_library("libdispatcher") {
  sources = [
    "dispatcher/bluez_interface_handler.cc",
    "dispatcher/catch_all_forwarder.cc",
    "dispatcher/client_manager.cc",
    "dispatcher/dbus_connection_factory.cc",
    "dispatcher/dbus_util.cc",
    "dispatcher/dispatcher.cc",
    "dispatcher/dispatcher_client.cc",
    "dispatcher/dispatcher_daemon.cc",
    "dispatcher/dispatcher_debug_manager.cc",
    "dispatcher/impersonation_object_manager_interface.cc",
    "dispatcher/object_manager_interface_multiplexer.cc",
    "dispatcher/service_watcher.cc",
    "dispatcher/suspend_manager.cc",
  ]
  configs += [ ":target_defaults" ]
}

executable("btdispatch") {
  sources = [
    "dispatcher/main.cc",
  ]
  configs += [ ":target_defaults" ]
  deps = [
    ":libcommon",
    ":libdispatcher",
  ]
}

if (use.test) {
  pkg_config("test_config") {
    pkg_deps = [ "libchrome-test-${libbase_ver}" ]
  }
  executable("bluetooth_test") {
    sources = [
      "common/dbus_client_test.cc",
      "common/exported_object_manager_wrapper_test.cc",
      "common/property_test.cc",
      "dispatcher/catch_all_forwarder_test.cc",
      "dispatcher/dispatcher_client_test.cc",
      "dispatcher/dispatcher_test.cc",
      "dispatcher/impersonation_object_manager_interface_test.cc",
      "dispatcher/object_manager_interface_multiplexer_test.cc",
      "dispatcher/suspend_manager_test.cc",
      "dispatcher/test_helper.cc",
    ]
    configs += [
      "//common-mk:test",
      ":target_defaults",
      ":test_config",
    ]
    deps = [
      ":libcommon",
      ":libdispatcher",
      "//common-mk/testrunner",
    ]
  }
}
