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