首页 > 解决方案 > 如何使用配置模式进行 find_package 搜索并回退到模块模式?

问题描述

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

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

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

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

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

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

标签: c++cmake

解决方案


只需使用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

推荐阅读