# 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")

group("all") {
  deps = [
    ":libp2p-client",
    ":libp2p-http-server",
    ":libp2p-server",
    ":libp2p-util",
    ":p2p-client",
    ":p2p-http-server",
    ":p2p-server",
  ]
  if (use.test) {
    deps += [
      ":libp2p-testutil",
      ":p2p-client-unittests",
      ":p2p-common-unittests",
      ":p2p-http-server-unittests",
      ":p2p-server-unittests",
    ]
  }
  if (use.fuzzer) {
    deps += [ ":p2p_http_server_fuzzer" ]
  }
}

pkg_config("target_defaults") {
  cflags_cc = [ "-fno-strict-aliasing" ]
  ldflags = [ "-Wl,--gc-sections" ]
  cflags = [
    "-ffunction-sections",
    "-Wextra",

    # Restore overridden flag by -Wextra.
    "-Wno-unused-parameter",

    # To allow { 0 } initializations.
    "-Wno-missing-field-initializers",
  ]

  pkg_deps = [
    "libbrillo-${libbase_ver}",
    "libchrome-${libbase_ver}",
  ]
}

pkg_config("libp2p-util_dependent_config") {
  pkg_deps = [
    "glib-2.0",
    "gobject-2.0",
  ]
}

# common utils.
static_library("libp2p-util") {
  configs += [ ":target_defaults" ]
  all_dependent_configs = [ ":libp2p-util_dependent_config" ]
  sources = [
    "common/clock.cc",
    "common/server_message.cc",
    "common/util.cc",
  ]
  libs = [ "rt" ]
}

pkg_config("libp2p-client_dependent_config") {
  pkg_deps = [
    "avahi-client",
    "avahi-glib",
    "glib-2.0",
    "gobject-2.0",
    "libmetrics-${libbase_ver}",
  ]
}

# p2p-client
static_library("libp2p-client") {
  configs += [ ":target_defaults" ]
  all_dependent_configs = [ ":libp2p-client_dependent_config" ]
  sources = [
    "client/peer_selector.cc",
    "client/service_finder.cc",
  ]
}

executable("p2p-client") {
  configs += [ ":target_defaults" ]
  sources = [
    "client/main.cc",
  ]
  deps = [
    ":libp2p-client",
    ":libp2p-util",
  ]
}

pkg_config("libp2p-server_dependent_config") {
  pkg_deps = [
    "avahi-client",
    "avahi-glib",
    "gio-2.0",
    "gio-unix-2.0",
    "glib-2.0",
    "gobject-2.0",
    "libmetrics-${libbase_ver}",
  ]
}

# p2p-server
static_library("libp2p-server") {
  configs += [ ":target_defaults" ]
  all_dependent_configs = [ ":libp2p-server_dependent_config" ]
  sources = [
    "server/file_watcher.cc",
    "server/http_server.cc",
    "server/peer_update_manager.cc",
    "server/service_publisher.cc",
  ]
}

executable("p2p-server") {
  configs += [ ":target_defaults" ]
  sources = [
    "server/main.cc",
  ]
  deps = [
    ":libp2p-server",
    ":libp2p-util",
  ]
}

pkg_config("libp2p-http-server_dependent_config") {
  pkg_deps = [
    "avahi-client",
    "avahi-glib",
    "glib-2.0",
    "libmetrics-${libbase_ver}",
  ]
}

# p2p-http-server
static_library("libp2p-http-server") {
  configs += [ ":target_defaults" ]
  all_dependent_configs = [ ":libp2p-http-server_dependent_config" ]
  sources = [
    "http_server/connection_delegate.cc",
    "http_server/server.cc",
  ]
  libs = [ "attr" ]
}

executable("p2p-http-server") {
  configs += [ ":target_defaults" ]
  sources = [
    "http_server/main.cc",
  ]
  deps = [
    ":libp2p-http-server",
    ":libp2p-util",
  ]
}

# Test only.
if (use.test) {
  pkg_config("libp2p-testutil_dependent_config") {
    pkg_deps = [
      "gobject-2.0",
      "libchrome-test-${libbase_ver}",
    ]
  }

  # common test-utils.
  static_library("libp2p-testutil") {
    configs += [
      "//common-mk:test",
      ":target_defaults",
    ]
    all_dependent_configs = [ ":libp2p-testutil_dependent_config" ]
    sources = [
      "common/testutil.cc",
    ]
  }

  # common tests
  executable("p2p-common-unittests") {
    configs += [
      # This config should be at the top.
      # TODO(crbug.com/887845): Remove this after library order issue is resolved.
      "//common-mk:test",
      ":target_defaults",
    ]
    sources = [
      "common/server_message_test.cc",
      "common/struct_serializer_test.cc",
      "common/testutil_test.cc",
    ]
    deps = [
      ":libp2p-testutil",
      ":libp2p-util",
      "//common-mk/testrunner",
    ]
  }

  # p2p-client tests
  executable("p2p-client-unittests") {
    configs += [
      # This config should be at the top.
      # TODO(crbug.com/887845): Remove this after library order issue is resolved.
      "//common-mk:test",
      ":target_defaults",
    ]
    sources = [
      "client/fake_service_finder.cc",
      "client/peer_selector_test.cc",
    ]
    deps = [
      ":libp2p-client",
      ":libp2p-testutil",
      ":libp2p-util",
      "//common-mk/testrunner",
    ]
  }

  # p2p-server tests
  executable("p2p-server-unittests") {
    configs += [
      # This config should be at the top.
      # TODO(crbug.com/887845): Remove this after library order issue is resolved.
      "//common-mk:test",
      ":target_defaults",
    ]
    sources = [
      "server/file_watcher_test.cc",
      "server/http_server_test.cc",
      "server/peer_update_manager_test.cc",
    ]
    deps = [
      ":libp2p-server",
      ":libp2p-testutil",
      ":libp2p-util",
      "//common-mk/testrunner",
    ]
  }

  # p2p-http-server tests
  executable("p2p-http-server-unittests") {
    configs += [
      # This config should be at the top.
      # TODO(crbug.com/887845): Remove this after library order issue is resolved.
      "//common-mk:test",
      ":target_defaults",
    ]
    sources = [
      "http_server/connection_delegate_test.cc",
      "http_server/server_test.cc",
    ]
    deps = [
      ":libp2p-http-server",
      ":libp2p-testutil",
      ":libp2p-util",
      "//common-mk/testrunner",
    ]
  }
}

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

  # p2p-http-server fuzzer
  executable("p2p_http_server_fuzzer") {
    configs += [
      "//common-mk/common_fuzzer",
      ":p2p_http_server_fuzzer_config",
    ]
    sources = [
      "fuzzers/p2p_http_server_fuzzer.cc",
    ]
    deps = [
      ":libp2p-server",
      ":libp2p-util",
    ]
  }
}
