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

发布时间:2026/9/24 7:35:41

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),仅供参考
延伸阅读

更多相关文章

2026/9/24 7:35:41

中台为何必须分四类?一次讲透技术、数据、业务与组织中台

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

2026/9/24 7:35:41

iPhone文件App隐藏功能:SMB协议直连电脑,告别数据线

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

2026/9/24 8:25:43

RLHF、InstructGPT 与 DPO:大模型对齐训练全面解析

本文系统讲解大模型对齐训练的核心方法:RLHF(基于人类反馈的强化学习)、InstructGPT 的三步对齐流程,以及 DPO(直接偏好优化)。从原理、步骤、优缺点到实践细节,一篇讲透。一、什么是 RLHF&…

2026/9/24 8:25:43

芯片IP选型避坑指南:架构适配、工艺兼容与验证完备性实战

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

2026/9/24 8:25:43

LTspice第三方SPICE模型集成全流程指南

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

2026/9/24 8:25:43

SWIR051AU短波红外相机:从InGaAs原理到工业检测实战

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

2026/9/24 8:20:43

小型以太网组建实战:链路、IP配置与故障排查

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

2026/9/23 12:07:00

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/23 12:06:55

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/24 0:00:21

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:21

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:21

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/22 16:34:32

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/22 20:01:30

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/22 13:25:41

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码