问题:
我正在重做遗留项目中的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] 删除。
我来说两句