如何使用配置模式进行 find_package 搜索并在模块模式下进行回退?

joh*_*003 7 c++ cmake

当一个库使用 CMake 定义构建并经历为自己构建安装包的麻烦时,将会有一个XXXConfig.cmake.

如果库无法将其目标导出到 CMake,CMake 会尝试通过提供FindXXX.cmake尝试定位此类库的脚本来弥补这一差距。

在文档中,FindXXX.cmake(模块模式)首先尝试,只有当失败时才尝试使用XXXConfig.cmake(配置模式)。但这对我来说似乎真的很倒退。

问题是,例如,我从源代码构建了 CURL,而 ConfigXXX 生成的目标名称与 FindXXX 不同,因此,在尝试使用它时,它失败了,因为 FindXXX 负责 find_package 请求并加载了与 FindXXX 不同的目标名称我所期待的。

我至少可以告诉 CMake 以相反的方式做事吗?首先是配置模式。

我知道我可以完全禁用模块模式,但我宁愿将其作为后备选项。

Tsy*_*rev 7

只要使用find_packageCONFIG模式,检查其结果,如果结果为假,重复与呼叫MODULE模式:

# First time do not use common *REQUIRED* but use QUIET for do not output error messages on fail.
find_package(XXX CONFIG QUIET)
if(NOT XXX_FOUND)
    # Previous call has been failed. Fallback with MODULE mode.
    find_package(XXX MODULE REQUIRED) # Now it is OK to use REQUIRED if needed.
    # ... There could be additional actions for wrap result "as if" CONFIG mode.
endif()
# ... use XXX
Run Code Online (Sandbox Code Playgroud)


小智 7

3.15 版的新功能:

设置CMAKE_FIND_PACKAGE_PREFER_CONFIGTRUE告诉find_package()在回退到模块模式之前首先使用配置模式进行搜索。

参考文献:1 , 2