cmake_pkg_config¶
在版本 3.31 中添加。
处理 pkg-config 格式的包文件。
概要¶
cmake_pkg_config(EXTRACT <package> [<version>] [...]) cmake_pkg_config(POPULATE <package> [<version>] [...]) cmake_pkg_config(IMPORT <package> [<version>] [...])
简介¶
此命令以原生方式从 pkg-config 格式的包文件中生成 CMake 变量和目标,无需调用甚至不需要 pkg-config 实现。<package> 要么是包文件的绝对路径,要么是要使用典型 pkg-config 搜索模式搜索的包名。可选的 <version> 字符串具有与 pkg-config 风格的版本说明符相同的格式和语义,唯一的例外是,如果未指定比较运算符,则假定为 =。
PkgConfig 目标¶
cmake_pkg_config 可能会在全局作用域中递归生成类目标名称,以便解析包的 IMPORT 或 POPULATE 命令。这些名称的形式为 @foreign_pkgcfg::[<prefix>_]<package>,并通过 INTERFACE_LINK_LIBRARIES 目标属性暴露给 IMPORT 生成的目标。
无法通过正常的基于目标的命令修改或寻址这些 pkg-config 原生目标。可以通过 POPULATE 命令对它们的生成进行有限控制,但修改通常应在相应的包文件中进行,而不是在 CMake 中下游进行。
Pkg-config 目标会在命令之间重用。一旦通过 POPULATE 或 IMPORT(但不是 EXTRACT)解析了给定的包名,这些命令对相应包名的所有未来请求都将解析到先前生成的 pkg-config 目标。
EXTRACT 始终执行完整的包名查找,以便允许搜索自定义依赖管理方案中同一包的多个安装。
通用选项¶
此命令有多个签名,并且某些选项在它们之间是通用的。它们是:
EXACT/QUIET/REQUIREDEXACT 选项要求版本字符串被精确匹配(包括空字符串,如果未提供版本),覆盖典型的 pkg-config 版本比较算法。这将忽略附加到版本字符串的任何比较运算符。
QUIET 选项禁用信息性消息,包括那些指示如果包不是 REQUIRED 则找不到包的消息。REQUIRED 选项会在找不到包时停止处理并显示错误消息。
STRICTNESS <mode>指定在解析和解析包文件内容时验证的严格程度。在提供的严格模式下,无效文件将导致命令失败。可能的模式是:
STRICT:密切模仿 FDO pkg-config 的行为。变量和关键字必须是唯一的。变量必须在使用前定义。Name、Description 和 Version 关键字必须存在。文件的整体结构必须有效且可解析。PERMISSIVE:密切模仿 pkgconf 实现的行为。重复的变量将被覆盖。重复的关键字将被追加。未定义的变量解析为空字符串。Name、Description 和 Version 关键字必须存在。文件的整体结构必须有效且可解析。BEST_EFFORT:对于重复或未初始化的变量和关键字,其行为与 PERMISSIVE 相同,但在任何情况下都不会失败。需要 BEST_EFFORT 的包文件将在所有其他主要实现下验证失败,应予以修复。
默认严格度为
PERMISSIVE。ENV_MODE指定在运行给定命令时将查询哪些环境变量。可能的模式是:
FDO:仅查询 freedesktop.orgpkg-config实现使用的原始PKG_CONFIG_*环境变量集。PKGCONF:查询pkgconf实现使用的更广泛的环境变量集。IGNORE:完全忽略环境变量的存在、缺失和值。在所有会查询环境变量的情况下,为了操作的目的,它被视为已定义,但值为字符串“空”。这不会修改当前环境。对于布尔环境变量,例如PKG_CONFIG_ALLOW_*,这意味着它们被评估为真。PKG_CONFIG_SYSROOT_PATH是一个小的例外。当使用ENV_MODE IGNORE时,默认情况下不会发生根路径前缀添加,并且pc_sysrootdir默认为/。
生成目标的子命令始终忽略标志过滤环境变量。默认环境模式为
PKGCONF。PC_LIBDIR <path>...覆盖包文件的默认搜索位置;也用于派生
pc_path包变量。当未提供此选项时,默认库目录是以下值中可用的第一个:
CMAKE_PKG_CONFIG_PC_LIB_DIRS环境变量
PKG_CONFIG_LIBDIR输出
pkg-config --variable pc_path pkg-config平台相关默认值
PC_PATH <path>...覆盖将添加到搜索路径的补充包文件目录;也用于派生
pc_path包变量。当未提供此选项时,默认路径是以下值中可用的第一个:
CMAKE_PKG_CONFIG_PC_PATH环境变量
PKG_CONFIG_PATH空列表
DISABLE_UNINSTALLED <bool>覆盖“未安装”包文件的搜索行为。这些是带有“-uninstalled”后缀的包文件,它们描述了直接从构建树集成的包。
通常,此类包文件的优先级高于“已安装”包。当
DISABLE_UNINSTALLED为 true 时,将禁用对“未安装”包的搜索。当未提供此选项时,默认搜索行为由以下值中可用的第一个决定:
CMAKE_PKG_CONFIG_DISABLE_UNINSTALLED如果定义了环境变量
PKG_CONFIG_DISABLE_UNINSTALLED,则禁用搜索,否则启用搜索。
PC_SYSROOT_DIR <path>覆盖将添加到
-I编译标志和-L库搜索位置指定的路径的根路径;也用于派生pc_sysrootdir包变量。当未提供此选项时,默认根路径由以下值中可用的第一个提供:
CMAKE_PKG_CONFIG_SYSROOT_DIR环境变量
PKG_CONFIG_SYSROOT_DIR如果没有可用的根路径,则不会将任何内容添加到 include 或库目录路径的前面,并且
pc_sysrootdir将被设置为/。
TOP_BUILD_DIR <path>覆盖用于派生
pc_top_builddir包变量的顶部构建目录路径。当未提供此选项时,默认顶部构建目录路径是以下值中可用的第一个:
CMAKE_PKG_CONFIG_TOP_BUILD_DIR环境变量
PKG_CONFIG_TOP_BUILD_DIR如果没有可用的顶部构建目录路径,则
pc_top_builddir包变量未设置。
PREFIX <name>指定前缀会创建一个独立的 pkg-config 目标集合,与先前填充的目标分开。这使得同一包的多个版本可以共存,例如来自不同 sysroot 的包。
默认前缀为空字符串。
BIND_PC_REQUIRES <<name>=<target>>...一对
<name>=<target>的列表,其中name是 pkg-config 文件中Requires列表中出现的包名,而target是一个 CMake 原生目标名称(不是 pkg-config 目标)。当包的
Requires列表中出现给定包名时,它将被用关联的 CMake 目标来满足。此行为适用于 pkg-config 图中尚未被填充的所有依赖项。
签名¶
- cmake_pkg_config(EXTRACT <package> [<version>] [...])¶
在版本 3.31 中添加。
将包的内容提取到变量中。
cmake_pkg_config(EXTRACT <package> [<version>] [REQUIRED] [EXACT] [QUIET] [SYSTEM_INCLUDE_DIRS <path>...] [SYSTEM_LIBRARY_DIRS <path>...] [ALLOW_SYSTEM_INCLUDES <bool>] [ALLOW_SYSTEM_LIBS <bool>] [STRICTNESS <mode>] [ENV_MODE <mode>] [PC_LIBDIR <path>...] [PC_PATH <path>...] [DISABLE_UNINSTALLED <bool>] [PC_SYSROOT_DIR <path>] [TOP_BUILD_DIR <path>])
以下变量将从包文件的内容中填充:
变量 |
类型 |
定义 |
|---|---|---|
|
字符串 |
关键字 |
|
字符串 |
关键字 |
|
字符串 |
关键字 |
|
列表 |
关键字 |
|
列表 |
关键字 |
|
列表 |
关键字 |
|
字符串 |
关键字 |
|
列表 |
来自 |
|
列表 |
来自 |
|
字符串 |
关键字 |
|
列表 |
来自 |
|
列表 |
来自 |
|
列表 |
来自 |
|
* |
|
SYSTEM_INCLUDE_DIRS用于在
CMAKE_PKG_CONFIG_CFLAGS和派生变量中处理 include 目录标志的“系统”目录。当未提供此选项时,默认目录由以下值中可用的第一个提供:
CMAKE_PKG_CONFIG_SYS_INCLUDE_DIRS环境变量
PKG_CONFIG_SYSTEM_INCLUDE_PATH输出
pkgconf --variable pc_system_includedirs pkg-config平台相关默认值
此外,当
ENV_MODE为PKGCONF时,如果CMAKE_PKG_CONFIG_PKGCONF_INCLUDES变量可用,则会将其连接到列表中。如果不可用,将查询并连接以下环境变量:CPATHC_INCLUDE_PATHCPLUS_INCLUDE_PATHOBJC_INCLUDE_PATHINCLUDE(仅限 Windows)
SYSTEM_LIBRARY_DIRS用于在
CMAKE_PKG_CONFIG_LIBS和派生变量中处理 library 目录标志的“系统”目录。当未提供此选项时,默认目录由以下值中可用的第一个提供:
CMAKE_PKG_CONFIG_SYS_LIB_DIRS环境变量
PKG_CONFIG_SYSTEM_LIBRARY_PATH输出
pkgconf --variable pc_system_libdirs pkg-config平台相关默认值
此外,当
ENV_MODE为PKGCONF时,如果CMAKE_PKG_CONFIG_PKGCONF_LIB_DIRS变量可用,则会将其连接到列表中。如果不可用,将查询并连接LIBRARY_PATH环境变量。ALLOW_SYSTEM_INCLUDES在
CMAKE_PKG_CONFIG_CFLAGS和派生变量中处理 include 目录标志时保留“系统”目录。当未提供此选项时,默认值由以下值中可用的第一个决定:
CMAKE_PKG_CONFIG_ALLOW_SYS_INCLUDES如果定义了环境变量
PKG_CONFIG_ALLOW_SYSTEM_CFLAGS,则保留标志,否则在标志处理过程中将其过滤掉。
ALLOW_SYSTEM_LIBS在
CMAKE_PKG_CONFIG_LIBS和派生变量中处理 library 目录标志时保留“系统”目录。当未提供此选项时,默认值由以下值中可用的第一个决定:
CMAKE_PKG_CONFIG_ALLOW_SYS_LIBS如果定义了环境变量
PKG_CONFIG_ALLOW_SYSTEM_LIBS,则保留标志,否则在标志处理过程中将其过滤掉。
- cmake_pkg_config(POPULATE <package> [<version>] [...])¶
在 4.1 版本中新增。
在 pkg-config 目标命名空间中填充一个包
cmake_pkg_config(POPULATE <package> [<version>] [REQUIRED] [EXACT] [QUIET] [PREFIX <prefix>] [BIND_PC_REQUIRES <<name>=<target>>...] [STRICTNESS <mode>] [ENV_MODE <mode>] [PC_LIBDIR <path>...] [PC_PATH <path>...] [DISABLE_UNINSTALLED <bool>] [PC_SYSROOT_DIR <path>] [TOP_BUILD_DIR <path>])
POPULATE 允许手动控制解析给定包的 Requires 列表,而无需导入到原生 CMake 目标。填充后,该包及其依赖项将用于解析所有未来的 POPULATE 和 IMPORT 命令。
将设置 PKGCONFIG_<package>_FOUND 变量,以指示是否找到了该包。
- cmake_pkg_config(IMPORT <package> [<version>] [...])¶
在 4.1 版本中新增。
将 pkg-config 目标导入为 CMake
IMPORTED目标cmake_pkg_config(IMPORT <package> [<version>] [REQUIRED] [EXACT] [QUIET] [NAME <name>] [PREFIX <prefix>] [BIND_PC_REQUIRES <<name>=<target>>...] [STRICTNESS <mode>] [ENV_MODE <mode>] [PC_LIBDIR <path>...] [PC_PATH <path>...] [DISABLE_UNINSTALLED <bool>] [PC_SYSROOT_DIR <path>] [TOP_BUILD_DIR <path>])
创建一个原生的 CMake IMPORTED 目标,该目标可以通过 target_link_libraries() 进行链接。此新目标默认命名为 PkgConfig::<package>。
将设置 PKGCONFIG_<package>_FOUND 变量,以指示是否找到了该包。
名称将创建的 CMake 目标名称覆盖为
PkgConfig::<name>。这 *不会* 影响PKGCONFIG_<package>_FOUND变量。