新闻详情

新闻详情

首页 / 资讯中心 / 详情

MongoDB 仓库中基于 Bazel 与 WASI SDK 的 WebAssembly 构建集成指南

发布时间:2026/9/11 12:29:20来源:尧图网络
MongoDB 仓库中基于 Bazel 与 WASI SDK 的 WebAssembly 构建集成指南
MongoDB 仓库中基于 Bazel 与 WASI SDK 的 WebAssembly 构建集成指南【免费下载链接】mongoThe MongoDB Database项目地址: https://gitcode.com/GitHub_Trending/mo/mongo导读本指南围绕 MongoDB 开源仓库中bazel/toolchains/cc/mongo_wasm/README.md所描述的核心用法展开讲解如何利用 Bazel 的select条件选择与配置转换transition机制将传统 C/C 目标以 WASI 兼容的方式交叉编译为 WebAssemblywasm32-wasip2产物。读完本文你将掌握wasi_compatible条件标签的判定逻辑、with_wasi_config转换规则的接入方式以及仓库内 WASI 工具链的底层构成WASI SDK 拉取、Clang 编译参数、链接参数与平台约束可直接在 MongoDB 仓库的构建体系中复刻同样的 WASM 集成方案。说明本文涉及仓库路径均以当前仓库实际布局bazel/toolchains/cc/mongo_wasm为准README 中出现的//bazel/toolchains/cc/wasm/...为历史路径写法阅读时需对应到mongo_wasm包。一、背景为什么 MongoDB 需要 WASI 工具链WebAssemblyWasm提供了一种可移植、沙箱化的执行环境。WASIWebAssembly System Interface则是 Wasm 在系统层面的标准化接口让编译产物可以访问文件、时钟等系统能力。在 Bazel 构建体系下要把仓库中已有的 C/C 目标交叉编译到 wasm32-wasip2必须同时解决三件事宿主平台限制WASI SDK 对运行宿主的 glibc 版本有要求不是所有 CI 镜像都能直接使用工具链接入需要为bazel_tools//tools/cpp:toolchain_type注册一套针对 wasm32-wasip2 的 C/C 工具链配置切换被编译的目标必须携带一组与 WASM 匹配的 Bazel 配置编译器、链接方式、关闭各类 sanitizer 等。MongoDB 仓库的bazel/toolchains/cc/mongo_wasm/目录正是这三件事的完整落地README 则记录了开发者接入该工具链的两种标准姿势。二、用法一通过wasi_compatible条件选择接入 WASI 目标README 给出的第一种方式是使用select语句根据当前配置是否为wasi_compatible来决定依赖解析到哪个目标select({ //bazel/toolchains/cc/wasm:wasi_compatible: [ //bazel/toolchains/cc/wasm/sample:dist_hello_world, ], //conditions:default: [], })按当前仓库的实际包名条件标签应写作//bazel/toolchains/cc/mongo_wasm:wasi_compatible。其含义是当构建处于 WASI 兼容配置时把依赖列表解析为 WASM 分发的目标示例中的dist_hello_world否则解析为空列表。2.1wasi_compatible的判定逻辑这个条件标签并非内置而是在 bazel/toolchains/cc/mongo_wasm/BUILD.bazel 中通过selects.config_setting_group组合出来的selects.config_setting_group( name wasi_compatible, match_all [ :not_rhel8_or_amazon_linux_2, :x86_or_aarch64, ], )它由两组子条件取交集match_all构成:not_rhel8_or_amazon_linux_2由:not_rhel8与:not_amazon_linux_2取交集即宿主平台不是RHEL 8 也不是 Amazon Linux 2。从源码注释可以确认原因WASI SDK requires a more modern version of glibc than these distros have (in our images)即仓库 CI 镜像中这两类发行版自带的 glibc 过旧无法运行 WASI SDK:x86_or_aarch64match_any匹配platforms//cpu:x86_64或platforms//cpu:aarch64即仅支持这两类主流 CPU 架构。两个组件的判定矩阵如下子条件组成匹配的平台源码位置not_rhel8match_anyubuntu18/20/22/24、amazon_linux_2023、debian10/12/13、rhel9、suse12/15/16BUILD.bazel#L26-L43not_amazon_linux_2match_anyubuntu18/20/22/24、amazon_linux_2023、debian10/12/13、rhel8/9、suse12/15/16BUILD.bazel#L7-L24not_rhel8_or_amazon_linux_2match_all上述两者同时满足BUILD.bazel#L45-L51x86_or_aarch64match_anyx86_64 或 aarch64BUILD.bazel#L53-L59wasi_compatiblematch_all前三者与第四者同时满足BUILD.bazel#L61-L68这套组合在实际 CI 环境中的效果是只有当宿主是 Ubuntu/Debian/RHEL9/SUSE 等现代 glibc 发行版且 CPU 为 x86_64/aarch64 时select才会解析到 WASM 目标从而避免在 glibc 过旧的镜像上触发 WASI SDK 相关构建。三、用法二通过with_wasi_config转换规则复用传统 Bazel 目标README 指出如果目标是以传统 Bazel C/C 目标的形式定义的可以直接使用WASI transition来确保 Bazel 选项与 WASI 兼容。示例load(//bazel/toolchains/cc/wasm/toolchain:with_wasi_config.bzl, with_wasi_config) with_wasi_config( name dist_hello_world, srcs [ :hello_world, ], )按当前仓库路径对应文件为 bazel/toolchains/cc/mongo_wasm/toolchain/with_wasi_config.bzl。3.1 规则的实现load(//bazel/toolchains/cc/mongo_wasm/toolchain:wasi_transition.bzl, wasi_transition) def _with_wasi_config_impl(ctx): return [DefaultInfo(files depset(ctx.files.srcs))] with_wasi_config rule( implementation _with_wasi_config_impl, attrs { srcs: attr.label_list( cfg wasi_transition, # 所有依赖穿过该转换 allow_files True, ), }, )可以看到该规则本身几乎不做构建逻辑——它的srcs属性通过cfg wasi_transition让所有被依赖的目标在转换后的配置下重新编译规则实现只负责把产出的文件透传为DefaultInfo。换句话说它是一层配置切换壳内层的:hello_world仍然是普通的 Bazel C/C 目标无需为 WASM 单独编写构建规则。3.2wasi_transition到底切换了什么转换的具体内容定义在 bazel/toolchains/cc/mongo_wasm/toolchain/wasi_transition.bzlreturn { //command_line_option:extra_toolchains: //bazel/toolchains/cc/mongo_wasm/toolchain:wasi_cc_toolchain_wasip2, //command_line_option:platforms: //bazel/platforms:wasm32, //bazel/config:compiler_type: clang, //bazel/config:libunwind: off, //bazel/config:allocator: system, //bazel/config:ssl: False, //bazel/config:linkstatic: True, //bazel/config:asan: False, //bazel/config:fsan: False, //bazel/config:lsan: False, //bazel/config:msan: False, //bazel/config:tsan: False, //bazel/config:ubsan: False, //bazel/config:gcov: False, //bazel/config:coverage: False, //command_line_option:copt: [], //command_line_option:linkopt: [], }各配置项的作用配置项值含义extra_toolchainswasi_cc_toolchain_wasip2为编译注入 WASI 工具链使其可被解析platforms//bazel/platforms:wasm32目标平台切换到 wasm32compiler_typeclang编译器类型固定为 Clanglibunwindoff关闭 libunwindWASM 环境不适用传统 unwindallocatorsystem使用系统分配器sslFalse关闭 SSL 依赖linkstaticTrue强制静态链接asan/fsan/lsan/msan/tsan/ubsan/gcov/coverageFalse全部关闭各类 sanitizer 与覆盖率插桩copt/linkopt[]清空附加编译/链接选项避免宿主配置泄漏转换的inputs为空、outputs列出上述全部键意味着该转换不依赖任何当前配置直接输出一套全新的 WASI 配置快照。3.3 同一转换在 wasm_rules 中的复用wasi_transition并非只服务这一个规则它还被 bazel/wasm_rules/wasm_cc_binary.bzl 内部引用用于对规则的所有依赖deps与srcs统一应用转换从而保证传统 C/C 目标在 WASI 配置下编译。此外 bazel/mongo_src_rules.bzl#L1165 的注释也提到 Mongo 的wasi_transition会作用于消费者配置。这说明该转换是仓库内 WASM 构建体系的公共底座。四、底层支撑WASI 工具链的完整构成with_wasi_config之所以能一键切换靠的是仓库内一整套完整的 WASI 工具链定义分布在bazel/toolchains/cc/mongo_wasm/toolchain/下的三个核心文件中。4.1 工具链注册toolchain/BUILD.bazeltoolchain/BUILD.bazel 定义了 WASI Preview2wasm32-wasip2的工具链与平台绑定wasi_cc_toolchain_config_wasip2( name wasi_cc_toolchain_config_wasip2, ar wasi_sdk//:llvm-ar, clang wasi_sdk//:wasm32-wasip2-clang, clangpp wasi_sdk//:wasm32-wasip2-clang, ) cc_toolchain( name wasi_cc_toolchain_wasip2_impl, all_files :wasi_files, ... toolchain_config :wasi_cc_toolchain_config_wasip2, toolchain_identifier wasi_sdk_cc_wasip2, ) toolchain( name wasi_cc_toolchain_wasip2, target_compatible_with [ platforms//os:wasi, platforms//cpu:wasm32, ], toolchain :wasi_cc_toolchain_wasip2_impl, toolchain_type bazel_tools//tools/cpp:toolchain_type, )关键点target_compatible_with声明该工具链只对platforms//os:wasiplatforms//cpu:wasm32的目标生效这与转换中platforms //bazel/platforms:wasm32严格对应由于部分工具dwp/objcopy/strip在 WASM 场景用不到dwp_files、objcopy_files、strip_files均指向一个空的filegroup:wasi_files文件组把wasi_sdk外部仓库的bin、include、lib、share四个目录整体暴露给工具链使用。4.2 工具链配置cc_toolchain_config_wasip2.bzltoolchain/cc_toolchain_config_wasip2.bzl 是这套工具链最实质的部分它通过action_config而非传统tool_path绑定外部依赖中的 Clang/Clang/llvm-ar并把所有未用工具指向/usr/bin/false作为占位源码注释明确Action configs will do their work instead。其中值得关注的编译与链接参数目标与 sysroot--targetwasm32-wasip2--sysroot{wasi_sdk}/share/wasi-sysroot体积优化-Oz、-ffunction-sections、-fdata-sections配合链接期-Wl,--gc-sections、-Wl,--strip-debug控制产物体积WASI 模拟层-D_WASI_EMULATED_SIGNAL、-D_WASI_EMULATED_MMAN、-D_WASI_EMULATED_PROCESS_CLOCKS、-D_WASI_EMULATED_GETPID启用 POSIX API 的 syscall 模拟并在链接期对应加入-lwasi-emulated-signal等库平台差异处理-DBOOST_LOG_WITHOUT_SYSLOGWASI 平台无 syslog 支持C20 与异常-stdc20、-fexceptions并通过-fwasm-exceptions-mllvm --wasm-use-legacy-ehfalse启用 WebAssembly 结构化异常处理提案try_table/exnref以匹配 wasi-sdk 33 的eh/运行时库对应 wasmtime 44 的 Cranelift AOT头文件适配-include wasm32-wasip2/assert.hAbseil 需要 assert()、-include stdlib.hfmt 需要 malloc/free内置头文件目录cxx_builtin_include_directories列出 wasi-sysroot 的 C 头文件、Clang 22 内置头文件等覆盖率降级通过空feature(name coverage)覆盖 Bazel 内置 coverage 特性——因为 WASI SDK 不带libclang_rt.profile.a若不覆盖bazel coverage注入的插桩参数会导致链接失败include 路径特性include_paths与external_include_paths两个 feature 与 Linux 工具链保持一致确保 Abseil 等外部仓库头文件能被尖括号包含解析。4.3 WASI SDK 的拉取wasi_repo.bzltoolchain/wasi_repo.bzl 是一个repository_rule按宿主 OS/架构从发行版下载wasi-sdk 33并解压支持平台矩阵linux/macos/windows×aarch64/amd64另含linux s390x与linux ppc64le的特殊构建托管于 MongoDB 自己的 S3 bucket每个条目都带sha256校验保证可复现构建生成wasi_sdk仓库内的BUILD.bazel暴露bin/include/lib/share四个 filegroup并创建跨平台一致的别名wasm32-wasip2-clang、wasm32-wasip2-clang、llvm-arWindows 下通过.exe后缀适配对于不支持的平台组合会直接fail(Unsupported platform for wasi-sdk: ...)。这也是第一节中wasi_compatible条件存在的原因之一即使宿主架构满足要求WASI SDK 对 glibc 的版本要求也约束了可运行的基础镜像。五、实战接入步骤汇总结合 README 与源码在一个 Bazel 目标上启用 WASI 编译的完整路径为确认宿主符合wasi_compatible构建平台须为 ubuntu18/20/22/24、amazon_linux_2023、debian10/12/13、rhel9、suse12/15/16 之一且 CPU 为 x86_64/aarch64详见 BUILD.bazel使用select条件依赖注入型在依赖列表中按//bazel/toolchains/cc/mongo_wasm:wasi_compatible条件选择 WASM 分发目标或使用with_wasi_config规则目标转换型为传统 C/C 目标包一层转换壳srcs传入原始目标即可产物检查with_wasi_config的DefaultInfo直接透传转换后编译产出的文件可继续接入打包、测试等下游环节。六、总结MongoDB 仓库的 WASM 构建能力可以概括为一套条件 转换 工具链的三层设计条件层wasi_compatible用config_setting_group精确限定宿主平台避免在 glibc 过旧的 CI 镜像上误触 WASI 构建转换层wasi_transition一次性快照出全部 WASI 相关 Bazel 配置工具链、平台、编译器、sanitizer、链接方式with_wasi_config与wasm_cc_binary均复用它工具链层wasi_repo.bzl拉取 wasi-sdk 33cc_toolchain_config_wasip2.bzl负责把 Clang 的编译/链接参数、WASI 模拟层、异常处理与 include 路径全部落到 Bazel 可执行的 action 配置上。README 虽短但其描述的两条接入路径背后是一套可用于把任意传统 C/C 目标交叉编译到 wasm32-wasip2 的完整基础设施。开发者如需在仓库内新增 WASM 产物只需遵循select条件或with_wasi_config包裹两种方式之一即可复用这套已被 CI 验证过的 WASI 工具链。延伸阅读bazel/toolchains/cc/mongo_wasm/toolchain/wasi_transition.bzl — 转换规则定义bazel/toolchains/cc/mongo_wasm/toolchain/cc_toolchain_config_wasip2.bzl — 工具链编译/链接参数bazel/toolchains/cc/mongo_wasm/toolchain/wasi_repo.bzl — WASI SDK 拉取与跨平台别名bazel/wasm_rules/wasm_cc_binary.bzl —wasi_transition的另一个消费方bazel/toolchains/cc/mongo_wasm/toolchain/testdata — WASI 编译测试夹具wasi_compile_fixture.cpp与冒烟测试脚本【免费下载链接】mongoThe MongoDB Database项目地址: https://gitcode.com/GitHub_Trending/mo/mongo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

7×24云端AI程序员:K8s原生架构实现企业级AI编码自治 2026/9/11 13:02:25

7×24云端AI程序员:K8s原生架构实现企业级AI编码自治

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
微网群分布式优化调度:目标级联法原理与Matlab实现 2026/9/11 13:02:25

微网群分布式优化调度:目标级联法原理与Matlab实现

1. 项目背景与核心价值微网群分布式优化调度是当前能源互联网领域的前沿研究方向。随着可再生能源渗透率不断提高,传统集中式调度方法在计算效率、隐私保护和扩展性等方面面临严峻挑战。目标级联法(Analytical Target Cascading, ATC)作为一种…

阅读更多 →
AI Coding新玩法:200个Agent并行协作的工程实践与避坑指南 2026/9/11 13:02:25

AI Coding新玩法:200个Agent并行协作的工程实践与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
不联网也能把语音转成文字:Vosk 离线语音识别实用笔记 2026/9/11 13:02:25

不联网也能把语音转成文字:Vosk 离线语音识别实用笔记

不联网也能把语音转成文字:Vosk 离线语音识别实用笔记 【免费下载链接】vosk-api Offline speech recognition API for Android, iOS, Raspberry Pi and servers with Python, Java, C# and Node 项目地址: https://gitcode.com/GitHub_Trending/vo/vosk-api …

阅读更多 →
OmX `autoresearch` 命令契约全解:从 CLI parity 到 runtime 状态机的实现指南 2026/9/11 13:02:25

OmX `autoresearch` 命令契约全解:从 CLI parity 到 runtime 状态机的实现指南

OmX autoresearch 命令契约全解:从 CLI parity 到 runtime 状态机的实现指南 【免费下载链接】oh-my-codex OmX - Oh My codeX: Your codex is not alone. Add hooks, agent teams, HUDs, and so much more. 项目地址: https://gitcode.com/GitHub_Trending/oh/oh…

阅读更多 →
4 个环节搭好 umi 自定义模板:让 umi create 一条命令生成团队标准项目 2026/9/11 12:59:25

4 个环节搭好 umi 自定义模板:让 umi create 一条命令生成团队标准项目

4 个环节搭好 umi 自定义模板:让 umi create 一条命令生成团队标准项目 【免费下载链接】umi A framework in react community ✨ 项目地址: https://gitcode.com/GitHub_Trending/um/umi 团队里新开一个项目,很多人第一反应是打开那个最成熟的老…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞