ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

MongoDB 仓库 Windows 主机跨构建指南:基于 Host Cross RBE 的 hermetic 交叉编译方案

MongoDB 仓库 Windows 主机跨构建指南:基于 Host Cross RBE 的 hermetic 交叉编译方案 MongoDB 仓库 Windows 主机跨构建指南基于 Host Cross RBE 的 hermetic 交叉编译方案【免费下载链接】mongoThe MongoDB Database项目地址: https://gitcode.com/GitHub_Trending/mo/mongo导读本文围绕 MongoDB 开源仓库bazel/docs/windows_hermetic_container_cross.md中的 Windows 跨构建模式展开在 Windows 主机上运行 Bazel由 Bazel 客户端负责分析C 编译与源码生成类 action 通过交叉工具链包装入口投递到 Linux RBE远程执行或本地 Linux 容器中执行最终生成的 Windows x86_64 二进制再由bazel run在本机工作区中直接运行。读完本文你将掌握--configwindows-cross-x86_64的启用方式、MONGO_WINDOWS_CROSS_*系列环境变量的完整含义、hermetic 工具链输入LLVM 与 Windows sysroot的提供方式以及 WSL2 Docker Engine 这一受支持的 Windows Server 运行环境搭建方法。模式概述Windows 主机、Linux 执行、Windows 产物该跨构建模式专为Windows 主机 原生 MSVC 工具链的常规构建之外的实验性集成而设计。其核心分工如下Bazel 客户端/服务端、仓库拉取、workspace status、bazel run均在 Windows 主机上原生执行C 编译与 generated-source action通过交叉工具链包装入口在 Linux RBE或本地 Linux 容器上执行测试目标由bazel run在本地工作区中运行生成的 Windows.exe。这与仓库中另外两种跨平台模式Linux 主机容器构建与 s390x/ppc64le 交叉 RBE、macOS 主机跨构建形成对照macOS/Linux 模式侧重本机执行构建动作而 Windows 模式的核心是在 Windows 主机上用 Linux 执行环境产出 Windows 二进制。一条命令的完整链路bazel build --configwindows-cross-x86_64 install-dist-test .\bazel-bin\install-dist-test\bin\mongod.exe --version第一条命令在 Windows 上以交叉模式构建install-dist-test安装目录树测试目标第二条命令直接运行产物目录下的mongod.exe验证本机工作区已下载了顶层输出的 Windows 二进制。使用方式显式 config、默认环境变量与绕过机制Windows 构建默认使用原生 MSVC 工具链文档明确说明Windows 构建默认使用原生 MSVC 工具链只有显式传入--configwindows-cross-x86_64才会进入实验性的 host-cross 集成。该 config 在仓库根目录的 .bazelrc 中有完整定义common:windows-cross-x86_64 --platforms//bazel/platforms:windows_x86_64_cross common:windows-cross-x86_64 --//bazel/config:compiler_typemsvc common:windows-cross-x86_64 --//bazel/config:linkerauto common:windows-cross-x86_64 --//bazel/config:linkstaticTrue common:windows-cross-x86_64 --//bazel/config:skip_archiveFalse common:windows-cross-x86_64 --//bazel/config:build_atlasFalse common:windows-cross-x86_64 --fissionno common:windows-cross-x86_64 --//bazel/config:create_dwpFalse common:windows-cross-x86_64 --//bazel/config:compress_debug_compileFalse common:windows-cross-x86_64 --remote_download_outputstoplevel common:windows-cross-x86_64 --remote_download_regex.*\.(exe|dll|lib|pdb|res|manifest|json|txt)$逐项含义--platforms//bazel/platforms:windows_x86_64_cross将目标平台切换为 Windows x86_64 交叉平台--//bazel/config:compiler_typemsvc编译器类型固定为 MSVC 兼容工具链--//bazel/config:linkerauto、linkstaticTrue、skip_archiveFalse链接器自动选择、静态链接优先、保留归档动作--fissionno、create_dwpFalse、compress_debug_compileFalse关闭 fission 调试信息拆分与 DWP 生成等对交叉场景不必要的功能--remote_download_outputstoplevel只下载顶层目标输出--remote_download_regex仅回传exe/dll/lib/pdb/res/manifest/json/txt等 Windows 产物形态避免回传海量中间文件。让构建类命令默认进入交叉模式对于build、fetch、cquery、aquery这类构建导向的命令可通过环境变量让当前 shell 默认进入交叉模式$env:MONGO_WINDOWS_CROSS_DEFAULT_CONFIG1从源码看这一逻辑在 bazel/wrapper_hook/hermetic_container_integration.py 中被明确编码WINDOWS_CROSS_DEFAULT_COMMANDS frozenset([aquery, build, cquery, fetch])即只有这四类命令会响应默认交叉模式同时WINDOWS_CROSS_DEFAULT_CONFIG_ENV MONGO_WINDOWS_CROSS_DEFAULT_CONFIG与该环境变量对应。bazel run测试目标的交叉默认行为开启上述环境变量后bazel run对测试目标也默认走 Windows 交叉模式通过交叉包装/RBE 路径构建然后在 Windows 主机上运行产物bazel run stdx_test注意两点边界bazel test不会被自动路由到 Windows 交叉模式对于非测试目标的bazel run需要自行构建目标再从 PowerShell 运行下载下来的.exe。显式绕过 host-cross 集成即使显式传入了--configwindows-cross-x86_64也可以整体绕过 host-cross 集成$env:MONGO_BAZEL_USE_HERMETIC_CONTAINER0该变量同时会绕过 wrapper-hook 的其他路由逻辑与 Linux 主机容器模式共享这一开关语义参见 bazel/docs/linux_hermetic_container_cross_rbe.md 中对MONGO_BAZEL_USE_HERMETIC_CONTAINER0的说明。必需的工具链输入LLVM 与 Windows sysroot 的 hermetic 供给交叉工具链是 hermetic封闭、可复现的Bazel action 必须在本地与远程看到完全一致的Linux LLVM、Windows SDK 以及 MSVC 兼容头文件/导入库。因此这些输入必须显式声明并一致地提供给 Linux RBE/action 容器。LLVM可执行于 Linux RBE 容器内LLVM 必须以容器内可执行的形式提供两种方式任选其一方式一归档 SHA 校验推荐用于远程执行$env:MONGO_WINDOWS_CROSS_LLVM_URLhttps://.../llvm-windows-cross-linux-x86_64.tar.xz $env:MONGO_WINDOWS_CROSS_LLVM_SHA256sha256方式二已解压的本地目录$env:MONGO_WINDOWS_CROSS_LLVM_PATHC:\toolchains\llvm-windows-cross-linux-x86_64从源码看这两条环境变量分别对应 hermetic_container_integration.py 中WINDOWS_CROSS_PATH_ENVSMONGO_WINDOWS_CROSS_LLVM_PATH、MONGO_WINDOWS_CROSS_SYSROOT_PATH与WINDOWS_CROSS_PASSTHROUGH_ENVS还包括MONGO_WINDOWS_CROSS_LLVM_URL、MONGO_WINDOWS_CROSS_LLVM_SHA256、MONGO_WINDOWS_CROSS_LLVM_STRIP_PREFIX、MONGO_WINDOWS_CROSS_LLVM_VERSION等透传变量。此外当 LLVM 未显式配置时wrapper 会尝试仓库内默认路径windows-cross-llvm-19或windows-cross-llvm见 hermetic_container_integration.py 的_windows_cross_default_llvm_path。Windows sysroot自动生成、手动提供或归档供给在 Windows 主机上使用 Windows 交叉模式、且未设置MONGO_WINDOWS_CROSS_SYSROOT_PATH时wrapper 会自动生成 Windows sysroot。生成过程读取与原生 Windows 构建相同的版本 pinBAZEL_VS BAZEL_VC BAZEL_VC_FULL_VERSION BAZEL_WINSDK_FULL_VERSION生成结果缓存在.tmp/hermetic_container/windows-sysroots/msvc-version_winsdk-version_x64_hashwrapper 会在 Docker 启动之前完成校验若精确 pin 的 MSVC 工具集、ATL/MFC 组件或 Windows SDK 缺失构建直接失败。对于非标准 SDK 安装可设置MONGO_WINDOWS_CROSS_WINSDK_ROOT指向 Windows Kits 的10目录对应源码中的WINDOWS_CROSS_SDK_ROOT_ENVS见 hermetic_container_integration.py。手动提供 sysroot 目录$env:MONGO_WINDOWS_CROSS_SYSROOT_PATHC:\toolchains\windows-cross-sysroot使用打包好的 sysroot 归档推荐用于远程当同时设置 URL 与 SHA 时wrapper 将 sysroot 的构建交给 Bazel 仓库规则处理不再在主机本地生成 sysroot$env:MONGO_WINDOWS_CROSS_SYSROOT_URLhttps://.../windows-cross-sysroot.tar.xz $env:MONGO_WINDOWS_CROSS_SYSROOT_SHA256sha256sysroot 标准化目录布局无论 sysroot 来自自动生成、手动目录还是归档都必须归一化到以下布局msvc/include/** msvc/lib/x64/** msvc/atlmfc/include/** msvc/atlmfc/lib/x64/** winsdk/include/ucrt/** winsdk/include/shared/** winsdk/include/um/** winsdk/include/winrt/** winsdk/include/cppwinrt/** winsdk/lib/ucrt/x64/** winsdk/lib/um/x64/**其中msvc分支承载 MSVC 工具集头文件、x64 导入库与 ATL/MFC 组件winsdk分支承载 UCRT、shared、um、winrt、cppwinrt 头文件及 x64 导入库。这是保证远程执行时 action 输入可复现的基础。容器内 Bazel 与 Linux Bazel 下载的校验若需要进行一次显式的全容器诊断运行而 Windows 主机无法在 Docker 内执行下载的 Linux Bazel 二进制路径可设置MONGO_HERMETIC_CONTAINER_CONTAINER_BAZEL指向容器内已有的 Bazel或设置MONGO_HERMETIC_CONTAINER_LINUX_BAZEL指向主机上可被 Docker 挂载的 Linux Bazel 二进制自动下载的 Linux Bazel 会以原子方式存储并对照产物的.sha256边车文件校验如果自定义镜像MONGO_HERMETIC_CONTAINER_LINUX_BAZEL_URL不发布该边车文件则需设置MONGO_HERMETIC_CONTAINER_LINUX_BAZEL_SHA256提供可信的 64 位 SHA-256 摘要。WSL2 Docker Engine受支持的 Windows Server 运行环境为什么必须使用 Linux 容器Windows 交叉构建需要在 Linux 容器中执行编译 action。Docker Desktop 在桌面版 Windows 上可能可用但Windows Server 原生的 Docker/Mirantis 运行时只能运行 Windows 容器无法运行交叉 action 包装器所需的 Linux RBE 镜像。因此受支持的 Windows Server 路径是在 WSL2 Linux 发行版内运行 Docker Engine。前提主机或 VM 必须暴露虚拟化/嵌套虚拟化能力。若wsl --install报HCS_E_HYPERV_NOT_INSTALLED需先在仓库之外启用 Hyper-V 或嵌套虚拟化。安装与启动步骤在 PowerShell 中安装发行版wsl --install -d Ubuntu-24.04进入发行版后安装 Docker Engine 并保持守护进程运行sudo apt-get update sudo apt-get install -y docker.io sudo mkdir -p /mnt/z sudo mount -t drvfs Z: /mnt/z sudo dockerd -H unix:///var/run/docker.sock -H tcp://127.0.0.1:2375drvfs挂载将 Windows 的Z:盘映射到 WSL 的/mnt/z供 Docker 以卷方式挂载仓库/输出目录dockerd同时监听 Unix socket 与tcp://127.0.0.1:2375后者供 Windows 侧 Bazel wrapper 连接。从 PowerShell 构建保持dockerd运行后回到 PowerShell 执行bazel build stdx_testWSL Docker 路径映射的默认行为与覆盖变量Windows 交叉模式默认启用 WSL Docker 路径映射等效于设置了MONGO_HERMETIC_CONTAINER_DOCKER_HOST_MODEwsl默认使用tcp://127.0.0.1:2375。相关覆盖变量均可在源码 hermetic_container_integration.py 中找到对应定义驱动挂载根不同设置MONGO_HERMETIC_CONTAINER_WSL_DRIVE_MOUNT_PREFIXDocker Engine 监听位置不同设置DOCKER_HOST或MONGO_HERMETIC_CONTAINER_WSL_DOCKER_HOSTWindows 侧 Docker 客户端比 WSL 守护进程新覆盖默认 Docker API 版本设置MONGO_HERMETIC_CONTAINER_WSL_DOCKER_API_VERSION源码默认值为1.52。底层实现佐证wrapper-hook 的完整决策链结合仓库源码可以梳理出整个 host-cross 集成在 bazel/wrapper_hook/hermetic_container_integration.py 中的实现脉络模式识别wrapper 通过_windows_cross_host_wrapper_action_candidate/_windows_cross_host_run_requested判断当前调用是否为 Windows 交叉构建或运行请求进而返回IntegrationMode.WINDOWS_CROSS_HOST见第 596-600 行附近config 注入_bazel_args_with_default_windows_cross_config在满足默认条件时向命令行注入--configwindows-cross-x86_64sysroot 准备_prepare_windows_cross_env在 Windows 主机且显式请求交叉模式时依据BAZEL_VS/BAZEL_VC/BAZEL_VC_FULL_VERSION/BAZEL_WINSDK_FULL_VERSION计算 sysroot spec通过_windows_cross_sysroot_manifest生成清单、_windows_cross_generated_sysroot_path计算缓存路径并以.mongo_windows_cross_sysroot.json标记文件判断缓存是否过期_windows_cross_sysroot_is_current必要时调用_create_windows_cross_sysroot重新生成见第 1901-1986 行附近远程执行配置源码中WINDOWS_CROSS_REMOTE_EXECUTOR grpcs://sodalite.cluster.engflow.com、WINDOWS_CROSS_RBE_POOL x86_64表明默认 RBE 端点与执行池并可通过MONGO_WINDOWS_CROSS_RBE_CONTAINER_IMAGE、MONGO_WINDOWS_CROSS_RBE_POOL调试覆盖MONGO_WINDOWS_CROSS_LOCAL_CONTAINER_ONLY可禁用远程执行_windows_cross_remote_execution_disabledWSL 环境准备_use_wsl_docker检测MONGO_HERMETIC_CONTAINER_DOCKER_HOST_MODEwsl后依次设置HERMETIC_CONTAINER_VOLUME_SOURCE_MODEwsl、DOCKER_HOST默认tcp://127.0.0.1:2375与 Docker API 版本默认1.52。同时bazel/toolchains/cc/mongo_windows_cross/ 目录下的mongo_windows_cross_toolchain.bzl与windows_cross_action_wrapper.py承载了交叉工具链的 Bazel 规则定义与 action 包装入口是动作在 Linux 执行、产物为 Windows 格式的关键实现hermetic_container_integration_test.py 则提供了针对该集成逻辑的测试覆盖可作为继续深入研读的入口。环境变量速查表以下为本文涉及的交叉构建相关环境变量汇总均在关联文档中说明并可在源码 hermetic_container_integration.py 中溯源环境变量作用默认/取值说明MONGO_WINDOWS_CROSS_DEFAULT_CONFIG让build/fetch/cquery/aquery及测试bazel run默认进入交叉模式设为1生效MONGO_BAZEL_USE_HERMETIC_CONTAINER整体绕过 host-cross 集成设为0绕过MONGO_WINDOWS_CROSS_LLVM_URL/_SHA256以归档方式提供 Linux 可执行的 LLVM需成对设置MONGO_WINDOWS_CROSS_LLVM_PATH以本地目录提供 LLVMWindows 路径MONGO_WINDOWS_CROSS_SYSROOT_PATH手动提供 sysroot 目录设置后不再自动生成MONGO_WINDOWS_CROSS_SYSROOT_URL/_SHA256以归档方式提供 sysroot同时设置则交由 Bazel 仓库规则MONGO_WINDOWS_CROSS_WINSDK_ROOT非标准 SDK 安装的 Windows Kits10目录仅需时设置MONGO_WINDOWS_CROSS_RBE_CONTAINER_IMAGE/MONGO_WINDOWS_CROSS_RBE_POOL调试用 RBE 容器镜像与执行池覆盖默认端点/池见源码常量MONGO_WINDOWS_CROSS_LOCAL_CONTAINER_ONLY仅使用本地容器、禁用远程执行设为1生效BAZEL_VS/BAZEL_VC/BAZEL_VC_FULL_VERSION/BAZEL_WINSDK_FULL_VERSION自动生成 sysroot 时读取的版本 pin与原生 Windows 构建一致MONGO_HERMETIC_CONTAINER_DOCKER_HOST_MODE显式声明 WSL Docker 路径映射值wslMONGO_HERMETIC_CONTAINER_WSL_DRIVE_MOUNT_PREFIXWSL 发行版的驱动挂载根覆盖默认按 WSL 默认挂载DOCKER_HOST/MONGO_HERMETIC_CONTAINER_WSL_DOCKER_HOSTDocker Engine 监听地址覆盖默认tcp://127.0.0.1:2375MONGO_HERMETIC_CONTAINER_WSL_DOCKER_API_VERSIONDocker API 版本覆盖默认1.52MONGO_HERMETIC_CONTAINER_CONTAINER_BAZEL/MONGO_HERMETIC_CONTAINER_LINUX_BAZEL诊断运行时指定容器内/可挂载的 Linux Bazel仅排障使用MONGO_HERMETIC_CONTAINER_LINUX_BAZEL_URL/_SHA256自定义 Linux Bazel 下载源及校验无.sha256边车时手动提供摘要注意事项与边界该 host-cross 集成属于实验性特性默认 Windows 构建仍走原生 MSVC 工具链只有显式传入 config 或设置默认环境变量后才生效bazel test不自动进入交叉模式测试验证请使用bazel run运行测试目标非测试目标的bazel run需要先构建再手动执行.exeWindows Server 上必须使用 WSL2 中的 Docker Engine 才能运行 Linux RBE 镜像原生 Docker/Mirantis 运行时不可用工具链输入必须保持 hermetic 一致相同的 LLVM、Windows SDK、MSVC 兼容头文件/导入库否则本地与远程执行结果不可复现所有与 Windows 交叉相关的实现均可通过 bazel/docs/windows_hermetic_container_cross.md、.bazelrc、hermetic_container_integration.py 及 bazel/toolchains/cc/mongo_windows_cross/ 目录继续深入。【免费下载链接】mongoThe MongoDB Database项目地址: https://gitcode.com/GitHub_Trending/mo/mongo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表