# 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")
import("//common-mk/proto_library.gni")

group("all") {
  deps = [ ":usb_bouncer" ]
  if (use.test) {
    deps += [ ":run_tests" ]
  }
  if (use.fuzzer) {
    deps += [ ":usb_bouncer_fuzzer" ]
  }
}

pkg_config("target_defaults") {
  pkg_deps = [
    "libbrillo",
    "libchrome",
    "libcrypto",
    "libmetrics",
    "libminijail",
    "libsession_manager-client",
    "libusbguard",
    "protobuf",
  ]

  # Needed to catch rule parsing errors reported by libusbguard.
  cflags_cc = [ "-fexceptions" ]
}

proto_library("usb_bouncer_protos") {
  proto_in_dir = "."
  proto_out_dir = "include/usb_bouncer"
  sources = [ "${proto_in_dir}/usb_bouncer.proto" ]
}

static_library("usb_bouncer_common") {
  sources = [
    "entry_manager.cc",
    "rule_db_storage.cc",
    "util.cc",
  ]
  configs += [ ":target_defaults" ]
  deps = [ ":usb_bouncer_protos" ]
}

pkg_config("usb_bouncer_pkg_deps") {
  pkg_deps = [ "libbrillo" ]
}

executable("usb_bouncer") {
  sources = [ "usb_bouncer.cc" ]
  configs += [
    ":target_defaults",
    ":usb_bouncer_pkg_deps",
  ]
  deps = [ ":usb_bouncer_common" ]
}

if (use.test) {
  pkg_config("run_tests_pkg_deps") {
    pkg_deps = [
      "libbrillo",
      "libcrypto",
    ]
  }
  executable("run_tests") {
    sources = [
      "entry_manager_test.cc",
      "entry_manager_test_util.cc",
      "util_test.cc",
    ]
    configs += [
      "//common-mk:test",
      ":run_tests_pkg_deps",
      ":target_defaults",
    ]
    deps = [
      ":usb_bouncer_common",
      "//common-mk/testrunner:testrunner",
    ]
  }
}

if (use.fuzzer) {
  pkg_config("usb_bouncer_fuzzer_pkg_deps") {
    pkg_deps = [ "libprotobuf-mutator" ]
  }

  executable("usb_bouncer_fuzzer") {
    sources = [
      "entry_manager_test_util.cc",
      "usb_bouncer_fuzzer.cc",
    ]
    configs += [
      "//common-mk/common_fuzzer:common_fuzzer",
      ":usb_bouncer_fuzzer_pkg_deps",
      ":target_defaults",
    ]
    deps = [ ":usb_bouncer_common" ]
  }
}
