创建工具链归档

存储库中有多个脚本用于生成构建工具(例如编译器和链接器)的归档文件。

Clang 和 Rust

要修改特定任务使用的工具链,您可能需要以下几样东西

  1. 一个 构建任务

  2. 它使用一个工具链任务

  3. 它使用 git fetch

  4. (仅限 clang) 它使用 配置 json

  5. 它接收 补丁,您可能需要应用这些补丁。

在大多数情况下,您应该能够通过复制/编辑这些文件中现有的示例来完成您想要的操作。

Clang

Clang 的构建由 build-clang.py 处理,它使用 build-clang 目录中的多个资源。阅读 build-clang 自述文件 以了解更多详细信息。

本地构建说明:build-clang.py 可以在开发人员机器上运行,但其冗长的多阶段构建过程对于大多数本地开发来说是不必要的。上游 LLVM 入门指南 中提供了有关如何更直接地构建 clang 的说明。

Rust

Rust 构建由 repack_rust.py 处理。该脚本的主要目的是从 Rust 项目下载预构建的 tarball。

它使用与 rustup 相同的基本格式来指定工具链(通过 --channel

  • 使用 1.xx.y 请求稳定构建(例如 1.47.0

  • 使用 beta-yyyy-mm-dd 请求 Beta 构建(例如 beta-2020-08-26

  • 使用 nightly-yyyy-mm-dd 请求 nightly 构建(例如 nightly-2020-08-26

  • 使用 bors-$sha 请求来自 Rust 的 ci 的构建(例如 bors-796a2a9bbe7614610bd67d4cd0cf0dfff0468778

  • 使用 dev 请求源代码构建

Rust 源代码构建

在撰写本文时,Rust 的源代码构建是一项新功能,并且默认情况下没有任何地方使用它。添加此功能是为了让我们能够针对树测试 rustc 的补丁。预计某些方面会有点笨拙且有限。

最重要的是,从源代码构建需要您的工具链具有 rust 树的提取 以及 clang 和 binutils 工具链。还建议将工作程序类型升级为例如 b-linux-large

Rust 的构建依赖关系非常少,它有一个健全性检查,应该可以捕获任何缺少或过时的依赖关系。有关更多详细信息,请参阅 Rust 自述文件

补丁通过 –patch 标志 设置(通过 toolchain/rust.yml 传递)。补丁路径假定相对于 /build/build-rust/,并且可以选择以 module-path: 为前缀以指定它们应用于 Rust 源代码中的该 git 子模块。例如 --patch src/llvm-project:mypatch.diff 使用 /build/build-rust/mypatch.diff 补丁 rust 的 llvm。目前没有签入的 rust 补丁可用作示例,但它们应该与 clang 补丁 格式相同。

Rust 构建当前不可配置,并使用 硬编码的 config.toml,您可能需要根据您的目的进行编辑。有关详细信息/默认值,请参阅 Rust 的 示例配置。请注意,这些选项偶尔会发生变化,因此请确保您使用的选项与您要定位的版本相匹配。例如,在 Rust ~1.48 附近有很大的变化,并且当前签入的配置是针对 1.47 的,因此在构建最新版本的 Rust 时可能无法正常工作。

Rust 构建目前仅限于定位主机平台。尽管机制已到位以请求其他目标,但交叉编译由于某种未知原因而失败。我们尚未调查需要执行哪些操作才能使其正常工作。

虽然 Rust 通常维护一个干净的树来构建 rustccargo,但其他工具(如 rustfmtmiri)允许暂时损坏。这意味着 Rust 树中的并非每个提交都能够构建 我们需要的工具

虽然 repack_rustrustfmt 视为可选包,但 Rust 构建目前尚未实现这一点,如果 rustfmt 损坏,则构建将失败。曾尝试解决此问题,但 需要做更多工作

Python

Python 由 taskcluster/scripts/misc/build-cpython.sh 在 Linux 和 OSX 上从源代码构建。我们在 Windows 上通过 taskcluster/scripts/misc/pack-cpython.sh 使用上游安装程序。为了确保一致性,我们对这两种方法使用相同的版本。但是请注意,Windows 安装程序并非针对所有修补程序版本打包,因此可能存在细微差异。

Windows

build/vs/generate_yaml.pytaskcluster/scripts/misc/get_vs.py 脚本用于管理和获取包含 Visual Studio 可执行文件、SDK 等的 Windows 工具链。

build/vs/generate_yaml.py 脚本用于生成相关工具链任务中使用的 YAML 文件之一。用于生成该文件的精确命令行存储在 YAML 文件本身的标题中。每个 YAML 文件都记录了从 Microsoft 服务器下载以安装命令行上给出的必需 Visual Studio 组件所需的必要下载。

taskcluster/scripts/misc/get_vs.py 脚本以 YAML 文件作为输入,并在目录中填充相应的 Visual Studio 组件。

这两个脚本都应通过 mach python --virtualenv build 运行。后者由引导机制自动调用。

MacOS

build/macosx/catalog.pytaskcluster/scripts/misc/unpack-sdk.py 脚本用于管理和获取 macOS SDK。

build/macosx/catalog.py 脚本用于浏览 Apple 软件更新目录。在不带任何参数的情况下运行该脚本将显示“产品”的完整列表。您可能不希望这样做,而是从过滤器开始

$ ./mach python build/macosx/catalog.py --filter SDK
061-44071 Beats Updater 1.0
071-29699 Command Line Tools for Xcode 12.5
001-89745 Command Line Tools for Xcode 12.4
071-54303 Command Line Tools for Xcode 12.5
002-41708 Command Line Tools for Xcode 13.2
002-83793 Command Line Tools for Xcode 13.4
012-92431 Command Line Tools for Xcode 14.2
032-64167 Command Line Tools for Xcode 14.3

然后,选择您感兴趣的产品的 ID,并使用该 ID 再次运行该脚本

$ ./mach python build/macosx/catalog.py 032-64167
com.apple.pkg.CLTools_Executables https://swcdn.apple.com/content/downloads/38/61/032-64167-A_F8LL7XSTW6/k3kg0uip4kxd3qupgy6y8fzp27mnxdpt6y/CLTools_Executables.pkg
com.apple.pkg.CLTools_SDK_macOS13 https://swcdn.apple.com/content/downloads/38/61/032-64167-A_F8LL7XSTW6/k3kg0uip4kxd3qupgy6y8fzp27mnxdpt6y/CLTools_macOSNMOS_SDK.pkg
com.apple.pkg.CLTools_SDK_macOS12 https://swcdn.apple.com/content/downloads/38/61/032-64167-A_F8LL7XSTW6/k3kg0uip4kxd3qupgy6y8fzp27mnxdpt6y/CLTools_macOSLMOS_SDK.pkg
com.apple.pkg.CLTools_macOS_SDK https://swcdn.apple.com/content/downloads/38/61/032-64167-A_F8LL7XSTW6/k3kg0uip4kxd3qupgy6y8fzp27mnxdpt6y/CLTools_macOS_SDK.pkg
com.apple.pkg.CLTools_SwiftBackDeploy https://swcdn.apple.com/content/downloads/38/61/032-64167-A_F8LL7XSTW6/k3kg0uip4kxd3qupgy6y8fzp27mnxdpt6y/CLTools_SwiftBackDeploy.pkg

然后,选择您感兴趣的包的 ID,并使用产品和包 ID 的组合再次运行该脚本以检查其内容并确保这就是您要查找的内容。

$ ./mach python build/macosx/catalog.py 032-64167/com.apple.pkg.CLTools_SDK_macOS13
Library
Library/Developer
Library/Developer/CommandLineTools
Library/Developer/CommandLineTools/SDKs
Library/Developer/CommandLineTools/SDKs/MacOSX13.sdk
Library/Developer/CommandLineTools/SDKs/MacOSX13.3.sdk
Library/Developer/CommandLineTools/SDKs/MacOSX13.3.sdk/usr
(...)

找到所需的 SDK 后,您可以在 taskcluster/kinds/toolchain/macosx-sdk.yml 中创建或更新工具链任务。

taskcluster/scripts/misc/unpack-sdk.py 脚本接收 SDK 包的 URL、其内容的 sha512 哈希值、包中 SDK 的路径和输出目录,并在该目录中提取包。

这两个脚本都应通过 mach python 运行。后者由引导机制自动调用。

在自动化中,脚本将从 tooltool 下载文件而不是原始 URL,因此该文件也应使用 internal 可见性上传到 tooltool。请参阅 https://github.com/mozilla-releng/tooltool

使用 Gradle 构建 Firefox for Android

要在自动化中使用 Gradle 构建 Firefox for Android,会生成包含 Gradle 可执行文件和包含精确构建依赖项的 Maven 存储库的归档文件,并将其上传到 Mozilla 内部服务器。构建自动化将在构建之前下载、验证和提取这些归档文件。这些归档文件提供了一个自包含的 Gradle 和 Maven 存储库,以便机器无需在构建时获取其他 Maven 依赖项。(Gradle 和下载的 Maven 依赖项都可以公开重新分发。)

归档 Gradle 可执行文件非常简单,但归档本地 Maven 存储库则不然。因此,存在一个用于生成所需归档文件的工具链作业,即 android-gradle-dependencies。该作业在基于自定义 Docker 镜像的容器中运行,并在后台生成一个 Sonatype Nexus 代理 Maven 存储库进程。该作业使用 Gradle 和位于 build.gradle 的树内 Gradle 配置构建 Firefox for Android。生成的代理 Maven 存储库下载外部依赖项并收集它们。Gradle 构建完成后,该作业会将用于构建的 Gradle 版本和下载的 Maven 存储库归档,并将它们作为 Task Cluster 工件公开。

要更新生成的归档文件中 Gradle 的版本,请更新 gradle/wrapper/gradle-wrapper.properties。请务必同时更新 SHA256 校验和,以防止构建机器中毒!

要更新使用的 Gradle 依赖项的版本,请更新位于 build.gradle 根目录下的树内 Gradle 配置中的 dependencies 部分。在您确信您的更改在本地构建后,推送一个新的构建进行尝试。 android-gradle-dependencies 工具链应自动运行,获取您的新依赖项并将它们连接到相应的尝试构建作业。

要更新 Sonatype Nexus 的版本,请更新 sonatype-nexus fetch 任务定义。

要修改 Sonatype Nexus 配置,通常是为了代理新的远程 Maven 存储库,请修改 taskcluster/scripts/misc/android-gradle-dependencies/nexus.xml

还有一个工具链作业,用于获取 Android SDK 和相关软件包。要更新获取的软件包的版本,请修改 python/mozboot/mozboot/android-packages.txt 并相应地更新树内版本。