查找包¶
备注
Using Dependencies Guide 提供了对此一般主题的高级介绍。它更广泛地概述了``find_package()`` 命令在更大范围内的位置,包括它与 FetchContent 模块的关系。建议在继续阅读以下详细信息之前先阅读该指南。
找到一个包(通常由项目外部的东西提供),并加载其特定于包的详细信息。调用此命令也可以被 dependency providers 拦截。
搜索模式¶
该命令有几种搜索包的模式:
- 模块模式
在这种模式下,CMake 搜索名为“Find<PackageName>.cmake”的文件,首先在 CMAKE_MODULE_PATH 中列出的位置中查找,然后在 CMake 提供的 Find Modules 中查找安装。如果找到该文件,CMake 将读取并处理该文件。它负责查找包、检查版本并生成任何需要的消息。一些 Find 模块对版本控制提供有限支持或不支持;检查查找模块的文档。
Find<PackageName>.cmake文件通常不由包本身提供。相反,它通常由包外部的某些东西提供,例如操作系统、CMake 本身,甚至是调用“find_package()”命令的项目。由于是外部提供的, 查找模块 本质上往往是启发式的,很容易变得过时。他们通常搜索某些库、文件和其他包工件。模块模式仅由 basic 命令签名 支持。
- 配置模式
在这种模式下,CMake 搜索名为“<lowercasePackageName>-config.cmake”或“<PackageName>Config.cmake”的文件。如果指定了版本详细信息,它还将查找``<lowercasePackageName>-config-version.cmake`` 或``<PackageName>ConfigVersion.cmake``(请参阅:ref:version selection 以了解如何将它们分开使用版本文件)。
在配置模式下,可以为该命令提供一个名称列表,以作为包名称进行搜索。 CMake 搜索配置和版本文件的位置比模块模式复杂得多(请参阅 搜索过程)。
配置和版本文件通常作为包的一部分安装,因此它们往往比查找模块更可靠。它们通常包含包内容的直接知识,因此不需要在配置或版本文件本身中进行搜索或试探。
- FetchContent 重定向模式
在 3.24 版本加入: 对
find_package()的调用可以在内部重定向到 FetchContent 模块提供的包。对于调用者来说,行为将类似于 Config 模式,除了绕过搜索逻辑并且不使用组件信息。有关更多详细信息,请参阅FetchContent_Declare()和FetchContent_MakeAvailable()。
当未重定向到 FetchContent 提供的包时,命令参数决定是使用 Module 还是 Config 模式。当使用 basic signature 时,命令首先以 Module 模式搜索。如果未找到包,则搜索返回到配置模式。用户可以将 CMAKE_FIND_PACKAGE_PREFER_CONFIG 变量设置为 true 以反转优先级并指示 CMake 在返回到模块模式之前首先使用配置模式进行搜索。也可以强制基本签名仅使用带有“MODULE”关键字的模块模式。如果使用 full signature,则该命令仅在 Config 模式下搜索。
在可能的情况下,用户代码通常应该使用 basic signature 查找包,因为这允许使用任何模式找到包。希望提供配置包的项目维护者应该了解全局,如 完整签名 和本页所有后续部分中所述。
基本签名¶
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 和 Config 模式都支持基本签名。 MODULE 关键字意味着只能使用 Module 模式来查找包,而不能回退到 Config 模式。
无论使用何种模式,都会设置一个``<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 选项要求版本完全匹配。此选项与版本范围的规范不兼容。
如果没有 [version] 和/或组件列表被提供给查找模块内的递归调用,则相应的参数会自动从外部调用转发(包括 [version] 的 ``EXACT 标志]``)。目前仅在逐个软件包的基础上提供版本支持(请参阅下面的“版本选择”部分)。当指定了版本范围但包仅设计为期望单个版本时,包将忽略范围的上限点,而仅考虑范围下限的单个版本。
有关 NO_POLICY_SCOPE 选项的讨论,请参阅 cmake_policy() 命令文档。
在 3.24 版本加入: BYPASS_PROVIDER 关键字仅在 find_package() 被 dependency provider 调用时才被允许。提供者可以使用它来直接调用内置的“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 选项,或使用未在 basic signature 中指定的选项都强制执行纯配置模式。在纯 Config 模式下,该命令会跳过 Module 模式搜索并立即进行 Config 模式搜索。
配置模式搜索尝试定位要查找的包提供的配置文件。创建一个名为“<PackageName>_DIR”的缓存条目来保存包含该文件的目录。默认情况下,该命令搜索名称为“<PackageName>”的包。如果给出了 NAMES 选项,则使用它后面的名称而不是 <PackageName>。在确定是否将调用重定向到 FetchContent 提供的包时,也会考虑这些名称。
该命令为每个指定的名称搜索名为“<PackageName>Config.cmake”或“<lowercasePackageName>-config.cmake”的文件。可以使用 CONFIGS 选项给出一组可能的配置文件名的替换。 搜索程序`在下面指定。一旦找到,就会检查任何 :ref:`version constraint,如果满足,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 |
|
ü |
|
ü |
|
ü |
|
W/U |
|
W/U |
|
W/U |
在支持 macOS FRAMEWORK 和 BUNDLE 的系统上,搜索以下目录以查找包含配置文件的框架或应用程序包:
入口 |
习俗 |
|---|---|
|
A |
|
A |
|
A |
|
A |
|
A |
|
A |
在所有情况下,<name> 都被视为不区分大小写,并对应于指定的任何名称(<PackageName> 或由``NAMES`` 给出的名称)。
如果设置了 CMAKE_LIBRARY_ARCHITECTURE 变量,则启用带有 lib/<arch> 的路径。 lib* 包括一个或多个值 lib64、lib32、libx32 或 ``lib``(按顺序搜索)。
如果
FIND_LIBRARY_USE_LIB64_PATHS属性设置为TRUE,则在 64 位平台上搜索带有lib64的路径。如果
FIND_LIBRARY_USE_LIB32_PATHS属性设置为TRUE,则在 32 位平台上搜索带有lib32的路径。如果
FIND_LIBRARY_USE_LIBX32_PATHS属性设置为TRUE,则使用 x32 ABI 在平台上搜索带有libx32的路径。始终搜索
lib路径。
在 3.24 版本发生变更: 在 Windows 平台上,可以将注册表查询作为通过 HINTS 和 PATHS 关键字指定的目录的一部分,使用 专用语法 .此类规范将在所有其他平台上被忽略。
在 3.24 版本加入: 可以指定``REGISTRY_VIEW`` 来管理``Windows`` 注册表查询,这些查询指定为``PATHS`` 和``HINTS`` 的一部分。
指定必须查询哪些注册表视图。此选项仅在 Windows 平台上有意义,在其他平台上将被忽略。未指定时,|FIND_XXX_REGISTRY_VIEW_DEFAULT|当 CMP0134 策略为``NEW`` 时使用视图。策略为“旧”时的默认视图,请参阅:policy:CMP0134。
64查询 64 位注册表。在 32 位 Windows 上,它总是返回字符串“/REGISTRY-NOTFOUND”。
32查询 32 位注册表。
64_32查询两个视图(
64和``32``)并为每个视图生成一个路径。32_64查询两个视图(
32和64)并为每个视图生成一个路径。主机查询与主机架构相匹配的注册表:64 位 Windows 上为“64”,32 位 Windows 上为“32”。
目标查询与 CMAKE_SIZEOF_VOID_P 变量指定的体系结构相匹配的注册表。如果未定义,则返回到
HOST视图。两者查询两个视图(
32和64)。顺序取决于以下规则:如果定义了CMAKE_SIZEOF_VOID_P变量,则根据此变量的内容使用以下视图:8:64_324:32_64
如果未定义
CMAKE_SIZEOF_VOID_P变量,则依赖主机的体系结构:64 位:
64_3232 位:
32
如果指定了 PATH_SUFFIXES,则后缀将一个接一个地附加到每个 (W) 或 (U) 目录条目。
这组目录旨在与在其安装树中提供配置文件的项目合作。上面标有 (W) 的目录用于在 Windows 上安装,其中前缀可能指向应用程序安装目录的顶部。那些标有 (U) 的用于安装在 UNIX 平台上,其中前缀由多个包共享。这只是一个约定,所以所有 (W) 和 (U) 目录仍然在所有平台上搜索。标有 (A) 的目录用于在 Apple 平台上安装。 CMAKE_FIND_FRAMEWORK 和 CMAKE_FIND_APPBUNDLE 变量决定优先顺序。
安装前缀集是使用以下步骤构建的。如果指定了 NO_DEFAULT_PATH,则启用所有 NO_* 选项。
在 3.12 版本加入: 在
<PackageName>_ROOTCMake 变量和<PackageName>_ROOT环境变量中指定的搜索路径,其中``<PackageName>`` 是要查找的包(大小写优先)find_package的参数)。包根变量作为堆栈维护,因此如果从查找模块中调用,父查找模块的根路径也将在当前包的路径之后进行搜索。如果传递了NO_PACKAGE_ROOT_PATH或者通过将CMAKE_FIND_USE_PACKAGE_ROOT_PATH设置为FALSE可以跳过这一步。请参阅政策:policy:CMP0074。在特定于 cmake 的缓存变量中指定的搜索路径。这些旨在与
-DVAR=VALUE在命令行上使用。这些值被解释为:ref:分号分隔的列表 <CMake Language Lists>。如果传递了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>_DIRCMAKE_FRAMEWORK_PATHCMAKE_APPBUNDLE_PATH
搜索由
HINTS选项指定的路径。这些应该是系统自省计算出的路径,例如由已找到的另一个项目的位置提供的提示。硬编码的猜测应该用PATHS选项指定。搜索标准系统环境变量。如果传递了
NO_SYSTEM_ENVIRONMENT_PATH或通过将CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH设置为FALSE可以跳过这一步。以“/bin”或“/sbin”结尾的路径条目会自动转换为其父目录:路径
搜索存储在 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,则可以跳过所有这些位置:这些变量包含的平台路径是通常包含已安装软件的位置。一个例子是
/usr/local用于基于 UNIX 的平台。搜索存储在 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 变量也可能导致上述某些位置被忽略。
在 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 以解析符号链接并存储文件的真实路径。
每个非必需的 find_package 调用都可以被禁用或成为必需的:
将
CMAKE_DISABLE_FIND_PACKAGE_<PackageName>变量设置为TRUE会禁用包。这也会禁用重定向到 FetchContent 提供的包。将
CMAKE_REQUIRE_FIND_PACKAGE_<PackageName>变量设置为TRUE使包成为必需的。
同时将两个变量设置为“TRUE”是错误的。
配置模式版本选择¶
当给出 [version] 参数时,Config 模式将仅查找声称与所请求版本兼容的包版本(请参阅:ref:格式规范 <FIND_PACKAGE_VERSION_FORMAT>)。如果给出了 EXACT 选项,则只能找到声称与所请求版本完全匹配的包版本。 CMake 没有为版本号的含义建立任何约定。包版本号由包本身提供的“版本”文件或 FetchContent 检查。对于候选包配置文件 <config-file>.cmake 相应的版本文件位于其旁边并命名为 <config-file>-version.cmake 或 <config-file>版本.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如果版本完全匹配则为真
PACKAGE_VERSION_COMPATIBLE如果版本兼容则为真
PACKAGE_VERSION_UNSUITABLE如果不适合任何版本,则为真
这些变量由 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
并加载相应的包配置文件。当多个包配置文件可用时,其版本文件声称与所请求的版本兼容,则未指定选择哪个版本:除非设置了变量 CMAKE_FIND_PACKAGE_SORT_ORDER,否则不会尝试选择最高或最接近的版本号。
要控制 find_package 检查兼容性的顺序,请使用两个变量 CMAKE_FIND_PACKAGE_SORT_ORDER 和 CMAKE_FIND_PACKAGE_SORT_DIRECTION。例如,为了选择可以设置的最高版本
SET(CMAKE_FIND_PACKAGE_SORT_ORDER NATURAL)
SET(CMAKE_FIND_PACKAGE_SORT_DIRECTION DEC)
在调用 find_package 之前。
包文件接口变量¶
加载查找模块或包配置文件时,find_package 定义变量以提供有关调用参数的信息(并在返回前恢复其原始状态):
CMAKE_FIND_PACKAGE_NAME搜索的``<PackageName>``
<PackageName>_FIND_REQUIRED如果给出了
REQUIRED选项则为真<PackageName>_FIND_QUIETLY如果给出了
QUIET选项则为真<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选项则为真<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”都将被定义并将保存指定的完整请求版本字符串。
在模块模式下,加载的查找模块负责处理由这些变量详细说明的请求;有关详细信息,请参阅查找模块。在 Config 模式下,find_package 会自动处理 REQUIRED、QUIET 和 [version] 选项,但将其留给包配置文件,以对组件有意义的方式处理组件包裹。包配置文件可以将“<PackageName>_FOUND”设置为 false 以告知“find_package”组件要求未得到满足。