
rippled/xrpld 的 Conan 2 高级配置指南自定义 Profile、Lockfile 与补丁配方【免费下载链接】rippledDecentralized cryptocurrency blockchain daemon implementing the XRP Ledger protocol in C项目地址: https://gitcode.com/GitHub_Trending/ri/rippled本篇指南面向需要深度定制构建环境的开发者完整讲解 XRP Ledger 守护进程xrpld当前仓库rippled的构建产物在 Conan 2 下的高级依赖管理实践如何创建与裁剪自定义 profile、如何借助 lockfile 锁定可复现的依赖版本、如何接入项目维护的补丁配方patched recipes远程仓库以及多编译器、多平台下的 profile 微调技巧。读完本文你将能够独立完成xrpld依赖树的定制、profile 排障与新增依赖的全流程操作。背景xrpld 为何选择 Conan 2 管理依赖xrpld是一个依赖规模相当大的 C 项目其直接依赖涵盖 Boost、OpenSSL、gRPC、protobuf、RocksDB、SOCIALsoci、libarchive、secp256k1、ed25519 等数十个库。仓库根目录的 conanfile.py 是依赖描述的源头它通过requires/test_requires/tool_requires声明依赖并通过default_options对每个依赖的编译选项做精细化控制例如大量库强制静态链接openssl/*:shared: False、grpc/*:shared: False等保证产物可移植关闭 gRPC 的各类语言插件csharp_plugin、python_plugin、ruby_plugin等均为False只保留 C 代码生成能力为 OpenSSL 关闭 DTLS、SSL 3.0、TLS 1.0/1.1 等过时协议并固定tls_security_level2通过configure()与requirements()按平台与开关动态补充依赖例如apple-clang下将 Boost 设为visibilityglobal开启rocksdb选项时才引入rocksdb/10.5.1。Conan 2 将编译器、标准库、架构等统称为setting由 profile 文件承载。项目在 conan/global.conf 中设置了并行下载、重试等全局行为并默认开启core:non_interactiveTrue。理解这些前提后下面按官方文档docs/build/advanced_conan.md的脉络逐层深入。一、自定义 Profile从conan profile detect开始Conan 2 的默认 profile 在首次执行时通过探测生成。如果默认 profile 不适用于你的环境且本地尚无 profile可执行conan profile detect该命令会探测操作系统、CPU 架构、默认编译器及其版本并生成$(conan config home)/profiles/default。注意profile 是一份可读文本你应当根据实际环境手工修正它。项目在 conan/profiles/default 中提供了一份模板 profileJinja2 模板由conan config install渲染安装可以当作环境校准的参照。它展示了几个关键约定compiler.cppstd23项目统一使用 C23 标准Linux/macOS 使用compiler.libcxx指定标准库 ABIWindows 使用compiler.runtimestatic[conf]段通过tools.build:compiler_executables显式钉住编译器可执行文件gcc/g或clang/clang避免 Boost 的 b2 构建系统探测到宿主系统上带版本后缀的编译器如g-15而逃逸出 Nix 等受控环境通过user.package:cppstd_version23与tools.info.package_id:confs将 cppstd 纳入包 ID 计算避免复用不同 cppstd 构建的二进制提升可复现性。如果conan profile detect生成的默认 profile 与上述模板存在差异建议以模板为基准对齐。项目也提供了 conan/init.sh 一键脚本将 conan/global.conf、conan/profiles目录整体安装进本地 Conan 配置并自动添加 xrplf 远程仓库可安全重复执行。二、Conan Lockfile锁定可复现的依赖快照依赖解析结果会随时间漂移新版本发布、配方修订为保证所有开发者与 CI 拿到完全一致的依赖项目使用 Conan lockfile 机制。仓库根目录的conan.lock即当前依赖树的快照其配套说明见 conan/lockfile/README.md。conan.lock会被conan命令隐式使用无需在命令行显式指定也正因如此凡是新增依赖或变更现有依赖的版本/修订号都必须同步更新它。更新方式是在仓库根目录执行./conan/lockfile/regenerate.sh该脚本的内部实现见 conan/lockfile/regenerate.sh值得注意使用mktemp -d创建临时 CONAN_HOME避免污染开发者本地的 Conan 缓存——本地缓存会导致 lockfile 不可复现以--index 0强制将xrplf远程置于 Conan Center 之前确保补丁配方优先删除旧conan.lock后分别用linux.profile、macos.profile、windows.profile三个平台的 profile 各执行一次conan lock create .将三个平台的依赖解析结果合并进同一个 lockfile实现一个 lockfile 覆盖三平台。三个平台 profile 位于 conan/lockfile/linux.profile、conan/lockfile/macos.profile、conan/lockfile/windows.profile均固定compiler.cppstd23并分别指定了 gcc 13 / libstdc11、apple-clang 17 / libc、MSVC 19.4 / dynamic runtime 等基线组合。你本地的 profile 不必与之一致lockfile 会在解析时按需适配。三、Patched Recipes接入 xrplf 补丁配方Conan Center 并非总能第一时间提供项目所需的配方某些依赖需要打补丁另一些则完全不在 Conan Center 中。项目因此维护了一个 Conan Center Index 的 forkXRPLF/conan-center-index存放修改过与新增的配方。方式一使用官方 xrplf 远程仓库推荐为保证补丁配方生效必须把 xrplf 远程添加到比默认 Conan Center 更高的索引即更靠前、优先被查询执行conan remote add --index 0 --force xrplf https://conan.xrplf.org/repository/conan/--index 0表示插入到索引 0最优先--force用于覆盖可能已存在的同名远程。这也是 conan/init.sh 与 conan/lockfile/regenerate.sh 内部共同采用的做法。若官方 Conan Center 更新后不再需要补丁新版本配方会自动从 Conan Center 拉取无需你额外操作。方式二从 fork 仓库稀疏检出并本地导出不便访问远程时可以从 fork 仓库只检出所需配方目录再本地导出# Define which recipes to export. recipes(abseil ed25519 mpt-crypto openssl secp256k1 snappy soci wasm-xrplf wasmi) # Selectively check out the recipes from our CCI fork. cd external mkdir -p conan-center-index cd conan-center-index git init git remote add origin gitgithub.com:XRPLF/conan-center-index.git git sparse-checkout init for recipe in ${recipes[]}; do echo Checking out recipe ${recipe}... git sparse-checkout add recipes/${recipe} done git fetch origin master git checkout master ./export_all.sh cd ../../要点解析recipes数组列出当前需要补丁的配方abseil、ed25519、mpt-crypto、openssl、secp256k1、snappy、soci、wasm-xrplf、wasmi其中mpt-crypto、wasm-xrplf等在 conanfile.py 的requirements()中确有引用如mpt-crypto/1.0.2git sparse-checkout只拉取recipes/name目录避免下载整个索引仓库仓库内自带的export_all.sh会批量将所选配方导出到本地 Conan 缓存命令在external/下操作cd ../../最后回到仓库根目录。切换依赖版本时的注意事项当依赖升级到仍需补丁的版本时需要重新拉取 fork 的最新变更并重新导出对应配方如果升级后的版本不再需要补丁则无需任何操作。另外有一个重要警告手动执行conan export时为避免自动套用仓库现有的conan.lock可能需要在conan install命令后追加--lockfile但文档明确不推荐这样做——因为脱离 lockfile 可能导致你本地使用不同修订号的配方破坏可复现性。四、Conan Profile Tweaks常见排障与微调4.1 编译器版本不被识别Missing compiler version执行conan profile show时若看到如下错误说明探测到的编译器版本不在 Conan 内置的合法列表中ERROR: Invalid setting 17 is not a valid settings.compiler.version value. Possible values are [5.0, 5.1, 6.0, 6.1, 7.0, 7.3, 8.0, 8.1, 9.0, 9.1, 10.0, 11.0, 12.0, 13, 13.0, 13.1, 14, 14.0, 15, 15.0, 16, 16.0]解决办法创建$(conan config home)/settings_user.yml若不存在把所需版本号加入对应编译器的version数组例如为 apple-clang 增加 17.0compiler: apple-clang: version: [17.0]这与 conan/lockfile/macos.profile 中compiler.version17.0的基线完全对应——项目锁文件已实际使用该版本号说明这是官方 CI 验证过的配置。4.2 多编译器共存Multiple compilers机器上同时装有多套编译器时必须在执行conan profile detect之前通过CC/CXX环境变量选定目标编译器否则探测结果不可控。例如 macOS 上希望使用 Homebrew 的 LLVM18export CC$(brew --prefix llvm18)/bin/clang export CXX$(brew --prefix llvm18)/bin/clang conan profile detect更稳妥的做法是在 profile 文件的[conf]段显式写出编译器可执行文件路径避免CC/CXX与所选 profile 冲突导致的编译错乱[conf] tools.build:compiler_executables{c:/usr/bin/gcc,cpp:/usr/bin/g}这正是 conan/profiles/default 模板中已内建的做法其注释解释了为何要钉住可执行文件Boost 配方用 b2 构建、不走 Conan toolchain其回退探测逻辑可能选中宿主系统带版本后缀的编译器导致与受控环境库不匹配。JSON 风格的{c: ..., cpp: ...}写法在 Conan 2 中也可直接置于 profile 文件。4.3 多套 Profile 并存Multiple profilesConan 2 的所有 profile 存放在$(conan config home)/profiles目录。可以复制default为其他名称再新建一套default指向不同编译器从而在同一台机器上按需切换工具链。例如mv $(conan config home)/profiles/default $(conan config home)/profiles/default-gcc13 # 再次执行 conan profile detect 生成新的 default如 clang 版本切换时用--profilename指定。项目本身的 conan/profiles/ci 与 conan/profiles/sanitizers 就是以 default 为基础叠加补充配置的典型ci在 Linux 上把 libc 版本纳入包 IDsanitizers通过include(default)继承默认 profile再根据SANITIZERS环境变量如address,undefinedbehavior注入 ASan/TSan/UBSan 的编译与链接参数并为 Boost.Context 选择 ucontext 后端以支持 fiber 切面的 sanitizer 注解。4.4 选择语言标准Select languageConan 默认生成的 profile 选定的 C 方言通常不是项目使用的 C23。需要把 profile 中以compiler.cppstd开头的行改成23sed -i.bak -e s|^compiler\.cppstd.*$|compiler.cppstd23| $(conan config home)/profiles/default-i.bak会先备份原文件再就地修改。项目所有官方 profileconan/profiles/default、三个 lockfile profile均使用compiler.cppstd23conanfile.py 也通过default_options与[conf]把 cppstd 纳入包 ID确保二进制严格对应 C23 构建。4.5 Linux 选择标准库 ABISelect standard libraryLinux 上 Conan 默认 profile 通常用 GCC 编译并链接 libstdc。只要 profile 设置是compiler.libcxx即链接 libstdc就必须选择libstdc11ABI新版 GCC 的默认 ABI与老旧的libstdcABI 二进制不兼容sed -i.bak -e s|^compiler\.libcxx.*$|compiler.libcxxlibstdc11| $(conan config home)/profiles/default对照 conan/lockfile/linux.profile官方 Linux 基线正是compilergcccompiler.libcxxlibstdc11。注意如果你改用 libcclang此设置不适用。4.6 Windows 选择架构与运行时Select architecture and runtimeWindows 开发者必须使用 x64 原生构建工具链最简单的方式是打开 Visual Studio 的 x64 Native Tools Command Prompt 快捷方式针对你安装的 VS 版本。随后还必须让xrpld及其全部依赖面向 x64 架构构建sed -i.bak -e s|^arch.*$|archx86_64| $(conan config home)/profiles/default同时必须选择静态运行时sed -i.bak -e s|^compiler\.runtime.*$|compiler.runtimestatic| $(conan config home)/profiles/default这与 conan/profiles/default 模板中 Windows 分支的逻辑一致compiler.runtimestatic。官方 conan/lockfile/windows.profile 使用的是 MSVC 19.4、archx86_64、compiler.runtimedynamic的 Release 组合供 lockfile 生成使用本地实际编译时以静态运行时为项目推荐基线。注意build_type也应在 profile 中与你的构建类型Debug/Release保持一致。五、添加新依赖从搜索到编码的完整流程想在本地实验一个新包按以下五步操作对应文档Add a Dependency一节并结合仓库源码给出落点第 1 步确认包存在。在 Conan Center 搜索目标包及其版本号确保名称/版本/选项可解析。第 2 步修改 conanfile.py。两处改动在requires属性中添加包名/版本号形式的条目requires列表用于始终启用的依赖若依赖受构建选项控制则应像requirements()中rocksdb、jemalloc、benchmark那样条件式self.requires(...)若需要覆盖该包的默认选项在default_options中按$package:$option: $value语法添加例如boost/*:without_cobalt: True。注意*通配符表示对所有版本生效。第 3 步重新生成 lockfile。让新依赖被快照捕获./conan/lockfile/regenerate.sh第 4 步修改根目录 CMakeLists.txt。两处改动添加find_package($package REQUIRED)调用。现有第 105–117 行已集中列出全部find_package如find_package(OpenSSL REQUIRED)、find_package(SOCI REQUIRED)等新依赖照此追加将包提供的库链接到目标xrpl_libs找到现有的target_link_libraries(xrpl_libs INTERFACE ...)调用位于 CMakeLists.txt把包名::库名追加进INTERFACE列表。若包需额外预处理定义可参照 RocksDB 的做法set_target_properties(... PROPERTIES INTERFACE_COMPILE_DEFINITIONS ...)后再链接。第 5 步开始编码。在源码中包含你需要的头文件即可使用该依赖。如果新依赖仍需补丁配方请回到第三节把配方名追加进recipes数组并重新导出若版本已无需补丁则跳过此步Conan 会从 Conan Center 自动拉取。六、验证与排障速查完成配置后可用以下命令做快速自检conan profile show # 查看当前生效 profile核对 compiler/cppstd/libcxx/arch conan remote list # 确认 xrplf 位于索引 0且先于 conancenter conan lock list conan.lock # 查看锁文件中各依赖的版本与修订号常见问题的排查思路报Invalid setting ... settings.compiler.version→ 按 4.1 节补settings_user.yml链接期 ABI 不匹配如GLIBCXX_3.4.x not found→ 检查compiler.libcxx是否已设为libstdc114.5 节依赖版本与 lockfile 不一致 → 重新执行./conan/lockfile/regenerate.sh补丁配方未生效 → 确认conan remote list中 xrplf 的索引为 0或按方式二本地导出后重跑conan install。本文所有命令与配置均以当前仓库为准profile 模板见 conan/profiles/defaultlockfile 生成逻辑见 conan/lockfile/regenerate.sh依赖描述见 conanfile.pyCMake 侧接入见 CMakeLists.txt。对照仓库内三平台 profile 与 CI/sanitizers 补充配置即可搭建出与官方基线一致、且可复现的xrpld构建环境。【免费下载链接】rippledDecentralized cryptocurrency blockchain daemon implementing the XRP Ledger protocol in C项目地址: https://gitcode.com/GitHub_Trending/ri/rippled创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考