CMake 项目中 Vcpkg、Conan 与 Spack 的 C++ 依赖管理对比

我最近用过一点 Vcpkg,也在更好地了解它。我也看过 Conan,但最近没怎么深入研究 Spack。我从开发者的角度来看,想改进第三方依赖的处理。这并不是要穷尽一切,而是想探讨我最感兴趣的一个具体用例:在某些依赖关系很大需要缓存的情况下,我能以最优雅的方式处理我的项目依赖。
Conan
一开始让我却步的是 Python 的要求,这意味着我需要很大程度上依赖所有依赖。话虽如此,安装过程相当简单:
mkvirtualenv conan
pip install conan --upgrade
Arch Linux 上还有一个 AUR 包。有了之后,你需要创建一个包含依赖的 conanfile.txt,以及使用 conan profile detect 的 Conan 配置文件。配置文件包含了可以使用的 C++ 标准和构建模式。所以你需要创建一个配置文件用于调试、发布等。
我喜欢默认依赖指定方式的一点是规范中使用了版本。以下是我添加到 angohr 仓库以满足相同 vcpkg 依赖的内容:
[requires]
fmt/10.2.1
gtest/1.14.0
spdlog/1.13.0
[generators]
CMakeDeps
CMakeToolchain
然后使用配置文件安装这些依赖:
conan install --output-folder=build-release --build=missing
一旦完成这些操作,命令会自动在 CMakeUserPresets.json 添加该目录中的文件,这意味着我现有的预设不容易被重用。为了测试,我选择了以下几种:
CC=clang CXX=clang++ cmake -G Ninja --preset conan-release -DDuckDB_DIR=/home/marcus/src/duckdb/build
完成这些并修复了 CMake 代码中的一个 bug 后,我就能成功编译项目并运行测试。这个提交显示了依赖文件的添加,以及它发现的实际查找和使用 spdlog 的修复方法。
Spack
Spack 也有类似的依赖,这让我对 Conan 有兴趣,因为它基于 Python,意味着我的依赖构建依赖相当大。我知道我们通常都有 Python 可用,所以绝不是致命缺点。它还提供克隆或 Arch Linux 的 AUR 包。我试过用这个包,但每次运行时都会被要求权限提升,我在这种情况下可不想要!所以克隆的方法是:
git clone -c feature.manyFiles=true https://github.com/spack/spack.git .
source spack/share/spack/setup-env.sh
这提供了一个不试图获得更多权限的安装,接下来是如何指定我的项目依赖。文档内容详尽,仔细阅读后,环境大概是我在这个语境下想要的。
spack env create angohr
spack env activate angohr
然后,您向环境添加规格有点奇怪:
spack add fmt
spack add googletest
spack add spdlog
spack install

