blob: 428e44ac0a03ce402b3bee65b7d41fc5090ae991 [file] [log] [blame]
# 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",
])
}
}