FindPkgConfig

用于 CMake 的 pkg-config 模块。

查找 pkg-config 可执行文件并添加 pkg_get_variable()pkg_check_modules()pkg_search_module() 命令。还将设置以下变量

PKG_CONFIG_FOUND

如果找到 pkg-config 可执行文件,则为 True。

PKG_CONFIG_VERSION_STRING

在 2.8.8 版本中添加。

已找到的 pkg-config 的版本。

PKG_CONFIG_EXECUTABLE

pkg-config 程序的路径名。

PKG_CONFIG_ARGN

在 3.22 版本中添加。

传给 pkg-config 的参数列表。

虽然 PKG_CONFIG_EXECUTABLEPKG_CONFIG_ARGN 都由模块初始化,但用户可以覆盖它们。请参见 影响行为的变量了解这些变量的初始化方式。

pkg_check_modules

检查所有指定的模块,在调用范围内设置各种结果变量。

pkg_check_modules(<prefix>
                  [REQUIRED] [QUIET]
                  [NO_CMAKE_PATH]
                  [NO_CMAKE_ENVIRONMENT_PATH]
                  [IMPORTED_TARGET [GLOBAL]]
                  <moduleSpec> [<moduleSpec>...])

如果有 REQUIRED 参数,如果找不到模块,命令将失败并显示错误。

如果有 QUIET 参数,将不打印状态消息。

在 3.1 版本中添加: 缓存变量和环境变量 CMAKE_PREFIX_PATHCMAKE_FRAMEWORK_PATHCMAKE_APPBUNDLE_PATH 将添加到 pkg-config 搜索路径中。参数 NO_CMAKE_PATHNO_CMAKE_ENVIRONMENT_PATH 为缓存变量和环境变量分别禁用此行为。将变量 PKG_CONFIG_USE_CMAKE_PREFIX_PATH 设置为 FALSE 将在全局范围内禁用此行为。

已在 3.6 版本中添加: IMPORTED_TARGET 参数将会创建一个名为 PkgConfig::<prefix> 的已导入目标,其可直接作为 target_link_libraries() 的参数传入。

已在 3.13 版本中添加: GLOBAL 参数将使已导入的目标在全局范围内可用。

已在 3.15 版本中添加: pkg-config 报告的非库链接器选项已存储在 INTERFACE_LINK_OPTIONS 目标属性中。

已在 3.18 版本中更改: 使用 -isystem 指定的包含目录存储在 INTERFACE_INCLUDE_DIRECTORIES 目标属性中。以前版本的 CMake 将其保留在 INTERFACE_COMPILE_OPTIONS 属性中。

每个 <moduleSpec> 可能为裸模块名称,也可能是带有版本约束的模块名称(支持运算符 =<><=>=)。以下是具有各种约束的名为 foo 的模块的一些示例

  • foo 匹配任何版本。

  • foo<2 仅匹配版本 2 之前的版本。

  • foo>=3.1 匹配从 3.1 或更高版本的任何版本。

  • foo=1.2.3 需要 foo 必须是 1.2.3 版本。

可在返回时设置以下变量。存在两组值:一组用于普通情况(<XXX> = <prefix>),另一组用于在使用 --static 选项调用 pkg-config 时提供的信息(<XXX> = <prefix>_STATIC)。

<XXX>_FOUND

如果模块存在,则设置为 1

<XXX>_LIBRARIES

仅包含库(不含 '-l')

<XXX>_LINK_LIBRARIES

包含库及其绝对路径

<XXX>_LIBRARY_DIRS

包含库的路径(不含 '-L')

<XXX>_LDFLAGS

包含所有必需的链接器标志

<XXX>_LDFLAGS_OTHER

包含所有其他链接器标志

<XXX>_INCLUDE_DIRS

包含预处理器标志 '-I'(不含 '-I')

<XXX>_CFLAGS

包含所有必需的 cflags

<XXX>_CFLAGS_OTHER

包含其他编译器标志

除了 <XXX>_FOUND 之外,如果 pkg-config 返回的多变量具有多个值,则可能是 ;-list

3.18 版中的更改: 使用 -isystem 指定的包含目录存储在 <XXX>_INCLUDE_DIRS 变量中。之前的 CMake 版本将它们保留在 <XXX>_CFLAGS_OTHER 中。

有一些特殊变量的前缀取决于给定 <moduleSpec> 的数量。当只有一个 <moduleSpec> 时,<YYY> 只会是 <prefix>,但如果给定两个或更多 <moduleSpec> 项,<YYY> 将是 <prefix>_<moduleName>

<YYY>_VERSION

模块版本

<YYY>_PREFIX

模块的前缀目录

<YYY>_INCLUDEDIR

模块的包含目录

<YYY>_LIBDIR

模块的 lib 目录

3.8 版中的更改: 对于任何给定的 <prefix>pkg_check_modules() 可以通过不同的参数多次调用。之前的 CMake 版本缓存并返回第一条成功的结果。

3.16 版中的更改: 如果无法确定已找到库的完整路径,但链接器仍然可以看到,则将其作为 -l<name> 传递。之前的 CMake 版本在这种情况下失败。

示例

pkg_check_modules (GLIB2 glib-2.0)

查找任意版本的 glib2。如果找到,输出变量 GLIB2_VERSION 将包含实际找到的版本。

pkg_check_modules (GLIB2 glib-2.0>=2.10)

查找至少为 2.10 版本的 glib2。如果找到,输出变量 GLIB2_VERSION 将包含实际找到的版本。

pkg_check_modules (FOO glib-2.0>=2.10 gtk+-2.0)

查找 glib2-2.0(至少为 2.10 版本)和任意版本的 gtk2+-2.0。只有在同时找到这两个库时才会将 FOO 视为已找到。FOO_glib-2.0_VERSIONFOO_gtk+-2.0_VERSION 变量将分别设置到它们各自找到的模块版本。

pkg_check_modules (XRENDER REQUIRED xrender)

需要任何版本的 xrender。成功调用设置的示例输出变量

XRENDER_LIBRARIES=Xrender;X11
XRENDER_STATIC_LIBRARIES=Xrender;X11;pthread;Xau;Xdmcp
pkg_search_module

此命令的行为与 pkg_check_modules() 相同,只不过它不会检查所有指定的模块,而是仅搜索第一个成功匹配项。

pkg_search_module(<prefix>
                  [REQUIRED] [QUIET]
                  [NO_CMAKE_PATH]
                  [NO_CMAKE_ENVIRONMENT_PATH]
                  [IMPORTED_TARGET [GLOBAL]]
                  <moduleSpec> [<moduleSpec>...])

在 3.16 版本中新增: 如果找到模块,那么 <prefix>_MODULE_NAME 变量将包含匹配模块的名称。如果您需要运行 pkg_get_variable(),便可以使用此变量。

示例

pkg_search_module (BAR libxml-2.0 libxml2 libxml>=2)
pkg_get_variable

在 3.4 版本中新增。

检索 pkg-config 变量 varName 的值,并将结果存储在调用范围内的结果变量 resultVar 中。

pkg_get_variable(<resultVar> <moduleName> <varName>
                 [DEFINE_VARIABLES <key>=<value>...])

如果 pkg-config 返回指定变量的多个值,则 resultVar 将包含 ;- 列表

选项

DEFINE_VARIABLES <key>=<value>...

在 3.28 版本中新增。

指定键值对,重新定义影响使用 pkg-config 检索的变量的变量。

例如

pkg_get_variable(GI_GIRDIR gobject-introspection-1.0 girdir)

影响行为的变量

PKG_CONFIG_EXECUTABLE

此缓存变量可以设置为 pkg-config 可执行文件的路径。模块使用此变量在内部调用 find_program()

在 3.1 版本中新增: 如果尚未设置 PKG_CONFIG_EXECUTABLE,可以使用 PKG_CONFIG 环境变量作为提示。

在 3.22 版本中更改: 如果设置 PKG_CONFIG 环境变量,仅当将其用作提示时才从其中获取第一个参数。

PKG_CONFIG_ARGN

在 3.22 版本中添加。

此缓存变量可以设置为参数列表,以便在需要时额外传递给 pkg-config。如果没有提供,则会从 PKG_CONFIG 环境变量(如果已设置)进行初始化。该环境变量中的第一个参数假定为 pkg-config 程序,而其后的所有剩余参数都用于初始化 PKG_CONFIG_ARGN。如果没有定义此类环境变量,则将 PKG_CONFIG_ARGN 初始化为空字符串。一旦在缓存中设置变量,模块便不会更新它。

PKG_CONFIG_USE_CMAKE_PREFIX_PATH

在 3.1 版本中新增。

指定 pkg_check_modules()pkg_search_module() 是否应将 CMAKE_PREFIX_PATHCMAKE_FRAMEWORK_PATHCMAKE_APPBUNDLE_PATH 缓存和环境变量中的路径添加到 pkg-config 搜索路径。

如果未设置此变量,如果 CMAKE_MINIMUM_REQUIRED_VERSION 为 3.1 或更高版本,则默认启用此行为,否则禁用。