C++ 工程依赖管理新方向:CMake & Git
本文内容中提及的 CMake 均指提倡 target-based properties 的 modern cmake,而非史前版本的 legacy cmake。
The Right Way: 源码依赖
对于 C++ 工程而言,只要 ABI 的问题还存在,源码依赖就是最稳妥最普适最可靠的依赖引入方式;即使这些引入的源码在构建中会单独编译成(动/静态)库。
同时,GitHub 成为开源文化社区的标杆后,获取实现了某一功能的第三方库的源代码的难度大大降低。
因此个人倾向上:只要允许,都应该以特定版本的源码引入的方式去依赖一个第三方库。
事实上,Google Facebook 这些大厂内部实行的 monorepo 也是源码依赖的一种实现方式,因为某个工程需要的依赖源码都可以一并获取到。
在使用 CMake 作为构建系统的工程体系下,要以源码依赖的方式添加一个子工程只需要使用 add_subdirectory()
添加目标工程的顶层目录(根 CMakeLists.txt
所在的目录)。
Git Submodule: 一次不完美的尝试
我的个人项目 KBase 和 ezio,在此之前都是通过 git submodule 的方式引入自己需要的依赖源代码,然后通过
- Visual Studio 子工程添加到解决方案(Windows 平台)
- CMake
add_subdirectory()
建联(*nix 平台)
依赖的版本管理直接复用 submodule 提供的特性。