c++ - 我可以简化这种方法来安装和导出基于 CMake 的项目吗?
问题描述
注意:重新问一个写得不好的早期问题。
使用 CMake 的包/库开发人员应该如何让他们的包有效地安装在系统上,以及在另一个基于 CMake 的项目中轻松集成/使用?
根据 Daniel Pfeiffer 的经常链接到的谈话(此处的幻灯片),这是一个如何完成的示例:
在CMakeLists.txt
:
find_package(Bar 2.0 REQUIRED)
add_library(Foo ...)
target_link_libraries(Foo PRIVATE Bar::Bar)
install(TARGETS Foo EXPORT FooTargets
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
RUNTIME DESTINATION bin
INCLUDES DESTINATION include
)
install(EXPORT FooTargets
FILE FooTargets.cmake
NAMESPACE Foo::
DESTINATION lib/cmake/Foo
)
在第二个文件中(哪个?):
include(CMakePackageConfigHelpers)
write_basic_package_version_file("FooConfigVersion.cmake"
VERSION ${Foo_VERSION}
COMPATIBILITY SameMajorVersion
)
install(FILES "FooConfig.cmake" "FooConfigVersion.cmake"
DESTINATION lib/cmake/Foo
)
在第三个文件中(哪个?):
include(CMakeFindDependencyMacro)
find_dependency(Bar 2.0)
include("${CMAKE_CURRENT_LIST_DIR}/FooTargets.cmake")
所以,我们有:
- 至少四个不同的 CMake 文件 (
CMakeLists.txt
,FooTargets.cmake
,FooConfig.cmake
,FooConfigVersion.cmake
) - ...生成的不止一个,但手写的不止一个
- ...并且它们也包括彼此
- ......谁的名字并不能更清楚地说明哪个做了什么
- ...有一些,但不是全部,正在安装。
我一直对此感到困惑和困惑。Pfeifer 说“我希望这更容易;但至少它是直截了当的”——这并不是那么直截了当。
问题:
- 这可以以某种方式简化吗?
- 如果不是,为什么每个文件都很重要?
- 不能用更少的命令/脚本/动态生成的文件自动生成更多的文件吗?
解决方案
总结:大约一年前,当我尝试这样做时,我的设置非常相似。
在源中至少有 2 个文件:一个 CMakeLists.txt 和一个 config.cmake.in。然后我让 CMake 使用 configure_package_config_file() 生成 myproject-config.cmake。
在安装的文件中,我还有导出的目标、配置和版本文件。
作为一个建议,看看你是否也可以使用 configure_package_config_file() 重用一个 config.cmake.in。
推荐阅读
- mongodb - mongo查询中$lookup和$match后需要获取匹配记录
- python - python beautifulsoup在div标签之间没有检索到数据
- javascript - 在 vanilla JS 中获取组件的反应状态
- jquery - 小部件价格过滤器不适用于 jquery
- java - 使用 int 输入获取枚举常量作为输出
- laravel - 使用 Laravel 封装类到另一个
- r - 数据框字符串拆分为列而不是行
- ruby-on-rails - 具有 SEO 要求的 Rails 本地化
- sql - 如果我有一个简单的一对多关系,我如何构建那个特定的 SQL 语句
- excel - VBA:文件日期时间、夏令时和 SOX 合规性