# Copyright 2013 The Chromium Authors # 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 /usr/share/pkgconfig # and one of /usr/lib/pkgconfig or /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 = [] common_pkg_config_args = [] if (sysroot != "") { # Pass the sysroot if we're using one (it requires the CPU arch also). common_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 = common_pkg_config_args + host_pkg_config_args + invoker.packages } else { args = common_pkg_config_args + pkg_config_args + invoker.packages } if (defined(invoker.extra_args)) { args += invoker.extra_args } pkgresult = exec_script(pkg_config_script, args, "json") cflags = pkgresult[1] foreach(include, pkgresult[0]) { # We want the system include paths to use -isystem instead of -I to # suppress warnings in those headers. if (use_sysroot) { include_relativized = rebase_path(include, root_build_dir) cflags += [ "-isystem$include_relativized" ] } else { cflags += [ "-isystem$include" ] } } if (!defined(invoker.ignore_libs) || !invoker.ignore_libs) { libs = pkgresult[2] lib_dirs = pkgresult[3] } forward_variables_from(invoker, [ "defines", "visibility", ]) } }