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

generate_dbus_adaptors("permission_broker_adaptors") {
  dbus_service_config = "dbus_bindings/dbus-service-config.json"
  dbus_adaptors_out_dir = "include/permission_broker/dbus_adaptors"
  new_fd_bindings = true
  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-${libbase_ver}",
    ]
  }
  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-${libbase_ver}" ]
  }
  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" ]
  }
}
