# 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 = [ ":permission_broker" ]
  if (use.test) {
    deps += [ ":permission_broker_test" ]
  }
  if (use.fuzzer) {
    deps += [ ":port_tracker_fuzzer" ]
  }
}

pkg_config("target_defaults_deps") {
  pkg_deps = [
    "dbus-1",
    "libbrillo",
    "libchrome",
    "libpatchpanel-client",
    "libudev",
    "libusb-1.0",
  ]
  if (use.fuzzer) {
    pkg_deps += [ "protobuf" ]
  } else {
    pkg_deps += [ "protobuf-lite" ]
  }
}

config("target_defaults") {
  defines = [ "USE_CFM_ENABLED_DEVICE=${use.cfm_enabled_device}" ]
  configs = [ ":target_defaults_deps" ]
  libs = [ "system_api" ]
}

generate_dbus_adaptors("permission_broker_adaptors") {
  dbus_service_config = "dbus_bindings/dbus-service-config.json"
  dbus_adaptors_out_dir = "include/permission_broker/dbus_adaptors"
  sources = [ "dbus_bindings/org.chromium.PermissionBroker.xml" ]
}

static_library("libpermission_broker") {
  configs += [ ":target_defaults" ]
  deps = [ ":permission_broker_adaptors" ]
  libs = [ "policy" ]
  sources = [
    "allow_group_tty_device_rule.cc",
    "allow_hidraw_device_rule.cc",
    "allow_tty_device_rule.cc",
    "allow_usb_device_rule.cc",
    "deny_claimed_hidraw_device_rule.cc",
    "deny_claimed_usb_device_rule.cc",
    "deny_fwupdate_hidraw_device_rule.cc",
    "deny_group_tty_device_rule.cc",
    "deny_uninitialized_device_rule.cc",
    "deny_unsafe_hidraw_device_rule.cc",
    "deny_usb_device_class_rule.cc",
    "deny_usb_vendor_id_rule.cc",
    "hidraw_subsystem_udev_rule.cc",
    "libusb_wrapper.cc",
    "permission_broker.cc",
    "port_tracker.cc",
    "rule.cc",
    "rule_engine.cc",
    "tty_subsystem_udev_rule.cc",
    "udev_scopers.cc",
    "usb_control.cc",
    "usb_driver_tracker.cc",
    "usb_subsystem_udev_rule.cc",
  ]
}

executable("permission_broker") {
  configs += [ ":target_defaults" ]
  deps = [ ":libpermission_broker" ]
  sources = [ "permission_broker_main.cc" ]
}

if (use.test) {
  pkg_config("permission_broker_test_config") {
    pkg_deps = [
      "libbrillo-test",
      "libchrome-test",
    ]
  }
  executable("permission_broker_test") {
    configs += [
      "//common-mk:test",
      ":permission_broker_test_config",
      ":target_defaults",
    ]
    deps = [
      ":libpermission_broker",
      "../common-mk/testrunner:testrunner",
    ]
    sources = [
      "allow_tty_device_rule_test.cc",
      "allow_usb_device_rule_test.cc",
      "deny_claimed_hidraw_device_rule_test.cc",
      "deny_claimed_usb_device_rule_test.cc",
      "deny_fwupdate_hidraw_device_rule_test.cc",
      "deny_unsafe_hidraw_device_rule_test.cc",
      "deny_usb_device_class_rule_test.cc",
      "deny_usb_vendor_id_rule_test.cc",
      "fake_libusb_wrapper.cc",
      "group_tty_device_rule_test.cc",
      "port_tracker_test.cc",
      "rule_engine_test.cc",
      "rule_test.cc",
      "usb_control_test.cc",
    ]
  }
}

# Fuzzer target.
if (use.fuzzer) {
  pkg_config("permission_broker_fuzzer_config") {
    pkg_deps = [ "libchrome-test" ]
  }
  executable("port_tracker_fuzzer") {
    configs += [
      "//common-mk/common_fuzzer:common_fuzzer",
      ":permission_broker_fuzzer_config",
      ":target_defaults",
    ]
    deps = [ ":libpermission_broker" ]
    sources = [ "port_tracker_fuzzer.cc" ]
  }
}
