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),仅供参考

相关新闻

电脑故障处理打印版:一张纸搞定蓝屏、C盘满、重装排查

电脑故障处理打印版:一张纸搞定蓝屏、C盘满、重装排查

/* 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:32:07 阅读更多 →
ESP32-S3-BOX-3实战:智能语音与物联网联动开发指南

ESP32-S3-BOX-3实战:智能语音与物联网联动开发指南

/* 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:32:07 阅读更多 →
EMQX 升级 gen_rpc 3.5.1:根治节点不可达时的 Crash 日志长尾与 `failed_to_connect_server` 刷屏

EMQX 升级 gen_rpc 3.5.1:根治节点不可达时的 Crash 日志长尾与 `failed_to_connect_server` 刷屏

后端物联网消息队列通信 【免费下载链接】emqx The most scalable and reliable MQTT broker for AI, IoT, IIoT and connected vehicles 项目地址: https://gitcode.com/gh_mirrors/em/emqx 点击查看 免费下载 导读 本文围绕 EMQX 官方变更记录 fix-16453.en.md …

2026/9/24 7:32:07 阅读更多 →

最新新闻

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

小型以太网组建实战:链路、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:20:37 阅读更多 →
GD32H759上RT-Thread的I2C与RTC工控级可靠适配指南

GD32H759上RT-Thread的I2C与RTC工控级可靠适配指南

/* 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:35 阅读更多 →
高精度温度采集实战:GD32F30x驱动CS1237测量PT1000

高精度温度采集实战:GD32F30x驱动CS1237测量PT1000

/* 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:35 阅读更多 →
GB/T 27930-2015协议解析:BMS与直流快充桩CAN报文交互全流程

GB/T 27930-2015协议解析:BMS与直流快充桩CAN报文交互全流程

/* 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:34 阅读更多 →
集装箱号码识别全流程:图像定位、小波增强与字符分割实战

集装箱号码识别全流程:图像定位、小波增强与字符分割实战

/* 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:34 阅读更多 →
个人开发者必学的12种工控协议实战指南

个人开发者必学的12种工控协议实战指南

/* 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:19:33 阅读更多 →

日新闻

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

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

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

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

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

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

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

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

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

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →