• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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