|  | # 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] | 
|  |  | 
|  | # We want the system include paths to use -isystem instead of -I to suppress | 
|  | # warnings in those headers. | 
|  | foreach(include, pkgresult[0]) { | 
|  | include_relativized = rebase_path(include, root_build_dir) | 
|  | cflags += [ "-isystem$include_relativized" ] | 
|  | } | 
|  |  | 
|  | if (!defined(invoker.ignore_libs) || !invoker.ignore_libs) { | 
|  | libs = pkgresult[2] | 
|  | lib_dirs = pkgresult[3] | 
|  | ldflags = pkgresult[4] | 
|  | } | 
|  |  | 
|  | forward_variables_from(invoker, | 
|  | [ | 
|  | "defines", | 
|  | "visibility", | 
|  | ]) | 
|  | } | 
|  | } |