# 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 = [
    ":l2tpipsec_vpn",
    ":libl2tpipsec_vpn",
  ]
  if (use.test) {
    deps += [ ":vpn_manager_test" ]
  }
  if (use.fuzzer) {
    deps += [ ":vpn_manager_service_manager_fuzzer" ]
  }
}

pkg_config("target_defaults") {
  pkg_deps = [
    "libbrillo",
    "libchrome",
    "openssl",
  ]
  defines = [
    "IPSEC_STARTER=\"/usr/libexec/ipsec/starter\"",
    "IPSEC_UPDOWN=\"/usr/libexec/l2tpipsec_vpn/pluto_updown\"",
    "L2TPD=\"/usr/sbin/xl2tpd\"",
    "PKCS11_LIB=\"${libdir}/libchaps.so\"",
  ]
}

static_library("libl2tpipsec_vpn") {
  configs += [ ":target_defaults" ]
  sources = [
    "daemon.cc",
    "ipsec_manager.cc",
    "l2tp_manager.cc",
    "service_manager.cc",
  ]
}

executable("l2tpipsec_vpn") {
  configs += [ ":target_defaults" ]
  sources = [ "l2tpipsec_vpn.cc" ]
  deps = [ ":libl2tpipsec_vpn" ]
}

if (use.test) {
  executable("vpn_manager_test") {
    configs += [
      # //common-mk:test should be at the top. crbug.com/887845
      # TODO(crbug.com/887845): Remove this note after library order issue is resolved.
      "//common-mk:test",
      ":target_defaults",
    ]
    sources = [
      "daemon_test.cc",
      "ipsec_manager_test.cc",
      "l2tp_manager_test.cc",
      "service_manager_test.cc",
      "testrunner.cc",
    ]
    deps = [ ":libl2tpipsec_vpn" ]
  }
}

if (use.fuzzer) {
  executable("vpn_manager_service_manager_fuzzer") {
    configs += [
      "//common-mk/common_fuzzer",
      ":target_defaults",
    ]
    sources = [
      "service_manager.cc",
      "service_manager_fuzzer.cc",
    ]
  }
}
