c++ - 如何使用配置模式进行 find_package 搜索并回退到模块模式?
问题描述
当一个库使用 CMake 定义一个构建并经历为自己构建安装包的麻烦时,将会有一个XXXConfig.cmake
.
如果库无法将其目标导出到 CMake,CMake 会尝试通过提供FindXXX.cmake
尝试定位此类库的脚本来弥合差距。
在文档中,FindXXX.cmake
(模块模式)首先尝试,并且只有在失败时才会尝试使用XXXConfig.cmake
(配置模式)。但这对我来说似乎真的倒退了。
问题是,例如,我从源代码构建了 CURL,并且 ConfigXXX 生成的目标名称与 FindXXX 不同,因此,当尝试使用它时,它失败了,因为 FindXXX 负责 find_package 请求并加载了不同的目标名称我所期待的。
我至少可以告诉 CMake 以相反的方式做事吗?先配置模式。
我知道我可以完全禁用模块模式,但我宁愿将它作为后备选项。
解决方案
只需使用find_package
CONFIG模式,检查其结果,如果结果为假,则使用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
推荐阅读
- python - Python 2.7 出现错误 TypeError: 不支持的操作数类型 /: 'datetime.timedelta' 和 'datetime.timedelta'
- python - ImportError:无法从“keras.optimizers”导入名称“rmsprop”
- c# - Wpf:ContentControl.AddChild(Object) 方法
- python - 在 beautifulsoup4 中选择 div ID
- python - Tkinter 按钮复制
- mule - 连接器在用于枚举的 mule3 自定义连接器的下拉过程中显示一个空字段
- android - 在哪里查找含义“adb screencap”命令的退出代码或如何以编程方式获取含义?
- python - 复制坐标区内容并将其显示在现有图形中
- r - 如果需要,使用 NA 将元素插入到向量中
- python-3.x - 在 cupy 中启用 cub 的正确方法是什么?