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,其中 versionMinversionMax 具有相同的格式,并且组件为整数的约束与单个版本相同。默认情况下,两个端点都包含在内。通过指定 <,将排除上端点。版本范围仅在 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) 约定的安装树。

条目

约定

<prefix>/

W

<prefix>/(cmake|CMake)/

W

<prefix>/<name>*/

W

<prefix>/<name>*/(cmake|CMake)/

W

<prefix>/<name>*/(cmake|CMake)/<name>*/ [1]

W

<prefix>/(lib/<arch>|lib*|share)/cmake/<name>*/

U

<prefix>/(lib/<arch>|lib*|share)/<name>*/

U

<prefix>/(lib/<arch>|lib*|share)/<name>*/(cmake|CMake)/

U

<prefix>/<name>*/(lib/<arch>|lib*|share)/cmake/<name>*/

W/U

<prefix>/<name>*/(lib/<arch>|lib*|share)/<name>*/

W/U

<prefix>/<name>*/(lib/<arch>|lib*|share)/<name>*/(cmake|CMake)/

W/U

在支持 macOS FRAMEWORKBUNDLE 的系统上,将搜索以下目录以查找包含配置文件的框架或应用程序包。

条目

约定

<prefix>/<name>.framework/Resources/

A

<prefix>/<name>.framework/Resources/CMake/

A

<prefix>/<name>.framework/Versions/*/Resources/

A

<prefix>/<name>.framework/Versions/*/Resources/CMake/

A

<prefix>/<name>.app/Contents/Resources/

A

<prefix>/<name>.app/Contents/Resources/CMake/

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 平台上,可以通过 HINTSPATHS 关键字指定的目录中包含注册表查询,使用 专用语法。此类规范在所有其他平台上将被忽略。

3.24版本中已添加: REGISTRY_VIEW 可用于管理作为 PATHSHINTS 部分指定的 Windows 注册表查询。

指定必须查询哪些注册表视图。此选项仅在 Windows 平台上有意义,在其他平台上将被忽略。如果未指定,则当 CMP0134 策略为 NEW 时使用 TARGET 视图。有关策略为 OLD 时的默认视图,请参阅 CMP0134

64

查询 64 位注册表。在 32 位 Windows 上,它始终返回字符串 /REGISTRY-NOTFOUND

32

查询 32 位注册表。

64_32

查询两个视图(6432)并为每个视图生成路径。

32_64

查询两个视图(3264)并为每个视图生成路径。

HOST

查询与主机架构匹配的注册表:在 64 位 Windows 上为 64,在 32 位 Windows 上为 32

TARGET

查询与 CMAKE_SIZEOF_VOID_P 变量指定的架构匹配的注册表。如果未定义,则回退到 HOST 视图。

BOTH

查询两个视图(3264)。顺序取决于以下规则:如果 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_FRAMEWORKCMAKE_FIND_APPBUNDLE 变量确定首选项的顺序。

安装前缀集是使用以下步骤构建的。如果指定了 NO_DEFAULT_PATH,则所有 NO_* 选项都将启用。

  1. 搜索当前正在查找的 <PackageName> 独有的前缀。请参阅策略 CMP0074

    3.12版本中已添加。

    具体来说,按顺序搜索以下变量指定的前缀

    1. <PackageName>_ROOT CMake 变量,其中 <PackageName> 是保留大小写的软件包名称。

    2. <PACKAGENAME>_ROOT CMake 变量,其中 <PACKAGENAME> 是大写的软件包名称。请参阅策略 CMP0144

      3.27版本中已添加。

    3. <PackageName>_ROOT 环境变量,其中 <PackageName> 是保留大小写的软件包名称。

    4. <PACKAGENAME>_ROOT 环境变量,其中 <PACKAGENAME> 是大写的软件包名称。请参阅策略 CMP0144

      3.27版本中已添加。

    软件包根变量被维护为一个栈,因此如果从查找模块内部调用,则在当前软件包的路径之后也会搜索父查找模块的根路径。如果传递了 NO_PACKAGE_ROOT_PATH 或将 CMAKE_FIND_USE_PACKAGE_ROOT_PATH 设置为 FALSE,则可以跳过此步骤。

  2. 在 cmake 特定的缓存变量中指定的搜索路径。这些路径旨在与 -DVAR=VALUE 一起在命令行上使用。这些值被解释为 分号分隔的列表。如果传递了 NO_CMAKE_PATH 或将 CMAKE_FIND_USE_CMAKE_PATH 设置为 FALSE,则可以跳过此步骤

  3. 在 cmake 特定的环境变量中指定的搜索路径。这些路径旨在设置在用户的 shell 配置中,因此使用主机的本机路径分隔符(在 Windows 上为 ;,在 UNIX 上为 :)。如果传递了 NO_CMAKE_ENVIRONMENT_PATH 或将 CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH 设置为 FALSE,则可以跳过此步骤

  4. HINTS 选项指定的搜索路径。这些路径应由系统自省计算,例如由已找到的其他项目的路径提供的提示。硬编码的猜测应使用 PATHS 选项指定。

  5. 搜索标准系统环境变量。如果传递了NO_SYSTEM_ENVIRONMENT_PATH或将CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH设置为FALSE,则可以跳过此步骤。以/bin/sbin结尾的路径条目会自动转换为其父目录。

    • PATH

  6. 搜索存储在 CMake 用户包注册表中的路径。如果传递了NO_CMAKE_PACKAGE_REGISTRY或将变量CMAKE_FIND_USE_PACKAGE_REGISTRY设置为FALSE,或者将已弃用的变量CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY设置为TRUE,则可以跳过此步骤。

    有关用户包注册表的详细信息,请参阅cmake-packages(7) 手册。

  7. 搜索当前系统平台文件中定义的 cmake 变量。如果传递了NO_CMAKE_INSTALL_PREFIX或将CMAKE_FIND_USE_INSTALL_PREFIX设置为FALSE,则可以跳过CMAKE_INSTALL_PREFIXCMAKE_STAGING_PREFIX的搜索。如果传递了NO_CMAKE_SYSTEM_PATH或将CMAKE_FIND_USE_CMAKE_SYSTEM_PATH设置为FALSE,则可以跳过所有这些位置。

    这些变量包含的平台路径通常是包含已安装软件的位置。例如,基于 UNIX 的平台上的/usr/local

  8. 搜索存储在 CMake 系统包注册表中的路径。如果传递了NO_CMAKE_SYSTEM_PACKAGE_REGISTRY或将CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY变量设置为FALSE,或者将已弃用的变量CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY设置为TRUE,则可以跳过此步骤。

    有关系统包注册表的详细信息,请参阅cmake-packages(7) 手册。

  9. 搜索由PATHS选项指定的路径。这些通常是硬编码的猜测。

CMAKE_IGNORE_PATHCMAKE_IGNORE_PREFIX_PATHCMAKE_SYSTEM_IGNORE_PATHCMAKE_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_ORDERCMAKE_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。

同时将这两个变量都设置为 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

这指定版本范围的上限点是包含还是排除。此变量支持的值是 INCLUDEEXCLUDE

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

这指定版本范围的上限点是包含还是排除。此变量的可能值是 INCLUDEEXCLUDE

<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 自动处理 REQUIREDQUIET[version] 选项,但将组件的处理方式留给包配置文件,以便对包来说更有意义。包配置文件可以将 <PackageName>_FOUND 设置为 false 以告诉 find_package 组件需求未得到满足。