Home | History | Annotate | Download | only in linux
      1 # Copyright (c) 2013 The Chromium Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 import("//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 
     27 declare_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   # CrOS systemroots place pkgconfig files at <systemroot>/usr/share/pkgconfig
     36   # and one of <systemroot>/usr/lib/pkgconfig or <systemroot>/usr/lib64/pkgconfig
     37   # depending on whether the systemroot is for a 32 or 64 bit architecture.
     38   #
     39   # When build under GYP, CrOS board builds specify the 'system_libdir' variable
     40   # as part of the GYP_DEFINES provided by the CrOS emerge build or simple
     41   # chrome build scheme. This variable permits controlling this for GN builds
     42   # in similar fashion by setting the `system_libdir` variable in the build's
     43   # args.gn file to 'lib' or 'lib64' as appropriate for the target architecture.
     44   system_libdir = "lib"
     45 }
     46 
     47 pkg_config_script = "//build/config/linux/pkg-config.py"
     48 
     49 # Define the args we pass to the pkg-config script for other build files that
     50 # need to invoke it manually.
     51 if (sysroot != "") {
     52   # Pass the sysroot if we're using one (it requires the CPU arch also).
     53   pkg_config_args = [
     54     "-s",
     55     rebase_path(sysroot),
     56     "-a",
     57     current_cpu,
     58   ]
     59 } else if (pkg_config != "") {
     60   pkg_config_args = [
     61     "-p",
     62     pkg_config,
     63   ]
     64 } else {
     65   pkg_config_args = []
     66 }
     67 
     68 # Only use the custom libdir when building with the target sysroot.
     69 if (target_sysroot != "" && sysroot == target_sysroot) {
     70   pkg_config_args += [
     71     "--system_libdir",
     72     system_libdir,
     73   ]
     74 }
     75 
     76 template("pkg_config") {
     77   assert(defined(invoker.packages),
     78          "Variable |packages| must be defined to be a list in pkg_config.")
     79   config(target_name) {
     80     args = pkg_config_args + invoker.packages
     81     if (defined(invoker.extra_args)) {
     82       args += invoker.extra_args
     83     }
     84 
     85     pkgresult = exec_script(pkg_config_script, args, "value")
     86     include_dirs = pkgresult[0]
     87     cflags = pkgresult[1]
     88 
     89     if (!defined(invoker.ignore_libs) || !invoker.ignore_libs) {
     90       libs = pkgresult[2]
     91       lib_dirs = pkgresult[3]
     92       ldflags = pkgresult[4]
     93     }
     94 
     95     forward_variables_from(invoker,
     96                            [
     97                              "defines",
     98                              "visibility",
     99                            ])
    100   }
    101 }
    102