# 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 = [
    ":lorgnette",
    ":lorgnette_cli",
  ]
  if (use.test) {
    deps += [ ":lorgnette_unittest" ]
  }
}

pkg_config("target_defaults_deps") {
  pkg_deps = [
    "libbrillo",
    "libchrome-${libbase_ver}",
    "libmetrics-${libbase_ver}",
    "libpng",
    "protobuf-lite",
    "sane-backends",
    "system_api",
    "uuid",
  ]
}

config("target_defaults") {
  cflags_c = [ "-Wextra" ]
  cflags_cc = [
    "-Woverloaded-virtual",
    "-Wconditional-uninitialized",
  ]
  configs = [ ":target_defaults_deps" ]
}

generate_dbus_adaptors("lorgnette-adaptors") {
  sources = [ "dbus_bindings/org.chromium.lorgnette.Manager.xml" ]
  dbus_adaptors_out_dir = "include/lorgnette/dbus_adaptors"
  new_fd_bindings = true
}

generate_dbus_proxies("lorgnette-proxies") {
  sources = [ "dbus_bindings/org.chromium.lorgnette.Manager.xml" ]
  proxy_output_file = "include/lorgnette/dbus-proxies.h"
}

pkg_config("liblorgnette_config") {
  pkg_deps = [ "libpermission_broker-client" ]
}

static_library("liblorgnette") {
  all_dependent_configs = [ ":liblorgnette_config" ]
  configs += [ ":target_defaults" ]
  deps = [ ":lorgnette-adaptors" ]
  sources = [
    "daemon.cc",
    "enums.cc",
    "epson_probe.cc",
    "firewall_manager.cc",
    "manager.cc",
    "sane_client_fake.cc",
    "sane_client_impl.cc",
  ]
}

executable("lorgnette") {
  configs += [ ":target_defaults" ]
  deps = [ ":liblorgnette" ]
  sources = [ "main.cc" ]
}

executable("lorgnette_cli") {
  configs += [ ":target_defaults" ]
  deps = [ ":lorgnette-proxies" ]
  sources = [ "lorgnette_cli.cc" ]
}

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