find_package¶
注意
该 使用 依赖项 指南
提供了有关此一般主题的高级介绍。它更广泛地概述了 find_package()
命令在整体中的位置,包括它与 FetchContent
模块的关系。建议在继续下面的详细信息之前先阅读本指南。
查找一个包(通常由项目外部的东西提供),并加载其特定于包的详细信息。对该命令的调用也可以被 依赖项提供程序 拦截。
典型用法¶
对 find_package()
的大多数调用通常具有以下形式
find_package(<PackageName> [<version>] [REQUIRED] [COMPONENTS <components>...])
<PackageName>
是唯一必需的参数。<version>
通常被省略,如果项目在没有该包的情况下无法成功配置,则应给出 REQUIRED
。一些更复杂的包支持可以使用 COMPONENTS
关键字选择的组件,但大多数包都没有那么复杂。
以上是 基本签名 的简化形式。在可能的情况下,项目应该使用此形式查找包。这降低了复杂性并最大化了查找或提供包的方式。
了解 基本签名 对于 find_package()
的一般用法就足够了。打算提供配置包的项目维护者应该了解全局情况,如 完整签名 和此页面上所有后续部分所述。
搜索模式¶
该命令有几种模式可以搜索包
- 模块模式
在此模式下,CMake 搜索名为
Find<PackageName>.cmake
的文件,首先在CMAKE_MODULE_PATH
中列出的位置中查找,然后在 CMake 安装提供的 查找模块 中查找。如果找到该文件,则 CMake 会读取并处理该文件。它负责查找包、检查版本并生成任何需要的消息。一些查找模块对版本控制的支持有限或没有支持;请查看查找模块的文档。Find<PackageName>.cmake
文件通常不是由包本身提供的。相反,它通常由包外部的东西提供,例如操作系统、CMake 本身,甚至调用find_package()
命令的项目。由于是外部提供的,查找模块 往往本质上是启发式的,并且容易过时。它们通常搜索某些库、文件和其他包工件。模块模式仅受 基本命令签名 支持。
- 配置模式
在此模式下,CMake 搜索名为
<lowercasePackageName>-config.cmake
或<PackageName>Config.cmake
的文件。如果指定了版本详细信息,它还会查找<lowercasePackageName>-config-version.cmake
或<PackageName>ConfigVersion.cmake
(有关如何使用这些单独的版本文件的说明,请参见 配置模式版本选择)。在配置模式下,可以向命令提供一个名称列表以搜索为包名。CMake 搜索配置和版本文件的位置比模块模式复杂得多(请参见 配置模式搜索过程)。
配置和版本文件通常作为包的一部分安装,因此它们往往比查找模块更可靠。它们通常包含包内容的直接知识,因此在配置或版本文件本身中不需要搜索或启发式方法。
- FetchContent 重定向模式
版本 3.24 中新增: 对
find_package()
的调用可以在内部重定向到由FetchContent
模块提供的包。对于调用方,行为看起来类似于配置模式,只是旁路了搜索逻辑并且未使用组件信息。有关更多详细信息,请参见FetchContent_Declare()
和FetchContent_MakeAvailable()
。
当未重定向到由 FetchContent
提供的包时,命令参数确定使用模块模式还是配置模式。当使用 基本签名 时,命令首先在模块模式下搜索。如果找不到包,则搜索将回退到配置模式。用户可以将 CMAKE_FIND_PACKAGE_PREFER_CONFIG
变量设置为 true 以反转优先级并指示 CMake 首先使用配置模式搜索,然后再回退到模块模式。基本签名也可以使用 MODULE
关键字强制仅使用模块模式。如果使用 完整签名,则命令仅在配置模式下搜索。
基本签名¶
find_package(<PackageName> [version] [EXACT] [QUIET] [MODULE]
[REQUIRED] [[COMPONENTS] [components...]]
[OPTIONAL_COMPONENTS components...]
[REGISTRY_VIEW (64|32|64_32|32_64|HOST|TARGET|BOTH)]
[GLOBAL]
[NO_POLICY_SCOPE]
[BYPASS_PROVIDER])
基本签名受模块模式和配置模式支持。MODULE
关键字表示只能使用模块模式查找包,不能回退到配置模式。
无论使用哪种模式,都会设置一个 <PackageName>_FOUND
变量以指示是否找到包。当找到包时,可以通过其他变量和包本身记录的 导入目标 提供特定于包的信息。QUIET
选项禁用信息消息,包括指示找不到包的消息(如果它不是 REQUIRED
)。如果找不到包,REQUIRED
选项将停止处理并显示错误消息。
可以在 COMPONENTS
关键字之后列出特定于包的必需组件列表。如果无法满足任何这些组件,则整个包都被认为未找到。如果也存在 REQUIRED
选项,则将其视为致命错误,否则执行仍将继续。作为一种简写形式,如果存在 REQUIRED
选项,则可以省略 COMPONENTS
关键字,并且可以在 REQUIRED
之后直接列出必需的组件。
可以在 OPTIONAL_COMPONENTS
之后列出其他可选组件。如果无法满足这些组件,则只要满足所有必需组件,整个包仍可以被认为已找到。
可用组件集及其含义由目标包定义。正式地说,目标包如何解释给它的组件信息取决于目标包,但它应该遵循上述预期。对于未指定任何组件的调用,没有单一的预期行为,目标包应该明确定义在这种情况下会发生什么。常见的安排包括假设它应该查找所有组件、没有组件或可用组件的某些定义明确的子集。
版本 3.24 中新增: REGISTRY_VIEW
关键字指定要查询哪些注册表视图。此关键字仅在 Windows
平台上有意义,在所有其他平台上都会被忽略。正式地说,目标包如何解释给它的注册表视图信息取决于目标包。
版本 3.24 中新增: 指定 GLOBAL
关键字将所有导入的目标提升到导入项目中的全局范围。或者,可以通过设置 CMAKE_FIND_PACKAGE_TARGETS_GLOBAL
变量来启用此功能。
[version]
参数请求与找到的包兼容的版本。它可以以两种可能的格式指定。
单个版本,格式为
major[.minor[.patch[.tweak]]]
,其中每个组件都是一个数值。版本范围,格式为
versionMin...[<]versionMax
,其中versionMin
和versionMax
具有相同的格式,并且组件为整数的约束与单个版本相同。默认情况下,两个端点都包含在内。通过指定<
,将排除上端点。版本范围仅在 CMake 3.19 或更高版本中受支持。
EXACT
选项请求精确匹配版本。此选项与版本范围的指定不兼容。
如果在 find-module 内部递归调用时未给出 [version]
和/或组件列表,则相应的参数将自动从外部调用中转发(包括 EXACT
标志用于 [version]
)。版本支持目前仅在逐个包的基础上提供(请参阅下面的 版本选择 部分)。当指定版本范围但包仅设计为期望单个版本时,包将忽略范围的上端点,并且只考虑范围下端点的单个版本。
有关 NO_POLICY_SCOPE
选项的讨论,请参阅 cmake_policy()
命令文档。
3.24版本中新增: BYPASS_PROVIDER
关键字仅在 find_package()
由 依赖提供程序 调用时才允许使用。提供程序可以使用它直接调用内置的 find_package()
实现,并防止该调用被重新路由回自身。CMake 的未来版本可能会检测到从依赖提供程序以外的地方使用此关键字的尝试,并停止并产生致命错误。
完整签名¶
find_package(<PackageName> [version] [EXACT] [QUIET]
[REQUIRED] [[COMPONENTS] [components...]]
[OPTIONAL_COMPONENTS components...]
[CONFIG|NO_MODULE]
[GLOBAL]
[NO_POLICY_SCOPE]
[BYPASS_PROVIDER]
[NAMES name1 [name2 ...]]
[CONFIGS config1 [config2 ...]]
[HINTS path1 [path2 ... ]]
[PATHS path1 [path2 ... ]]
[REGISTRY_VIEW (64|32|64_32|32_64|HOST|TARGET|BOTH)]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[NO_DEFAULT_PATH]
[NO_PACKAGE_ROOT_PATH]
[NO_CMAKE_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_PACKAGE_REGISTRY]
[NO_CMAKE_BUILDS_PATH] # Deprecated; does nothing.
[NO_CMAKE_SYSTEM_PATH]
[NO_CMAKE_INSTALL_PREFIX]
[NO_CMAKE_SYSTEM_PACKAGE_REGISTRY]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH])
CONFIG
选项、同义词 NO_MODULE
选项或使用 基本签名 中未指定的选项都会强制使用纯配置模式。在纯配置模式下,命令跳过模块模式搜索,并立即进行配置模式搜索。
配置模式搜索尝试找到要查找的包提供的配置文件。将创建一个名为 <PackageName>_DIR
的缓存条目以保存包含该文件的目录。默认情况下,命令搜索名称为 <PackageName>
的包。如果给出了 NAMES
选项,则使用其后的名称代替 <PackageName>
。在确定是否将调用重定向到由 FetchContent
提供的包时,也会考虑这些名称。
命令搜索名为 <PackageName>Config.cmake
或 <lowercasePackageName>-config.cmake
的文件(对于每个指定的名称)。可以使用 CONFIGS
选项提供一组替换的可能的配置文件名称。下面指定了 配置模式搜索过程。找到后,将检查任何 版本约束,如果满足,则 CMake 将读取并处理配置文件。由于该文件由包提供,因此它已经知道包内容的位置。配置文件的完整路径存储在 cmake 变量 <PackageName>_CONFIG
中。
CMake 在搜索具有适当版本的包时已考虑的所有配置文件都存储在 <PackageName>_CONSIDERED_CONFIGS
变量中,关联的版本存储在 <PackageName>_CONSIDERED_VERSIONS
变量中。
如果找不到包配置文件,CMake 将生成一条描述问题的错误,除非指定了 QUIET
参数。如果指定了 REQUIRED
且未找到包,则会生成致命错误,配置步骤将停止执行。如果 <PackageName>_DIR
已设置为不包含配置文件的目录,则 CMake 将忽略它并从头开始搜索。
鼓励提供 CMake 包配置文件的包维护者对它们进行命名和安装,以便下面概述的 配置模式搜索过程 能够找到它们,而无需使用其他选项。
配置模式搜索过程¶
3.24版本中新增: 所有对 find_package()
的调用(即使在模块模式下)首先在 CMAKE_FIND_PACKAGE_REDIRECTS_DIR
目录中查找配置包文件。 FetchContent
模块,甚至项目本身,都可能将文件写入该位置以将 find_package()
调用重定向到项目已提供的內容。如果在该位置找不到配置包文件,则搜索将继续使用下面描述的逻辑。
CMake 构造了一组包可能的安装前缀。在每个前缀下,都会搜索几个目录以查找配置文件。下表显示了搜索的目录。每个条目都适用于遵循 Windows (W
)、UNIX (U
) 或 Apple (A
) 约定的安装树。
条目 |
约定 |
---|---|
|
W |
|
W |
|
W |
|
W |
|
W |
|
U |
|
U |
|
U |
|
W/U |
|
W/U |
|
W/U |
在支持 macOS FRAMEWORK
和 BUNDLE
的系统上,将搜索以下目录以查找包含配置文件的框架或应用程序包。
条目 |
约定 |
---|---|
|
A |
|
A |
|
A |
|
A |
|
A |
|
A |
在所有情况下, <name>
都被视为不区分大小写,并且对应于任何指定的名称(<PackageName>
或 NAMES
给出的名称)。
如果启用了至少一种编译语言,则可以根据编译器的目标体系结构搜索特定于体系结构的 lib/<arch>
和 lib*
目录,顺序如下:
lib/<arch>
如果设置了
CMAKE_LIBRARY_ARCHITECTURE
变量,则搜索。lib64
在 64 位平台上搜索(
CMAKE_SIZEOF_VOID_P
为 8)并且FIND_LIBRARY_USE_LIB64_PATHS
属性设置为TRUE
。lib32
在 32 位平台上搜索(
CMAKE_SIZEOF_VOID_P
为 4)并且FIND_LIBRARY_USE_LIB32_PATHS
属性设置为TRUE
。libx32
在使用 x32 ABI 的平台上搜索,如果
FIND_LIBRARY_USE_LIBX32_PATHS
属性设置为TRUE
。lib
始终搜索。
3.24版本中已更改: 在 Windows
平台上,可以通过 HINTS
和 PATHS
关键字指定的目录中包含注册表查询,使用 专用语法。此类规范在所有其他平台上将被忽略。
3.24版本中已添加: REGISTRY_VIEW
可用于管理作为 PATHS
和 HINTS
部分指定的 Windows
注册表查询。
指定必须查询哪些注册表视图。此选项仅在 Windows
平台上有意义,在其他平台上将被忽略。如果未指定,则当 CMP0134
策略为 NEW
时使用 TARGET
视图。有关策略为 OLD
时的默认视图,请参阅 CMP0134
。
64
查询 64 位注册表。在 32 位 Windows 上,它始终返回字符串
/REGISTRY-NOTFOUND
。32
查询 32 位注册表。
64_32
查询两个视图(
64
和32
)并为每个视图生成路径。32_64
查询两个视图(
32
和64
)并为每个视图生成路径。HOST
查询与主机架构匹配的注册表:在 64 位 Windows 上为
64
,在 32 位 Windows 上为32
。TARGET
查询与
CMAKE_SIZEOF_VOID_P
变量指定的架构匹配的注册表。如果未定义,则回退到HOST
视图。BOTH
查询两个视图(
32
和64
)。顺序取决于以下规则:如果CMAKE_SIZEOF_VOID_P
变量已定义,则根据此变量的内容使用以下视图8
:64_32
4
:32_64
如果
CMAKE_SIZEOF_VOID_P
变量未定义,则依赖于主机的架构64 位:
64_32
32 位:
32
如果指定了 PATH_SUFFIXES
,则会将后缀逐一附加到每个(W
)或(U
)目录条目。
此目录集旨在与在其安装树中提供配置文件的项目协同工作。上面标记为(W
)的目录旨在用于 Windows 上的安装,其中前缀可能指向应用程序安装目录的顶部。那些标记为(U
)的目录旨在用于 UNIX 平台上的安装,其中前缀由多个软件包共享。这仅仅是一种约定,因此所有(W
)和(U
)目录仍在所有平台上进行搜索。标记为(A
)的目录旨在用于 Apple 平台上的安装。CMAKE_FIND_FRAMEWORK
和 CMAKE_FIND_APPBUNDLE
变量确定首选项的顺序。
安装前缀集是使用以下步骤构建的。如果指定了 NO_DEFAULT_PATH
,则所有 NO_*
选项都将启用。
搜索当前正在查找的
<PackageName>
独有的前缀。请参阅策略CMP0074
。3.12版本中已添加。
具体来说,按顺序搜索以下变量指定的前缀
<PackageName>_ROOT
CMake 变量,其中<PackageName>
是保留大小写的软件包名称。<PACKAGENAME>_ROOT
CMake 变量,其中<PACKAGENAME>
是大写的软件包名称。请参阅策略CMP0144
。3.27版本中已添加。
<PackageName>_ROOT
环境变量,其中<PackageName>
是保留大小写的软件包名称。<PACKAGENAME>_ROOT
环境变量,其中<PACKAGENAME>
是大写的软件包名称。请参阅策略CMP0144
。3.27版本中已添加。
软件包根变量被维护为一个栈,因此如果从查找模块内部调用,则在当前软件包的路径之后也会搜索父查找模块的根路径。如果传递了
NO_PACKAGE_ROOT_PATH
或将CMAKE_FIND_USE_PACKAGE_ROOT_PATH
设置为FALSE
,则可以跳过此步骤。在 cmake 特定的缓存变量中指定的搜索路径。这些路径旨在与
-DVAR=VALUE
一起在命令行上使用。这些值被解释为 分号分隔的列表。如果传递了NO_CMAKE_PATH
或将CMAKE_FIND_USE_CMAKE_PATH
设置为FALSE
,则可以跳过此步骤在 cmake 特定的环境变量中指定的搜索路径。这些路径旨在设置在用户的 shell 配置中,因此使用主机的本机路径分隔符(在 Windows 上为
;
,在 UNIX 上为:
)。如果传递了NO_CMAKE_ENVIRONMENT_PATH
或将CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH
设置为FALSE
,则可以跳过此步骤<PackageName>_DIR
由
HINTS
选项指定的搜索路径。这些路径应由系统自省计算,例如由已找到的其他项目的路径提供的提示。硬编码的猜测应使用PATHS
选项指定。搜索标准系统环境变量。如果传递了
NO_SYSTEM_ENVIRONMENT_PATH
或将CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH
设置为FALSE
,则可以跳过此步骤。以/bin
或/sbin
结尾的路径条目会自动转换为其父目录。PATH
搜索存储在 CMake 用户包注册表中的路径。如果传递了
NO_CMAKE_PACKAGE_REGISTRY
或将变量CMAKE_FIND_USE_PACKAGE_REGISTRY
设置为FALSE
,或者将已弃用的变量CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY
设置为TRUE
,则可以跳过此步骤。有关用户包注册表的详细信息,请参阅
cmake-packages(7)
手册。搜索当前系统平台文件中定义的 cmake 变量。如果传递了
NO_CMAKE_INSTALL_PREFIX
或将CMAKE_FIND_USE_INSTALL_PREFIX
设置为FALSE
,则可以跳过CMAKE_INSTALL_PREFIX
和CMAKE_STAGING_PREFIX
的搜索。如果传递了NO_CMAKE_SYSTEM_PATH
或将CMAKE_FIND_USE_CMAKE_SYSTEM_PATH
设置为FALSE
,则可以跳过所有这些位置。这些变量包含的平台路径通常是包含已安装软件的位置。例如,基于 UNIX 的平台上的
/usr/local
。搜索存储在 CMake 系统包注册表中的路径。如果传递了
NO_CMAKE_SYSTEM_PACKAGE_REGISTRY
或将CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY
变量设置为FALSE
,或者将已弃用的变量CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY
设置为TRUE
,则可以跳过此步骤。有关系统包注册表的详细信息,请参阅
cmake-packages(7)
手册。搜索由
PATHS
选项指定的路径。这些通常是硬编码的猜测。
CMAKE_IGNORE_PATH
、CMAKE_IGNORE_PREFIX_PATH
、CMAKE_SYSTEM_IGNORE_PATH
和CMAKE_SYSTEM_IGNORE_PREFIX_PATH
变量还可以导致忽略上述某些位置。
路径按上述顺序搜索。找到的第一个可行的包配置文件将被使用,即使包的更新版本位于搜索路径列表的后面。
对于包含<name>*
的搜索路径,除非设置了CMAKE_FIND_PACKAGE_SORT_ORDER
变量,否则匹配路径之间的顺序是不确定的。此变量与CMAKE_FIND_PACKAGE_SORT_DIRECTION
变量一起确定 CMake 考虑包含<name>*
的单个搜索路径的匹配路径的顺序。例如,如果文件系统包含包配置文件
<prefix>/example-1.2/example-config.cmake
<prefix>/example-1.10/example-config.cmake
<prefix>/share/example-2.0/example-config.cmake
则find_package(example)
将找到example-1.2
还是example-1.10
是不确定的(假设两者都是可行的),但是find_package
*不会*找到example-2.0
,因为其他两个中的一个将首先被找到。
要控制find_package
搜索与通配符表达式匹配的目录的顺序,请使用CMAKE_FIND_PACKAGE_SORT_ORDER
和CMAKE_FIND_PACKAGE_SORT_DIRECTION
。例如,要使上述示例选择example-1.10
,可以设置
SET(CMAKE_FIND_PACKAGE_SORT_ORDER NATURAL)
SET(CMAKE_FIND_PACKAGE_SORT_DIRECTION DEC)
然后再调用find_package
。
版本 3.16 中新增: 添加了CMAKE_FIND_USE_<CATEGORY>
变量以全局禁用各种搜索位置。
CMake 变量CMAKE_FIND_ROOT_PATH
指定一个或多个目录,这些目录将被预先添加到所有其他搜索目录中。这实际上是在给定位置下“重新根植”整个搜索。CMAKE_STAGING_PREFIX
的后代路径将被排除在此重新根植之外,因为该变量始终是主机系统上的路径。默认情况下,CMAKE_FIND_ROOT_PATH
为空。
CMAKE_SYSROOT
变量也可用于指定要作为前缀使用的单个目录。设置CMAKE_SYSROOT
还会产生其他影响。有关详细信息,请参阅该变量的文档。
在交叉编译时,这些变量特别有用,可以指向目标环境的根目录,并且 CMake 也会在那里搜索。默认情况下,首先搜索CMAKE_FIND_ROOT_PATH
中列出的目录,然后搜索CMAKE_SYSROOT
目录,然后搜索非根目录。可以通过设置CMAKE_FIND_ROOT_PATH_MODE_PACKAGE
来调整默认行为。可以使用选项在每次调用时手动覆盖此行为
CMAKE_FIND_ROOT_PATH_BOTH
按上述顺序搜索。
NO_CMAKE_FIND_ROOT_PATH
不要使用
CMAKE_FIND_ROOT_PATH
变量。ONLY_CMAKE_FIND_ROOT_PATH
仅搜索重新根目录和以下目录
CMAKE_STAGING_PREFIX
。
默认搜索顺序旨在针对常见用例从最具体到最不具体。项目可以通过多次调用命令并使用 NO_*
选项来覆盖顺序。
find_package (<PackageName> PATHS paths... NO_DEFAULT_PATH) find_package (<PackageName>)
一旦其中一个调用成功,结果变量将被设置并存储在缓存中,以便不会再次进行任何搜索。
默认情况下,存储在结果变量中的值将是找到文件的路径。 CMAKE_FIND_PACKAGE_RESOLVE_SYMLINKS
变量可以在调用 find_package
之前设置为 TRUE
,以便解析符号链接并存储文件的真实路径。
每个非 REQUIRED 的 find_package
调用都可以被禁用或设置为 REQUIRED。
将
CMAKE_DISABLE_FIND_PACKAGE_<PackageName>
变量设置为TRUE
会禁用该包。这也禁用重定向到由FetchContent
提供的包。将
CMAKE_REQUIRE_FIND_PACKAGE_<PackageName>
变量设置为TRUE
会使该包成为 REQUIRED。
同时将这两个变量都设置为 TRUE
是错误的。
配置模式版本选择¶
当给出 [version]
参数时,配置模式只会找到声称与请求版本兼容的包版本(请参阅 格式规范)。如果给出 EXACT
选项,则只能找到声称与请求版本完全匹配的包版本。CMake 没有为版本号的含义建立任何约定。包版本号由包本身提供的“版本”文件或由 FetchContent
检查。对于候选包配置文件 <config-file>.cmake
,相应的版本文件位于其旁边,并命名为 <config-file>-version.cmake
或 <config-file>Version.cmake
。如果不存在这样的版本文件,则假定配置文件与任何请求的版本都不兼容。可以使用 CMakePackageConfigHelpers
模块创建包含通用版本匹配代码的基本版本文件。找到版本文件后,将加载它以检查请求的版本号。版本文件在嵌套作用域中加载,其中已定义以下变量:
PACKAGE_FIND_NAME
<PackageName>
PACKAGE_FIND_VERSION
完整的请求版本字符串
PACKAGE_FIND_VERSION_MAJOR
如果请求,则为主要版本,否则为 0
PACKAGE_FIND_VERSION_MINOR
如果请求,则为次要版本,否则为 0
PACKAGE_FIND_VERSION_PATCH
如果请求,则为修补程序版本,否则为 0
PACKAGE_FIND_VERSION_TWEAK
如果请求,则为调整版本,否则为 0
PACKAGE_FIND_VERSION_COUNT
版本组件数,0 到 4
当指定版本范围时,上述版本变量将根据版本范围的下限持有值。这是为了保持与尚未实现以预期版本范围的包的兼容性。此外,版本范围将由以下变量描述:
PACKAGE_FIND_VERSION_RANGE
完整的请求版本范围字符串
PACKAGE_FIND_VERSION_RANGE_MIN
这指定版本范围的下限点是包含还是排除。目前,此变量唯一支持的值是
INCLUDE
。PACKAGE_FIND_VERSION_RANGE_MAX
这指定版本范围的上限点是包含还是排除。此变量支持的值是
INCLUDE
和EXCLUDE
。PACKAGE_FIND_VERSION_MIN
范围下限点的完整请求版本字符串
PACKAGE_FIND_VERSION_MIN_MAJOR
如果请求,则为下限点的主要版本,否则为 0
PACKAGE_FIND_VERSION_MIN_MINOR
如果请求,则为下限点的次要版本,否则为 0
PACKAGE_FIND_VERSION_MIN_PATCH
如果请求,则为下限点的修补程序版本,否则为 0
PACKAGE_FIND_VERSION_MIN_TWEAK
如果请求,则为下限点的调整版本,否则为 0
PACKAGE_FIND_VERSION_MIN_COUNT
下限点的版本组件数,0 到 4
PACKAGE_FIND_VERSION_MAX
范围上限点的完整请求版本字符串
PACKAGE_FIND_VERSION_MAX_MAJOR
如果请求,则为上限点的主要版本,否则为 0
PACKAGE_FIND_VERSION_MAX_MINOR
如果请求,则为上限点的次要版本,否则为 0
PACKAGE_FIND_VERSION_MAX_PATCH
如果请求,则为上限点的修补程序版本,否则为 0
PACKAGE_FIND_VERSION_MAX_TWEAK
如果请求,则为上限点的调整版本,否则为 0
PACKAGE_FIND_VERSION_MAX_COUNT
上限点的版本组件数,0 到 4
无论指定的是单个版本还是版本范围,变量 PACKAGE_FIND_VERSION_COMPLETE
都将被定义,并将保存指定的完整请求版本字符串。
版本文件检查它是否满足请求的版本并设置这些变量:
PACKAGE_VERSION
完整的提供版本字符串
PACKAGE_VERSION_EXACT
如果版本是完全匹配,则为 True
PACKAGE_VERSION_COMPATIBLE
如果版本兼容,则为 True
PACKAGE_VERSION_UNSUITABLE
如果作为任何版本都不合适,则为 True
这些变量由 find_package
命令检查以确定配置文件是否提供了可接受的版本。在 find_package
调用返回后,它们不可用。如果版本可接受,则设置以下变量:
<PackageName>_VERSION
完整的提供版本字符串
<PackageName>_VERSION_MAJOR
如果提供,则为主要版本,否则为 0
<PackageName>_VERSION_MINOR
如果提供,则为次要版本,否则为 0
<PackageName>_VERSION_PATCH
如果提供,则为修补程序版本,否则为 0
<PackageName>_VERSION_TWEAK
如果提供,则为调整版本,否则为 0
<PackageName>_VERSION_COUNT
版本组件数,0 到 4
并加载相应的包配置文件。
包文件接口变量¶
加载查找模块或包配置文件时,find_package
定义变量以提供有关调用参数的信息(并在返回之前恢复其原始状态)
CMAKE_FIND_PACKAGE_NAME
正在搜索的
<PackageName>
<PackageName>_FIND_REQUIRED
如果给出
REQUIRED
选项,则为 True<PackageName>_FIND_QUIETLY
如果给出
QUIET
选项,则为 True<PackageName>_FIND_REGISTRY_VIEW
如果给出
REGISTRY_VIEW
选项,则为请求的视图<PackageName>_FIND_VERSION
完整的请求版本字符串
<PackageName>_FIND_VERSION_MAJOR
如果请求,则为主要版本,否则为 0
<PackageName>_FIND_VERSION_MINOR
如果请求,则为次要版本,否则为 0
<PackageName>_FIND_VERSION_PATCH
如果请求,则为修补程序版本,否则为 0
<PackageName>_FIND_VERSION_TWEAK
如果请求,则为调整版本,否则为 0
<PackageName>_FIND_VERSION_COUNT
版本组件数,0 到 4
<PackageName>_FIND_VERSION_EXACT
如果给出
EXACT
选项,则为 True<PackageName>_FIND_COMPONENTS
指定组件的列表(必需和可选)
<PackageName>_FIND_REQUIRED_<c>
如果组件
<c>
是必需的,则为 True;如果组件<c>
是可选的,则为 False
当指定版本范围时,上述版本变量将根据版本范围的下限持有值。这是为了保持与尚未实现以预期版本范围的包的兼容性。此外,版本范围将由以下变量描述:
<PackageName>_FIND_VERSION_RANGE
完整的请求版本范围字符串
<PackageName>_FIND_VERSION_RANGE_MIN
这指定版本范围的下限点是包含还是排除。目前,
INCLUDE
是唯一支持的值。<PackageName>_FIND_VERSION_RANGE_MAX
这指定版本范围的上限点是包含还是排除。此变量的可能值是
INCLUDE
或EXCLUDE
。<PackageName>_FIND_VERSION_MIN
范围下限点的完整请求版本字符串
<PackageName>_FIND_VERSION_MIN_MAJOR
如果请求,则为下限点的主要版本,否则为 0
<PackageName>_FIND_VERSION_MIN_MINOR
如果请求,则为下限点的次要版本,否则为 0
<PackageName>_FIND_VERSION_MIN_PATCH
如果请求,则为下限点的修补程序版本,否则为 0
<PackageName>_FIND_VERSION_MIN_TWEAK
如果请求,则为下限点的调整版本,否则为 0
<PackageName>_FIND_VERSION_MIN_COUNT
下限点的版本组件数,0 到 4
<PackageName>_FIND_VERSION_MAX
范围上限点的完整请求版本字符串
<PackageName>_FIND_VERSION_MAX_MAJOR
如果请求,则为上限点的主要版本,否则为 0
<PackageName>_FIND_VERSION_MAX_MINOR
如果请求,则为上限点的次要版本,否则为 0
<PackageName>_FIND_VERSION_MAX_PATCH
如果请求,则为上限点的修补程序版本,否则为 0
<PackageName>_FIND_VERSION_MAX_TWEAK
如果请求,则为上限点的调整版本,否则为 0
<PackageName>_FIND_VERSION_MAX_COUNT
上限点的版本组件数,0 到 4
无论指定的是单个版本还是版本范围,变量 <PackageName>_FIND_VERSION_COMPLETE
都将被定义,并将保存指定的完整请求版本字符串。
在模块模式下,加载的查找模块负责处理这些变量详细说明的请求;有关详细信息,请参阅查找模块。在配置模式下,find_package
自动处理 REQUIRED
、QUIET
和 [version]
选项,但将组件的处理方式留给包配置文件,以便对包来说更有意义。包配置文件可以将 <PackageName>_FOUND
设置为 false 以告诉 find_package
组件需求未得到满足。