# Copyright (c) 2013 The Chromium 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("//build/config/sysroot.gni")

# Defines a config specifying the result of running pkg-config for the given
# packages. Put the package names you want to query in the "packages" variable
# inside the template invocation.
#
# You can also add defines via the "defines" variable. This can be useful to
# add this to the config to pass defines that the library expects to get by
# users of its headers.
#
# Example:
#   pkg_config("mything") {
#     packages = [ "mything1", "mything2" ]
#     defines = [ "ENABLE_AWESOME" ]
#   }
#
# You can also use "extra args" to filter out results (see pkg-config.py):
#   extra_args = [ "-v, "foo" ]
# To ignore libs and ldflags (only cflags/defines will be set, which is useful
# when doing manual dynamic linking), set:
#   ignore_libs = true

declare_args() {
  # A pkg-config wrapper to call instead of trying to find and call the right
  # pkg-config directly. Wrappers like this are common in cross-compilation
  # environments.
  # Leaving it blank defaults to searching PATH for 'pkg-config' and relying on
  # the sysroot mechanism to find the right .pc files.
  pkg_config = ""

  # A optional pkg-config wrapper to use for tools built on the host.
  host_pkg_config = ""

  # CrOS systemroots place pkgconfig files at <systemroot>/usr/share/pkgconfig
  # and one of <systemroot>/usr/lib/pkgconfig or <systemroot>/usr/lib64/pkgconfig
  # depending on whether the systemroot is for a 32 or 64 bit architecture.
  #
  # When build under GYP, CrOS board builds specify the 'system_libdir' variable
  # as part of the GYP_DEFINES provided by the CrOS emerge build or simple
  # chrome build scheme. This variable permits controlling this for GN builds
  # in similar fashion by setting the `system_libdir` variable in the build's
  # args.gn file to 'lib' or 'lib64' as appropriate for the target architecture.
  system_libdir = "lib"
}

pkg_config_script = "//build/config/linux/pkg-config.py"

# Define the args we pass to the pkg-config script for other build files that
# need to invoke it manually.
pkg_config_args = []

if (sysroot != "") {
  # Pass the sysroot if we're using one (it requires the CPU arch also).
  pkg_config_args += [
    "-s",
    rebase_path(sysroot),
    "-a",
    current_cpu,
  ]
}

if (pkg_config != "") {
  pkg_config_args += [
    "-p",
    pkg_config,
  ]
}

# Only use the custom libdir when building with the target sysroot.
if (target_sysroot != "" && sysroot == target_sysroot) {
  pkg_config_args += [
    "--system_libdir",
    system_libdir,
  ]
}

if (host_pkg_config != "") {
  host_pkg_config_args = [
    "-p",
    host_pkg_config,
  ]
} else {
  host_pkg_config_args = pkg_config_args
}

template("pkg_config") {
  assert(defined(invoker.packages),
         "Variable |packages| must be defined to be a list in pkg_config.")
  config(target_name) {
    if (host_toolchain == current_toolchain) {
      args = host_pkg_config_args + invoker.packages
    } else {
      args = pkg_config_args + invoker.packages
    }
    if (defined(invoker.extra_args)) {
      args += invoker.extra_args
    }

    pkgresult = exec_script(pkg_config_script, args, "value")
    cflags = pkgresult[1]

    foreach(include, pkgresult[0]) {
      if (use_sysroot) {
        # We want the system include paths to use -isystem instead of -I to
        # suppress warnings in those headers.
        include_relativized = rebase_path(include, root_build_dir)
        cflags += [ "-isystem$include_relativized" ]
      } else {
        cflags += [ "-I$include" ]
      }
    }

    if (!defined(invoker.ignore_libs) || !invoker.ignore_libs) {
      libs = pkgresult[2]
      lib_dirs = pkgresult[3]
    }

    forward_variables_from(invoker,
                           [
                             "defines",
                             "visibility",
                           ])
  }
}
