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

group("all") {
  deps = [
    ":libwebserv",
    ":libwebserv_common",
    ":webservd",
    ":webservd_common",
  ]
  if (use.test) {
    deps += [
      ":libwebserv_testrunner",
      ":webservd_testrunner",
    ]
  }
}

default_pkg_deps = [
  "libbrillo",
  "libchrome",
  "libpermission_broker-client",
]

pkg_config("target_defaults") {
  include_dirs = [ "." ]

  pkg_deps = default_pkg_deps
}

generate_dbus_adaptors("generate_webservd_adaptors") {
  # Not using dbus_service_config here deliberately in order not to
  # get tied to some constant service name, since it will be
  # provided by the consumer of libwebserv library.
  dbus_service_config = ""
  dbus_adaptors_out_dir = "include/dbus_bindings"
  sources = [
    "libwebserv/dbus_bindings/org.chromium.WebServer.RequestHandler.dbus-xml",
  ]
}

generate_dbus_proxies("generate_webservd_proxies") {
  dbus_service_config = "webservd/dbus_bindings/dbus-service-config.json"
  mock_output_file = "include/webservd/dbus-mocks.h"
  proxy_output_file = "include/webservd/dbus-proxies.h"
  sources = [
    "webservd/dbus_bindings/org.chromium.WebServer.ProtocolHandler.dbus-xml",
    "webservd/dbus_bindings/org.chromium.WebServer.Server.dbus-xml",
  ]
}

static_library("libwebserv_common") {
  sources = [
    "libwebserv/dbus_protocol_handler.cc",
    "libwebserv/dbus_response.cc",
    "libwebserv/dbus_server.cc",
    "libwebserv/protocol_handler.cc",
    "libwebserv/request.cc",
    "libwebserv/request_handler_callback.cc",
    "libwebserv/request_utils.cc",
    "libwebserv/response.cc",
    "libwebserv/server.cc",
  ]
  configs += [ ":target_defaults" ]

  # This static library is used in libwebserv shared library, which means
  # we must generate position-independent code for the files comprising
  # this library. Since this option is disabled by default for targets
  # other than 'shared_library', turn it on explicitly for this lib.
  # Override the default -fPIE flag (which is set for static_library
  # in //common-mk/BUILDCONFIG.gn) with -fPIC.
  configs -= [ "//common-mk:pie" ]
  configs += [ "//common-mk:pic" ]
  deps = [
    ":generate_webservd_adaptors",
    ":generate_webservd_proxies",
  ]
}

pkg_config("webservd_common_config") {
  pkg_deps = [
    "libmicrohttpd",
    "openssl",
  ]
}

generate_dbus_adaptors("generate_libwebserv_adaptors") {
  dbus_service_config = "webservd/dbus_bindings/dbus-service-config.json"
  dbus_adaptors_out_dir = "include/dbus_bindings"
  sources = [
    "webservd/dbus_bindings/org.chromium.WebServer.ProtocolHandler.dbus-xml",
    "webservd/dbus_bindings/org.chromium.WebServer.Server.dbus-xml",
  ]
}

generate_dbus_proxies("generate_libwebserv_proxies") {
  # Not using dbus_service_config here deliberately in order not to
  # get tied to some constant service name, since it will be
  # provided by the consumer of libwebserv library.
  dbus_service_config = ""
  mock_output_file = "include/libwebserv/dbus-mocks.h"
  proxy_output_file = "include/libwebserv/dbus-proxies.h"
  sources = [
    "libwebserv/dbus_bindings/org.chromium.WebServer.RequestHandler.dbus-xml",
  ]
}

static_library("webservd_common") {
  sources = [
    "webservd/config.cc",
    "webservd/dbus_protocol_handler.cc",
    "webservd/dbus_request_handler.cc",
    "webservd/error_codes.cc",
    "webservd/fake_encryptor.cc",
    "webservd/log_manager.cc",
    "webservd/permission_broker_firewall.cc",
    "webservd/protocol_handler.cc",
    "webservd/request.cc",
    "webservd/server.cc",
    "webservd/temp_file_manager.cc",
    "webservd/utils.cc",
  ]
  configs += [ ":target_defaults" ]
  all_dependent_configs = [ ":webservd_common_config" ]
  deps = [
    ":generate_libwebserv_adaptors",
    ":generate_libwebserv_proxies",
  ]
}

write_deps("write_libwebserv_deps") {
  pkg_deps = default_pkg_deps
  target = "libwebserv"
}

shared_library("libwebserv") {
  configs += [ ":target_defaults" ]
  deps = [
    ":libwebserv_common",
    ":write_libwebserv_deps",
  ]
}

pkg_config("webservd_config") {
  pkg_deps = [ "libminijail" ]
}

executable("webservd") {
  sources = [ "webservd/main.cc" ]
  configs += [
    ":target_defaults",
    ":webservd_config",
  ]
  deps = [ ":webservd_common" ]
}

if (use.test) {
  executable("libwebserv_testrunner") {
    configs += [
      "//common-mk:test",
      ":target_defaults",
    ]
    deps = [
      ":libwebserv_common",
      "//common-mk/testrunner",
    ]
  }

  executable("webservd_testrunner") {
    sources = [
      "webservd/config_test.cc",
      "webservd/log_manager_test.cc",
    ]
    configs += [
      "//common-mk:test",
      ":target_defaults",
    ]
    deps = [
      ":webservd_common",
      "//common-mk/testrunner",
    ]
  }
}
