# 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/generate-dbus-proxies.gni")
import("//common-mk/pkg_config.gni")

group("all") {
  deps = [
    ":crosdns",
    ":crosdns_proxies",
    ":libcrosdns_static",
  ]
  if (use.test) {
    deps += [ ":run_tests" ]
  }
  if (use.fuzzer) {
    deps += [ ":hosts_modifier_fuzzer" ]
  }
}

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

generate_dbus_adaptors("crosdns_adaptors") {
  dbus_adaptors_out_dir = "include/crosdns/dbus_adaptors"
  dbus_service_config = "dbus_adaptors/dbus-service-config.json"
  new_fd_bindings = true
  sources = [
    "dbus_adaptors/org.chromium.CrosDns.xml",
  ]
}

generate_dbus_proxies("crosdns_proxies") {
  dbus_service_config = "dbus_adaptors/dbus-service-config.json"
  proxy_output_file = "include/crosdns/dbus_adaptors/dbus-proxies.h"
  new_fd_bindings = true
  sources = [
    "dbus_adaptors/org.chromium.CrosDns.xml",
  ]
}

static_library("libcrosdns_static") {
  configs += [ ":target_defaults" ]
  deps = [
    ":crosdns_adaptors",
  ]
  sources = [
    "crosdns_daemon.cc",
    "crosdns_daemon.h",
    "hosts_modifier.cc",
    "hosts_modifier.h",
  ]
}

executable("crosdns") {
  configs += [ ":target_defaults" ]
  deps = [
    ":crosdns_adaptors",
    ":libcrosdns_static",
  ]
  sources = [
    "crosdns_daemon.h",
    "main.cc",
  ]
}

if (use.test) {
  executable("run_tests") {
    configs += [
      "//common-mk:test",
      ":target_defaults",
    ]
    deps = [
      ":libcrosdns_static",
      "//common-mk/testrunner:testrunner",
    ]
    sources = [
      "hosts_modifier_test.cc",
    ]
  }
}

# Fuzzer target.
if (use.fuzzer) {
  pkg_config("hosts_modifier_fuzzer_config") {
    pkg_deps = [ "libchrome-test-${libbase_ver}" ]
  }

  executable("hosts_modifier_fuzzer") {
    configs += [
      "//common-mk/common_fuzzer",
      ":hosts_modifier_fuzzer_config",
      ":target_defaults",
    ]
    deps = [
      ":libcrosdns_static",
    ]
    sources = [
      "hosts_modifier_fuzzer.cc",
    ]
  }
}
