ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Skia 的 clang_ubuntu_noble 工具链资产:Linux 自研 Clang 编译器的构建、分发与 Bazel/GN 集成指南

Skia 的 clang_ubuntu_noble 工具链资产:Linux 自研 Clang 编译器的构建、分发与 Bazel/GN 集成指南 图形学【免费下载链接】skiaSkia is a complete 2D graphic library for drawing Text, Geometries, and Images. See documentation for contribution instructions.项目地址https://gitcode.com/gh_mirrors/ski/skia点击查看免费下载导读本文围绕 Skia 仓库中的 infra/bots/assets/clang_ubuntu_noble/README.md 展开解析这套为 Linux 主机从源码构建的 Clang 编译器工具链资产含 clang-tidy、IWYU、lld 等及其在 GN 与 Bazel 双构建体系中的角色。读完本文你将掌握该资产的构建配方Dockerfile 细节、分发链路CIPD GCS 镜像以及手动升级 Bazel 工具链的完整五步操作流程并理解 Bazel 侧工具链规则是如何消费这份二进制资产的。一、资产是什么Skia 的 Linux Clang 工具链Skia 将构建所需的第三方二进制统一抽象为“资产asset”进行管理每个资产占据 infra/bots/assets 下一个独立子目录内含VERSION版本号文件、可选的create.py生成脚本等具体约定见 infra/bots/assets/README.md。clang_ubuntu_noble就是其中一个资产其 README 开宗明义这套资产包含从源码构建的 clang 编译器以及其他工具如 clang-tidy 和 IWYU面向 Linux 主机使用。它并非直接下载发行版 Clang 的预编译包而是记录了“在 Ubuntu Noble 容器里从 LLVM 源码现场编译出一整套工具链再把产物打包上传”的完整流程。该目录下现存的四个文件可以佐证文件作用Dockerfile定义工具链的完整构建配方基础镜像、依赖、LLVM 源码版本与 CMake 配置create.py一键执行构建 Docker 镜像并从容器中拷出编译产物供上传使用VERSION当前资产版本号当前为3用于在 CIPD 中区分迭代README.md本资产的使用与更新说明本文的主体这套工具链在 Skia 的构建基础设施中承担“编译器”角色GN 与 Bazel 两套构建系统都会用到它因此它的升级影响面横跨整条构建/测试流水线。二、工具链如何从源码构建Dockerfile 配方拆解要理解这份资产的内容物关键在于读懂它的 Dockerfile。它基于 LLVM 官方 Docker 容器的构建思路针对 Skia 需求做了定制。2.1 基础镜像与依赖锁定SLSA Level 1镜像基于ubuntu:noble2025-01-08 时点的 digest 固定为sha256:80dd3c...34ab并开启deb-src源以便拉取源码包。随后以固定版本号安装构建依赖包括clang1:18.0-59~exp2、lld1:18.0-59~exp2、cmake3.28.3-1build7、ninja-build1.11.1-2、python33.12.3-0ubuntu2、git、wget、unzip等。注释明确说明指定精确版本号是为了让该 Docker 容器满足 SLSA Level 1 的可追溯性要求——这是供应链安全实践在构建基础设施中的具体落地。2.2 源码版本LLVM 19.1.6关键环境变量ENV CLANG_RELEASEllvmorg-19.1.6构建时用git clone --depth 1 -b ${CLANG_RELEASE}拉取对应 tag 的 LLVM 源码保证产物可复现。IWYUinclude-what-you-use则单独克隆其clang_19分支与 Clang 版本严格对齐。2.3 自举式Bootstrapping构建构建采用 LLVM 官方推荐的 bootstrapping 方式先用系统 Clang 18 编译出目标 Clang 19再用新 Clang 去构建 runtimes。核心 CMake 参数-DLLVM_ENABLE_PROJECTSclang;lld;clang-tools-extra -DLLVM_ENABLE_RUNTIMESlibcxx;libcxxabi;libunwind;compiler-rt -DLLVM_EXTERNAL_PROJECTSiwyu -DLLVM_USE_LINKERlld即同时产出Clang 编译器、lld 链接器、clang-tools-extra含 clang-tidy、libc/libcabi/libunwind 标准库、compiler-rt 运行时以及 IWYU 工具。编译产物安装到/tmp/clang_output并额外拷贝了llvm-symbolizer、llvm-profdata、llvm-cov与宿主机libstdc.so.6等调试与运行时支撑文件。2.4 额外构建 TSAN / MSAN 库Dockerfile 后半段还用新编译出的 Clang 分别构建了带 ThreadSanitizer 与 MemorySanitizer 的 libc 库输出到${TARGET_DIR}/tsan与${TARGET_DIR}/msan为 Skia 的 sanitizer 测试提供了自包含的标准库。注意此处必须从runtimes子目录而非llvm子目录开始构建Dockerfile 中有专门注释说明这一易错点并使用新 Clang 作为CC/CXX。2.5 create.py一键产出资产create.py 将上述构建封装为两步docker build -t clang_ubuntu_noble_asset ./infra/bots/assets/clang_ubuntu_noble——构建镜像耗时较长docker run --mount typebind,sourcetarget_dir,target/OUT ...——把容器内/tmp/clang_output的产物拷贝到宿主机目标目录并chmod -R aw确保所有用户可写Docker 默认 root 所有会导致 CI 中删除/覆盖失败。执行python create.py --target_dir dir即可在本地复现这套工具链的产物。三、资产在两条构建链路中的角色README 明确指出该资产同时被 GN 构建和 Bazel 构建使用。对GN 构建更新资产后用sk工具即可自动同步见 infra/bots/assets/README.md 中sk asset upload流程无需手工干预。对Bazel 构建则需要按下一节的五步流程手动更新因为 Bazel 侧通过下载规则按 sha256 校验从 GCS 镜像桶拉取该 zip。四、手动更新 Bazel 构建五步完整操作这是 README 的实战核心以下按原文逐步展开并补充各步骤背后的原理与仓库依据。步骤 1从 CIPD 下载最新版本 zip从 CIPD 的skia/bots/clang_linux包下载最新版本zip 格式。CIPDChrome Infra Packages Deployer是 Chrome 基础设施的二进制分发服务Skia 的 CI 用它托管各类构建工具资产。步骤 2重命名为带版本号的文件名将下载的 zip 改名为clang_linux_amd64_vNN.zip其中NN取 VERSION 文件中的新版本号。该命名约定与 Bazel 侧下载规则中gcs_mirror_only(clang_sha256, .zip)的取用方式呼应——文件按内容哈希寻址名称仅作为版本标识。步骤 3上传到 GCS 镜像桶go run ./bazel/gcs_mirror/gcs_mirror.go --sha256 hash --file /path/to/clang_linux_amd64_vNN.zip这是仓库中的真实命令对应实现位于 bazel/gcs_mirror/gcs_mirror.go。Skia 的 Bazel 构建通过 toolchain/utils.bzl 中的gcs_mirror_url/gcs_mirror_only从自有 GCS 桶下载依赖将 zip 上传到该镜像桶后即可被 Bazel 规则寻址。步骤 4更新 sha256 指纹在 toolchain/download_linux_amd64_toolchain.bzl 中更新clang_sha256常量的值。当前该文件中注释表明线上版本为“clang 18.1.8 与从源码构建的 IWYU”其clang_sha256 8c31a278...。下载规则_download_linux_amd64_toolchain_impl会调用ctx.download_and_extract(url gcs_mirror_only(clang_sha256, .zip), sha256 clang_sha256, ...)——sha256 既是寻址键也是完整性校验因此更新版本必须同步更新该值。步骤 5本地测试make -C bazel known_good_builds运行该目标验证新工具链可完成一组“已知的好的构建”。README 特别提醒新版本 Clang 可能发生文件布局调整或新增文件因此可能需要更新生成的 BUILD.bazel 文件即_download_linux_amd64_toolchain_impl末尾通过ctx.file(BUILD.bazel, ...)生成的那份其内定义了compile_files、link_files、archive_files、link_libs等 filegroup以及//toolchain/linux_amd64_toolchain_config.bzl中对这些工具的引用方式。五、Bazel 侧如何消费这份资产5.1 下载与解包规则download_linux_amd64_toolchain.bzl 不仅下载 Clang 本体还承担了“依赖解析器”的职责以debs_to_install列表维护 glibc、libX11、libGL、fontconfig、EGL、libgcc 等 20 余个.deb包逐一download_and_extract后解出data.tar.xz组成 sysroot。注释中详细解释了为何使用 Debian buster10的旧 glibc——因为部分 Swarming 机器仍运行 Debian 10编译产物必须能在其上运行。全部内容落在 Bazel 缓存下的external/clang_linux_amd64目录作为自包含的 sysroot 使用。5.2 工具链配置linux_amd64_toolchain_config.bzl 将上述内容组装为 Bazel C 工具链以external_toolchain为builtin_sysroot把 libc 库、头文件、lib/clang/18/include等纳入默认搜索路径与_make_default_flags中的builtin_include_directories一一对应并通过 toolchain/clang_layering_check.bzl 的generate_system_module_map生成系统头文件 modulemap实现头文件分层layering检查。其注释点明该工具链“不依赖宿主机的任何已安装软件包”——这正是这份自包含资产的设计目标保证 CI 环境与本地构建高度一致。六、版本管理约定按 infra/bots/assets/README.md 的通用流程资产更新后需提交VERSION变化并重新生成任务清单make -C infra/bots train。对clang_ubuntu_noble而言版本号当前3会进入 zip 文件名与 CIPD 包构成可追溯的发布链源码 tagllvmorg-19.1.6→ Docker 构建产物 → zip sha256 → GCS 镜像 → Bazel 下载规则 → 工具链配置。七、小结clang_ubuntu_noble资产是 Skia 构建基础设施中“自托管编译器”的典型样例以固定版本的 Ubuntu Noble 容器 固定 LLVM tag 固定依赖版本构建出可复现、可审计、自包含的 Clang 工具链再经由 CIPD/GCS 分发最终被 GN 与 Bazel 两条构建链路消费。理解它的构建配方与升级流程不仅有助于在 Skia 中排查构建问题也能为其他大型 C 项目设计“自带工具链”的 CI 方案提供直接参考——其 SLSA 合规做法、bootstrapping 构建、sanitizer 运行时定制与哈希寻址分发都是可迁移的工程实践。赞分享图形学【免费下载链接】skiaSkia is a complete 2D graphic library for drawing Text, Geometries, and Images. See documentation for contribution instructions.项目地址https://gitcode.com/gh_mirrors/ski/skia点击查看免费下载相关推荐Flutter Engine编译工具链GN构建系统与前端服务器Flutter Engine编译工具链GN构建系统与前端服务器 本文详细解析了Flutter Engine的编译工具链架构重点介绍了GN构建系统的配置管理、跨平台图形学前端Skia 的 GCC Docker 构建镜像infra/gcc 镜像体系与 Bazel/GN 构建实践Skia 的 GCC Docker 构建镜像infra/gcc 镜像体系与 Bazel/GN 构建实践 导读 Skia 的日常构建默认以 Clang 为主但图形学Skia 测试工具集成 ANGLE从 GN 构建配置到 --config 命令行的完整指南Skia 测试工具集成 ANGLE从 GN 构建配置到 config 命令行的完整指南 本文档对应 Skia 仓库中的 site/docs/user/spec图形学创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表