【发布时间】:2020-04-28 22:17:59
【问题描述】:
将外部依赖项引入跨平台 CMake 项目的最佳方法是什么?请参阅下面我看到的问题范围和解决方案。
问题范围
假设我们有一个具有以下约束的 C/C++ 项目:
- CMake 是构建系统;
- 必须针对不同平台构建(桌面、Android NDK / Yocto SDK、iOS);
- 具有使用 CMake 构建的外部依赖项(例如 Google 测试);
- 具有基于非 CMake 的外部依赖项(例如 SQLite 合并、Boost);
- 并非所有依赖项都有 Git 上游(例如 SQLite 保存在化石中)。
很高兴有东西:
- 自动下载依赖项,让新开发者开始编码的步骤更少;
- 以 IDE(如 CLion)可以自动完成的方式配置依赖项(无需执行额外的配置步骤)。
可能的解决方案
- Git 子模块(不清楚如何处理基于非 Cmake 且未保存在 Git 依赖项中);
- Google Repo 工具(与之前的问题相同);
- CMake ExternalProject(在生成阶段下载、解压并可能使用 CMakeLists.txt 进行修补,并使用 add_subdirectory 包含到项目中)。 我根据 Craig Scott 在 [3] 中的 [2] 回答创建了一个 PoC[1]。
参考文献
【问题讨论】:
-
您有 2 种方法有缺点,另一种方法 - ExternalProject - 没有它们。那么,为什么不遵循第三种方法呢?什么是问题?
-
@Tsyvarev,我很期待知道我没有想到的方法。
-
鉴于这种非常通用的信息,寻找方法只是一个“建议”问题,我们倾向于在 Stack Overflow 上避免。相反,我们更愿意专注于特定问题。见help center。
-
@Tsyvarev,我认为这个主题非常具体(考虑到所有限制)但也非常概念化。由于在这种情况下缺乏明确的指导,我认为这个问题带来了很好的价值。
-
其实这些“约束”有模糊的意思。例如。你写“必须为不同的平台构建......Android NDK”,并评论
FetchContent模块在Android NDK中无法访问的答案。但这是一个真正的问题吗?人们可以使用来自官方 CMake 的FetchContent.cmake模块复制轻松运送他/她的项目,以便在旧 CMake 版本中工作。然后,您希望同时使用 CMake 和非基于 CMake 的依赖项。但是是什么阻止了以不同方式处理这两种依赖关系?
标签: c++ git cmake dependencies dependency-management