【问题标题】:Add wrapper for a CMake find module为 CMake 查找模块添加包装器
【发布时间】:2018-04-19 16:52:39
【问题描述】:

在我们的项目中,我们经常使用 boost。所以find_package(Boost ...) 经常被不同的组件调用(对于不同的模块/库)。这会导致很多 "Imported targets not available" 警告(真的很多)

我想避免所有这些日志混乱,而不是在升级 boost 时强制所有用户升级 CMake。我可以假设更新的增强版本很好。但是没有什么可以禁用此警告或仅显示一次。

所以我的想法是包装find_package(Boost ...) 并简单地返回一个状态。最简单的方法似乎是创建一个自定义FindBoost.cmake 并将其放入CMAKE_MODULE_PATH。但是我将如何调用原始的 boost 查找模块呢?如果我再次调用find_package(Boost ...),它可能会再次调用同一个模块。

另外:收集要传递的参数可能会很麻烦。有没有一种自动的方式来做到这一点(比如ARGN 用于常规功能)?

注意:不应该考虑使用自定义宏 find_boost 的明显解决方案,因为它涉及更改所有调用者。

【问题讨论】:

  • “我可以假设更新的 boost 版本没问题。” - 如果FindBoost.cmake 脚本早于 Boost 版本,则可能是有关 Boost 组件之间不满足依赖关系的错误。所以忽略像Imported targets not available 这样的警告可能会导致意外的编译/链接失败。
  • 我们仍然需要支持旧的 bo​​ost 和 CMake 版本。所以我们使用的是变量,而不是导入的目标并自己管理依赖项。必须以与该问题无关的方式处理该假设的含义。
  • Easiest way seems to create a custom FindBoost.cmake and put it in CMAKE_MODULE_PATH. But how would I then call into the original boost find-module? - 恢复 CMAKE_MODULE_PATH 并调用 include(FindBoost.cmake)。实际上,我不明白你为什么需要链接FindBoost.cmake:你可以将原始脚本复制到“自定义”脚本中,然后从中删除message(WARNING)
  • @Tsyvarev 这个想法非常好。事实上,您可以取消设置 CMAKE_MODULE_PATH 并在包含后恢复它。而且您的第二个提示也是正确的,因为即使包装和设置 QUIET 也不会消除警告。您可以将其转换为答案以便我接受吗?

标签: boost cmake wrapper


【解决方案1】:

你可以创建FindBoost.cmake脚本,它与某些版本的CMake中的脚本相同,但对应

message(WARNING ...)

已删除行。

将此脚本添加到您的项目中,并调整 CMAKE_MODULE_PATH 变量以找到它。


Boost 警告“导入的目标不可用”不能使用 find_packageQUIET 选项禁用:随 CMake 提供,脚本 FindBoost.cmake 不检查此选项何时发出这些警告。

【讨论】:

  • 如果确实想要一个包装器:只需unset(CMAKE_MODULE_PATH),然后include(FindBoost),然后重置CMAKE_MODULE_PATH
猜你喜欢
  • 2017-12-08
  • 2014-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-11
  • 2011-01-15
  • 2023-01-24
相关资源
最近更新 更多