playbook/docs/cpp/dependencies_conan.md

80 lines
3.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# C++ 第三方依赖Conan
本章节给出 Conan + CMake 的推荐落地方式(参考 `tsl-devkit/lsp-server/` 的实践)。
## 1. 基本约定
- 依赖清单使用 `conanfile.txt`(或项目统一的 `conanfile.py`)。
- 本 Playbook 不内置“标准依赖集合/固定版本”;依赖选择与版本锁定由具体项目维护。
- Conan`2.x`(本 Playbook 假设 Conan 2不保证 Conan 1 的兼容性)
- 生成器使用:
- `CMakeDeps`
- `CMakeToolchain`
- layout 使用:`cmake_layout`(让 build 目录结构稳定可预测)
## 2. 目录与文件(建议)
```txt
cpp/
conanfile.txt
conan/
profiles/
<platform>-<arch>-clang
windows-<arch>-clang-cross
CMakeLists.txt
CMakeUserPresets.json
build/ # 本地/CI 生成,通常不入库
```
## 3. Profile 命名与含义(规范)
- Profile 文件名按“产物平台”为前缀,避免误读:
- `linux-...`:产物平台为 Linux`[settings] os=Linux`
- `windows-...`:产物平台为 Windows`[settings] os=Windows`
- 跨编译 profile 建议以 `-cross` 结尾(例如 `windows-x86_64-clang-cross`)。
- “工具链版本”以 profile 的 `[settings] compiler.version` 为准;如同一仓库并存多版本 clang可将版本体现在文件名中例如 `linux-x86_64-clang20`)。
## 4. 安装与构建(推荐流程)
在项目的 C++ 根目录(例如 `cpp/`)下:
1. 安装依赖并生成工具链文件:
- `CONAN_HOME=/tmp/conan-home conan install . -pr:b=conan/profiles/linux-x86_64-clang -pr:h=conan/profiles/windows-x86_64-clang-cross -of build/windows-x86_64-clang-cross --build=missing`
- 若有 profile`-pr:h=conan/profiles/<...> -pr:b=conan/profiles/<...>`
2. 配置 CMake
- 直接指定 toolchain
- `cmake -S . -B build/clang -G Ninja -DCMAKE_TOOLCHAIN_FILE=$PWD/build/clang/Release/generators/conan_toolchain.cmake`
- 或使用 Presets推荐见下节
- `cmake --preset conan-release`
3. 构建:
- `cmake --build --preset conan-release -j 8`
提示:如遇到 Conan 缓存/家目录权限问题,可临时设置 `CONAN_HOME=/tmp/conan-home` 再执行。
## 5. CMake Presets推荐做法
Conan 2 可以生成 CMake Presets通常落在 `build/<...>/generators/CMakePresets.json`)。
推荐将一个稳定的 `CMakeUserPresets.json` 放进仓库并 include 生成文件(参考 `tsl-devkit/lsp-server/CMakeUserPresets.json`),例如:
```json
{
"version": 4,
"vendor": { "conan": {} },
"include": ["build/clang-linux/Release/generators/CMakePresets.json"]
}
```
这样团队/CI 就可以统一使用:
- 配置:`cmake --preset conan-release`
- 构建:`cmake --build --preset conan-release -j 8`
- 测试:`ctest --preset conan-release --output-on-failure`
## 6. 模板文件(本 Playbook
- `templates/cpp/conanfile.txt`
- `templates/cpp/CMakeUserPresets.json`
- `templates/cpp/conan/profiles/linux-x86_64-clang`
- `templates/cpp/conan/profiles/windows-x86_64-clang-cross`