FindPkgConfig¶
A pkg-config module for CMake.
Finds the pkg-config executable and provides commands to use it in
CMake:
find_package(PkgConfig [<version>] [QUIET] [REQUIRED] [...])
pkg-config is a command-line program for configuring build dependency
information. Initially developed by FreeDesktop, it is also available in
several implementations, such as pkgconf, u-config, and similar. It reads
package data from the so-called PC metadata files (<module-name>.pc)
that may come installed with packages. This module is a wrapper around the
pkg-config command-line executable.
結果變數¶
該模組定義了以下變數:
PkgConfig_FOUND在 3.3 版被加入.
Boolean indicating whether the (requested version of)
pkg-configexecutable was found.PkgConfig_VERSION在 4.2 版被加入.
The version of
pkg-configthat was found.PKG_CONFIG_EXECUTABLEThe pathname of the
pkg-configprogram.PKG_CONFIG_ARGN在 3.22 版被加入.
A list of arguments to pass to
pkg-config.
Both PKG_CONFIG_EXECUTABLE and PKG_CONFIG_ARGN are initialized by the
module, but may be overridden by the user. See Hints for how these
variables are initialized.
命令¶
This module provides the following commands, if pkg-config is found:
- pkg_check_modules¶
Checks for all the given modules, setting a variety of result variables in the calling scope:
pkg_check_modules( <prefix> [QUIET] [REQUIRED] [NO_CMAKE_PATH] [NO_CMAKE_ENVIRONMENT_PATH] [IMPORTED_TARGET [GLOBAL]] <module-spec> [<module-spec>...] )
The arguments are:
<prefix>Prefix string prepended to result variables for the specified modules.
QUIETWhen this argument is given, no status messages will be printed.
REQUIREDWhen this argument is given, the command will fail with an error if any of the specified module(s) could not be found.
NO_CMAKE_PATH,NO_CMAKE_ENVIRONMENT_PATH在 3.3 版被加入.
The
CMAKE_PREFIX_PATH,CMAKE_FRAMEWORK_PATH, andCMAKE_APPBUNDLE_PATHcache and environment variables will be added to thepkg-configsearch path. TheNO_CMAKE_PATHandNO_CMAKE_ENVIRONMENT_PATHarguments disable this behavior for the cache variables and environment variables respectively. ThePKG_CONFIG_USE_CMAKE_PREFIX_PATHvariable set toFALSEdisables this behavior globally.IMPORTED_TARGET [GLOBAL]在 3.7 版被加入.
This argument will create an imported target named
PkgConfig::<prefix>that can be passed directly as an argument totarget_link_libraries(). It will encapsulate usage requirements for all specified modules<module-spec>...at once.GLOBAL在 3.13 版被加入.
This argument is used together with
IMPORTED_TARGETand will make the imported target available in global scope.
在 3.15 版被加入: Non-library linker options reported by
pkg-configare stored in theINTERFACE_LINK_OPTIONStarget property.在 3.18 版的變更: Include directories specified with
-isystemare stored in theINTERFACE_INCLUDE_DIRECTORIEStarget property. Previous versions of CMake left them in theINTERFACE_COMPILE_OPTIONSproperty.<module-spec>Each
<module-spec>can be either a bare module name (as defined in its PC metadata file name<module-name>.pc) or it can be a module name with a version constraint (operators=,<,>,<=and>=are supported). The following are examples for a module namedfoowith various constraints:foomatches any version.foo<2only matches versions before 2.foo>=3.1matches any version from 3.1 or later.foo=1.2.3requires that foo must be exactly version 1.2.3.
結果變數
The following variables may be set upon return. Two sets of values exist: One for the common case (
<XXX> = <prefix>) and another for the informationpkg-configprovides when called with the--staticoption (<XXX> = <prefix>_STATIC).<XXX>_FOUNDBoolean variable set to 1 if module(s) exist.
<XXX>_LIBRARIESA list of only the libraries (without the
-l).<XXX>_LINK_LIBRARIESThe libraries and their absolute paths.
<XXX>_LIBRARY_DIRSThe paths of the libraries (without the
-L).<XXX>_LDFLAGSAll required linker flags.
<XXX>_LDFLAGS_OTHERAll other linker flags.
<XXX>_INCLUDE_DIRSThe
-Ipreprocessor flags (without the-I).<XXX>_CFLAGSAll required cflags.
<XXX>_CFLAGS_OTHERThe other compiler flags.
All but
<XXX>_FOUNDmay be a semicolon-separated list if the associated variable returned frompkg-confighas multiple values.在 3.18 版的變更: Include directories specified with
-isystemare stored in the<XXX>_INCLUDE_DIRSvariable. Previous versions of CMake left them in<XXX>_CFLAGS_OTHER.There are some special variables whose prefix depends on the number of
<module-spec>given. When there is only one<module-spec>,<YYY>will simply be<prefix>, but if two or more<module-spec>items are given,<YYY>will be<prefix>_<module-name>.<YYY>_VERSIONThe version of the module.
<YYY>_PREFIXThe prefix directory of the module.
<YYY>_INCLUDEDIRThe include directory of the module.
<YYY>_LIBDIRThe lib directory of the module.
在 3.8 版的變更: For any given
<prefix>,pkg_check_modules()can be called multiple times with different parameters. Previous versions of CMake cached and returned the first successful result.在 3.16 版的變更: If a full path to the found library can't be determined, but it's still visible to the linker, pass it through as
-l<name>. Previous versions of CMake failed in this case.
- pkg_search_module¶
Searches for the first successful match from one or more provided module specifications:
pkg_search_module( <prefix> [QUIET] [REQUIRED] [NO_CMAKE_PATH] [NO_CMAKE_ENVIRONMENT_PATH] [IMPORTED_TARGET [GLOBAL]] <module-spec> [<module-spec>...] )
The behavior and arguments of this command are the same as
pkg_check_modules(), except that rather than checking for all the specified modules, it searches for just the first successful match.This command can be used, for example, when some package is known to have possible multiple
<module-spec>on different platforms or versions for the same package.結果變數
This command defines the same variables as described above with addition to:
<prefix>_MODULE_NAME在 3.16 版被加入.
If a module is found, the
<prefix>_MODULE_NAMEvariable will contain the name of the matching module. This variable can be used if thepkg_get_variable()command needs to be called with the<module-name>argument that was found by thepkg_search_module().
- pkg_get_variable¶
在 3.4 版被加入.
Retrieves the value of a
pkg-configvariable and stores it in the result variable in the calling scope:pkg_get_variable( <result-var> <module-name> <var-name> [DEFINE_VARIABLES <key>=<value>...] )
The arguments are:
<result-var>Name of the result variable that will contain the value of
pkg-configvariable. Ifpkg-configreturns multiple values for the specified variable<var-name>,<result-var>will contain a semicolon-separated list.<module-name>Name of the module as defined in its PC metadata file name (
<module-name>.pc).<var-name>The
pkg-configvariable name from the PC metadata file<module-name>.pc.DEFINE_VARIABLES <key>=<value>...在 3.28 版被加入.
Specify key-value pairs to redefine variables affecting the variable retrieved with
pkg-config.
提示¶
This module accepts the following variables before calling
find_package(PkgConfig) to influence this module's behavior:
ENV{PKG_CONFIG_PATH}Environment variable that specifies additional paths in which
pkg-configwill search for its.pcfiles. Thepkg-configtool by default uses this variable, while CMake also provides more commonCMAKE_PREFIX_PATHvariable to specify additional paths where to look for packages and their.pcfiles.ENV{PKG_CONFIG}在 3.1 版被加入.
Environment variable that can be set to the path of the
pkg-configexecutable and can be used to initialize thePKG_CONFIG_EXECUTABLEvariable, if it has not yet been set.
PKG_CONFIG_EXECUTABLE
This cache variable can be set to the path of the
pkg-configexecutable.find_program()is called internally by the module with this variable.在 3.22 版的變更: If the
PKG_CONFIGenvironment variable is set, only the first argument is taken from it when using it as a hint.
PKG_CONFIG_ARGN
在 3.22 版被加入.
This cache variable can be set to a list of arguments to additionally pass to
pkg-configif needed. If not provided, it will be initialized from thePKG_CONFIGenvironment variable, if set. The first argument in that environment variable is assumed to be thepkg-configprogram, while all remaining arguments after that are used to initializePKG_CONFIG_ARGN. If no such environment variable is defined,PKG_CONFIG_ARGNis initialized to an empty string. The module does not update the variable once it has been set in the cache.
PKG_CONFIG_USE_CMAKE_PREFIX_PATH
在 3.1 版被加入.
Specifies whether
pkg_check_modules()andpkg_search_module()should add the paths in theCMAKE_PREFIX_PATH,CMAKE_FRAMEWORK_PATHandCMAKE_APPBUNDLE_PATHcache and environment variables to thepkg-configsearch path.If this variable is not set, this behavior is enabled by default if
CMAKE_MINIMUM_REQUIRED_VERSIONis 3.1 or later, disabled otherwise.
已棄用的變數¶
The following variables are provided for backward compatibility:
PKG_CONFIG_FOUND在 4.2 版之後被棄用: Use
PkgConfig_FOUND, which has the same value.Boolean indicating whether the (requested version of)
pkg-configexecutable was found.PKG_CONFIG_VERSION_STRING在 4.2 版之後被棄用: Use
PkgConfig_VERSION, which has the same value.The version of
pkg-configthat was found.
範例¶
Examples: Finding pkg-config¶
Finding pkg-config:
find_package(PkgConfig)
Finding pkg-config and making it required (if not found, processing stops
with an error message):
find_package(PkgConfig REQUIRED)
Finding pkg-config quietly without printing status message as commonly
used in find modules:
find_package(PkgConfig QUIET)
Examples: Using pkg_check_modules()¶
Checking for any version of glib2. If found, the output variable
GLIB2_VERSION will hold the actual version found:
find_package(PkgConfig QUIET)
if(PkgConfig_FOUND)
pkg_check_modules(GLIB2 glib-2.0)
endif()
The following example looks for at least version 2.10 of glib2. If found,
the output variable GLIB2_VERSION will hold the actual version found:
find_package(PkgConfig QUIET)
if(PkgConfig_FOUND)
pkg_check_modules(GLIB2 glib-2.0>=2.10)
endif()
The following example looks for both glib2-2.0 (at least version 2.10) and
any version of gtk2+-2.0. Only if both are found will FOO be considered
found. The FOO_glib-2.0_VERSION and FOO_gtk+-2.0_VERSION variables
will be set to their respective found module versions.
find_package(PkgConfig QUIET)
if(PkgConfig_FOUND)
pkg_check_modules(FOO glib-2.0>=2.10 gtk+-2.0)
endif()
The following example requires any version of xrender:
find_package(PkgConfig QUIET REQUIRED)
pkg_check_modules(XRENDER REQUIRED xrender)
Example output variables set by a successful call:
XRENDER_LIBRARIES=Xrender;X11
XRENDER_STATIC_LIBRARIES=Xrender;X11;pthread;Xau;Xdmcp
Example: Using pkg_search_module()¶
Searching for LibXml2 package, which might be provided with different
module specifications (libxml-2.0 or libxml2):
find_package(PkgConfig QUIET)
if(PkgConfig_FOUND)
pkg_search_module(BAR libxml-2.0 libxml2 libxml>=2)
endif()
Example: Creating Imported Target¶
In the following example an imported target is created from the module
specifications to use in the project directly without using a find module.
These imported targets can be used, for example, in cases, where package is
known to support pkg-config on all supported platforms:
find_package(PkgConfig QUIET REQUIRED)
pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk4>=4.14)
target_link_libraries(example PRIVATE PkgConfig::GTK)
Example: Using pkg_get_variable()¶
Retrieving the value of pkg-config variable girdir from the package
Gobject:
find_package(PkgConfig QUIET)
if(PkgConfig_FOUND)
pkg_get_variable(GI_GIRDIR gobject-introspection-1.0 girdir)
endif()
message(STATUS "${GI_GIRDIR}")
另請參見¶
The
cmake_pkg_config()command for a modern and more advanced way to work withpkg-configin CMake without requiringpkg-configexecutable to be installed.Find Modules for details how to write a find module.