1# Copyright 2013 The Chromium Authors 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5import("//build/config/sysroot.gni") 6 7# Defines a config specifying the result of running pkg-config for the given 8# packages. Put the package names you want to query in the "packages" variable 9# inside the template invocation. 10# 11# You can also add defines via the "defines" variable. This can be useful to 12# add this to the config to pass defines that the library expects to get by 13# users of its headers. 14# 15# Example: 16# pkg_config("mything") { 17# packages = [ "mything1", "mything2" ] 18# defines = [ "ENABLE_AWESOME" ] 19# } 20# 21# You can also use "extra args" to filter out results (see pkg-config.py): 22# extra_args = [ "-v, "foo" ] 23# To ignore libs and ldflags (only cflags/defines will be set, which is useful 24# when doing manual dynamic linking), set: 25# ignore_libs = true 26 27declare_args() { 28 # A pkg-config wrapper to call instead of trying to find and call the right 29 # pkg-config directly. Wrappers like this are common in cross-compilation 30 # environments. 31 # Leaving it blank defaults to searching PATH for 'pkg-config' and relying on 32 # the sysroot mechanism to find the right .pc files. 33 pkg_config = "" 34 35 # A optional pkg-config wrapper to use for tools built on the host. 36 host_pkg_config = "" 37 38 # CrOS systemroots place pkgconfig files at <systemroot>/usr/share/pkgconfig 39 # and one of <systemroot>/usr/lib/pkgconfig or <systemroot>/usr/lib64/pkgconfig 40 # depending on whether the systemroot is for a 32 or 64 bit architecture. 41 # 42 # When build under GYP, CrOS board builds specify the 'system_libdir' variable 43 # as part of the GYP_DEFINES provided by the CrOS emerge build or simple 44 # chrome build scheme. This variable permits controlling this for GN builds 45 # in similar fashion by setting the `system_libdir` variable in the build's 46 # args.gn file to 'lib' or 'lib64' as appropriate for the target architecture. 47 system_libdir = "lib" 48} 49 50pkg_config_script = "//build/config/linux/pkg-config.py" 51 52# Define the args we pass to the pkg-config script for other build files that 53# need to invoke it manually. 54pkg_config_args = [] 55 56common_pkg_config_args = [] 57if (sysroot != "") { 58 # Pass the sysroot if we're using one (it requires the CPU arch also). 59 common_pkg_config_args += [ 60 "-s", 61 rebase_path(sysroot), 62 "-a", 63 current_cpu, 64 ] 65} 66 67if (pkg_config != "") { 68 pkg_config_args += [ 69 "-p", 70 pkg_config, 71 ] 72} 73 74# Only use the custom libdir when building with the target sysroot. 75if (target_sysroot != "" && sysroot == target_sysroot) { 76 pkg_config_args += [ 77 "--system_libdir", 78 system_libdir, 79 ] 80} 81 82if (host_pkg_config != "") { 83 host_pkg_config_args = [ 84 "-p", 85 host_pkg_config, 86 ] 87} else { 88 host_pkg_config_args = pkg_config_args 89} 90 91template("pkg_config") { 92 assert(defined(invoker.packages), 93 "Variable |packages| must be defined to be a list in pkg_config.") 94 config(target_name) { 95 if (host_toolchain == current_toolchain) { 96 args = common_pkg_config_args + host_pkg_config_args + invoker.packages 97 } else { 98 args = common_pkg_config_args + pkg_config_args + invoker.packages 99 } 100 if (defined(invoker.extra_args)) { 101 args += invoker.extra_args 102 } 103 104 pkgresult = exec_script(pkg_config_script, args, "json") 105 cflags = pkgresult[1] 106 107 foreach(include, pkgresult[0]) { 108 if (use_sysroot) { 109 # We want the system include paths to use -isystem instead of -I to 110 # suppress warnings in those headers. 111 include_relativized = rebase_path(include, root_build_dir) 112 cflags += [ "-isystem$include_relativized" ] 113 } else { 114 cflags += [ "-I$include" ] 115 } 116 } 117 118 if (!defined(invoker.ignore_libs) || !invoker.ignore_libs) { 119 libs = pkgresult[2] 120 lib_dirs = pkgresult[3] 121 } 122 123 forward_variables_from(invoker, 124 [ 125 "defines", 126 "visibility", 127 ]) 128 } 129} 130