CMake find_package可以“知道公共依赖版本”吗?

约翰·普莱斯

问题:

我正在重做遗留项目中的make系统,将其当前的神秘版本更改为CMake。目前,我已经将CMake视为一个大型CMake项目,但是我们的代码库太大,以至于破坏了我们扔给它的大多数IDE。

我们想将其分解,并且CMake的find_package“模块模式”似乎是将其分解为“功能大小”的块的理想选择。主要候选对象是大部分代码,很少需要维护,即使如此,通常也需要其他团队维护。这将使我们能够维护代码,但在更新不同的代码时不能不断地对其进行重新编译。

就是说,这段代码在API中使用了Boost的共享指针,尽管共享指针的不同版本可能会一起工作,但我宁愿不要冒险。因此,理想情况下,程序包将知道系统使用的“ boost”版本,编译模块时使用的boost版本,并能够重新编译-或至少会引发错误。或在CMake中发出警告-如果两者不匹配。

那么...如何确保CMake find_package模块中的公共依赖项版本匹配?我唯一能想到的就是测试适当的VERSION变量,但这似乎……笨重。有什么我想念的吗?

附加信息:

我们正在使用CMake 3.5.1,但如果可以这样做,我们可以升级到3.5.2。该项目实际上是软件产品线(qv),因此我们计划在将来的某个时候使用更现代的SPL软件工程技术(但这也是选择CMake的另一个原因)。该代码库当前在Redhat Linux中,但是理想情况下,该技术应该是跨平台的。

齐瓦列夫

您可以使用的配置模式find_package允许模块向用户(根项目)公开一些内部属性。

如果每个模块都提供目标,则可以使用附加了Boost版本的属性公开该目标,并在特殊的COMPATIBLE_INTERFACE_STRING属性中列出此属性。

您的根项目将通过find_package()调用包含模块,并将读取这些属性。当它尝试链接此类模块提供的库时,版本兼容性将由CMake自动执行:

modA / CMakeLists.txt

...
find_package(Boost)
add_library(modA_lib ...)
... # Link modA_lib with Boost
# Install modA_lib target and exports it for use in other project.
install(TARGETS modA_lib EXPORT modA_lib)
# Configured -config file is shown below
configure(modA-config.cmake.in modA-config.cmake)
install(EXPORT modA_lib
    DESTINATION share/cmake/modA)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/modA-config.cmake
    DESTINATION share/cmake/modA)

modA / modA-config.cmake.in

include(@CMAKE_INSTALL_PREFIX@/share/cmake/modA/modA_lib.cmake) # Include file described library target
# Expose linked version of Boost via target's property.
set_property(TARGET modA_lib PROPERTY INTERFACE_BOOST_VERSION @Boost_VERSION@)
# Mark this property as compatibility requirement
set_property(TARGET modA_lib PROPERTY APPEND COMPATIBLE_INTERFACE_STRING BOOST_VERSION)

(modB以类似的方式实现)

root / CMakeLists.txt

find_package(modA) # This imports target modA_lib
find_package(modB) # This imports target modB_lib

add_executable(root_exe <...>)

# Boost version check will be performed here
target_link_libraries(root_exe modA_lib modB_lib)

此外,在根项目中创建的可执行文件可以通过设置适当的属性来请求特定的Boost版本:

add_executable(root_exe <...>)
set_property(TARGET root_exe PROPERTY BOOST_VERSION <...>)

在这种情况下,(依赖于CMake)将禁止其依赖项将Boost库与其他版本一起使用。

有关更多信息和用法示例,请参阅CMake构建系统说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

cmake使用find_package传播依赖项

来自分类Dev

覆盖CMake Find_Package

来自分类Dev

覆盖CMake Find_Package

来自分类Dev

CMake为FIND_PACKAGE设置了开始路径吗?

来自分类Dev

cmake的find_package无法找到提升

来自分类Dev

cmake Eigen find_package提示

来自分类Dev

CMake和find_package问题

来自分类Dev

cmake的find_package无法找到提升

来自分类Dev

CMake find_package 找不到 WebSockets

来自分类Dev

CMake find_package()不尊重CMAKE_MODULE_PATH

来自分类Dev

CMake-使用find_package中的变量链接不同的Debug和Release版本库

来自分类Dev

如何在CMAKE中使用FIND_PACKAGE请求最大版本

来自分类Dev

cmake find_package已安装模块的完整列表

来自分类Dev

CMake的add_sub目录与find_package?

来自分类Dev

在CMake中处理多个FIND_PACKAGE调用

来自分类Dev

命令行等效于cmake的find_package?

来自分类Dev

find_package()在Windows Cmake上未检测到增强

来自分类Dev

使外部项目可用于find_package CMake

来自分类Dev

使用`find_package()`排除cmake自己的分发模块

来自分类Dev

CMake find_package对本征不起作用?

来自分类Dev

find_package()在Windows Cmake上未检测到增强

来自分类Dev

CMake 依赖于公共静态库

来自分类Dev

CMAKE_PREFIX_PATH和CMAKE_MODULE_PATH都为空,find_package仍然有效

来自分类Dev

在CMake中建立依赖

来自分类Dev

在CMake中建立依赖

来自分类Dev

CMake 和外部依赖

来自分类Dev

如何知道CMake找到的库版本?

来自分类Dev

哪个CMake版本最低?

来自分类Dev

在/usr/lib/x86_64-linux-gnu/cmake/Qt5Core/Qt5CoreMacros.cmake:273(find_package)中的CMake警告: