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

How can I make find_package search with config mode and fallback on module mode?

本文关键字:模式 模块 回退 搜索 配置 何使用 find package      更新时间:2023-10-16

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

如果库无法将其目标导出到 CMake,CMake 会尝试通过提供尝试查找此类库FindXXX.cmake脚本来弥合差距。

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

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

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

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

3.15 版新功能:

CMAKE_FIND_PACKAGE_PREFER_CONFIG设置为TRUE,以告知find_package()首先使用配置模式进行搜索,然后再回退到模块模式。

参考文献: 1, 2.

只需在CONFIG模式下使用find_package,检查其结果,如果结果为 false,则使用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

你可以试试这个find_package(XXX CONFIG REQUIRED)

请参阅链接: CMake:如果你无论如何都需要指定CMAKE_MODULE_PATH,find_package(( 有什么用?