# 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" ]
  }
}

pkg_config("target_defaults") {
  pkg_deps = [
    "libbrillo-${libbase_ver}",
    "libchrome-${libbase_ver}",
    "openssl",
  ]
  defines = [
    "IPSEC_STARTER=\"/usr/libexec/ipsec/starter\"",
    "IPSEC_WHACK=\"/usr/libexec/ipsec/whack\"",
    "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",
    ]
  }
}
