首页 > 解决方案 > CMake find_path / find_library 是否搜索_ROOT 默认?

问题描述

在阅读有关 CMake 政策 74 - https://cmake.org/cmake/help/latest/policy/CMP0074.html

[...] 现在搜索由 _ROOT CMake 变量和ROOT 环境变量指定的前缀。包根以堆栈形式维护,因此对find 模块和配置包中所有 find * 命令的嵌套调用也将根作为前缀进行搜索。

这是否意味着<PackageName>_ROOT不需要find_*明确包含在路径中?这是否意味着<PackageName>_ROOT将自动检查?

标签: cmakecmake-modules

解决方案


是的,但这仅适用于 CMake 3.12 及更高版本,如政策文档中所述:

在 CMake 3.12 及更高版本中,该find_package(<PackageName>)命令现在搜索由<PackageName>_ROOTCMake 变量和<PackageName>_ROOT环境变量指定的前缀。

仅适用find_*于查找模块和配置包中的命令。

此行为在所有find_*命令的文档中都有明确说明。例如,这是find_library()文档中的一个片段(重要部分以粗体显示):

如果NO_DEFAULT_PATH不指定,则搜索过程如下:

  1. 如果从 find 模块或通过调用加载的任何其他脚本中调用find_package(<PackageName>),则搜索当前找到的包所特有的前缀。具体来说,查看<PackageName>_ROOTCMake 变量和<PackageName>_ROOT环境变量。包根变量作为堆栈维护,因此如果从嵌套的查找模块或配置包中调用,则将在当前模块或包的路径之后搜索父级查找模块或配置包的根路径。换句话说,搜索顺序将是<CurrentPackage>_ROOT, ENV{<CurrentPackage>_ROOT}, <ParentPackage>_ROOT,等。如果通过或通过设置toENV{<ParentPackage>_ROOT}可以跳过这一步。NO_PACKAGE_ROOT_PATHCMAKE_FIND_USE_PACKAGE_ROOT_PATHFALSE

另请注意,如果使用or调用 find 模块,则该<PackageName>_ROOT变量将不会用于搜索。NO_DEFAULT_PATHNO_PACKAGE_ROOT_PATH


推荐阅读