理解构件构建

桌面版和 Android 版 Firefox 支持一种称为“构件模式”的**快速构建模式**。生成的构建称为“构件构建”。构件模式下载预构建的 C++ 组件,而不是在本地构建它们,用带宽换取时间。

构件构建对许多不使用编译代码的开发者很有用(请参阅下面的“限制”)。构件通常从mozilla-central获取。

要自动下载和使用预构建的二进制构件,请将以下行添加到您的mozconfig 文件中

# Automatically download and use compiled C++ components:
ac_add_options --enable-artifact-builds

# Write build artifacts to:
mk_add_options MOZ_OBJDIR=./objdir-frontend

要自动下载和使用预构建的二进制构件的调试版本(目前支持 Linux、OSX 和 Windows 构件),请将ac_add_options --enable-debug添加到您的 mozconfig 文件中(已启用构件构建选项)

# Enable debug versions of the pre-built binary artifacts:
ac_add_options --enable-debug

# Automatically download and use compiled C++ components:
ac_add_options --enable-artifact-builds

# Download debug info so that stack traces refers to file and columns rather than library and Hex address
ac_add_options --enable-artifact-build-symbols

# Write build artifacts to:
mk_add_options MOZ_OBJDIR=./objdir-frontend-debug-artifact

先决条件

构件构建支持 Mercurial 和 Git 用户。Git 构件构建需要使用git-cinnabar创建的 mozilla-central 克隆。请按照 git-cinnabar 项目页面上的说明安装 git-cinnabar。有关使用 git-cinnabar 与 Mozilla 代码库交互的更多信息,请参阅项目 wiki

构建

如果您已将--enable-artifact-builds添加到您的mozconfig中,则每次运行mach buildmach build path/to/subdirectory时,构建系统都会确定最佳的可用预构建二进制构件,下载它们,并将其放置到适当的位置。计算结果会被缓存,因此在下载最新构件后,额外的计算速度会非常快——在现代硬件上只需一两秒。大多数桌面开发者会发现

./mach build
./mach run

一切正常。

要仅重新构建本地更改(以避免在本地提交后重新检查推送和/或解压缩下载的缓存构件),您可以使用

./mach build faster

它只“构建”本地 JS、CSS 和打包(例如图像和其他资产)文件。

大多数 Android 版 Firefox 开发者会发现

./mach build
./mach package
./mach install

一切正常。

从尝试构建中拉取构件

要仅接受来自特定修订版(例如尝试构建)的构件,请在您的环境中将MOZ_ARTIFACT_REVISION设置为所需推送头部修订版的值。请注意,这将覆盖查找具有所需构件的最新候选构建的默认行为,如果指定的修订版不包含所需构件,则会导致构建失败。

从本地构建/远程 URL 拉取构件

如果您需要针对本地构建或托管在其他地方的构建进行构件构建,则需要分别使用MOZ_ARTIFACT_FILEMOZ_ARTIFACT_URL。对于本地构建,您必须确保

  • 使用./mach package生成一个包

  • 在您的./mach build命令行上通过MOZ_ARTIFACT_FILE=path/to/firefox.tar.bz2指向它。路径需要是绝对路径,并且包位于您的对象目录内的dist/中。

使用MOZ_ARTIFACT_URL将下载给定 URL 上的包,然后遵循与本地构建情况相同的流程。

MOZ_ARTIFACT_FILEMOZ_ARTIFACT_URL仅提供包,它们不提供兄弟构件,包括测试构件、额外的档案(如 XPT 数据)等。一般来说,建议使用MOZ_ARTIFACT_REVISION,它可以提供这些兄弟构件。

限制

哦,有很多。构件构建相当微妙:本地源代码目录与下载的二进制构件之间任何不匹配都可能导致难以诊断的不兼容性,包括无法解释的崩溃以及灾难性的 XPCOM 初始化和注册失败。这些情况很少发生,但确实会发生。

支持的功能

  • 修改 JavaScript、(X)HTML 和 CSS 资源;以及字符串属性和 FTL 文件。

  • 修改 Android Java 代码、资源和字符串。

  • 运行 mochitests 和 xpcshell 测试。

  • 修改Scalars.yaml以添加标量遥测(自 {{ Bug(“1425909”) }} 起,除了尝试构建上的构件构建)。

  • 修改Events.yaml以添加事件遥测(自 {{ Bug(“1448945”) }} 起,除了尝试构建上的构件构建)。

基本上,mach build faster更新的所有内容都应该适用于构件构建。

不支持的功能

  • 不支持除桌面版和 Android 版 Firefox 之外的其他产品的支持,并且不太可能永远支持。其他项目(如 Thunderbird)可能会提供他们自己的构件构建支持

  • 您不能修改树中的任何 C、C++ 或 Rust 源代码。如果它已编译为机器代码,则无法更改。

  • 您不能修改histograms.json以添加遥测直方图定义。(但请参阅Bug 1206117)。

  • 在所有情况下,修改构建系统配置和定义都不起作用。

尚不支持的功能

  • 除 mochitests、xpcshell 和基于 Marionette 的测试之外的其他测试。这里没有内在的障碍,但这些测试尚未知是否有效。

  • 修改 WebIDL 定义,即使是那些用 JavaScript 实现的定义。

故障排除

构件模式有两个部分:--disable-compile-environment选项和实现下载和缓存的mach artifact命令。首先运行

./mach artifact install --verbose

以查看构建系统正在尝试执行的操作。有一些支持查询和打印缓存;运行mach artifact以查看有关这些命令的信息。

下载的构件存储在$MOZBUILD_STATE_PATH/package-frontend中,这几乎总是~/.mozbuild/package-frontend

最好在dev-builds 邮件列表上开始讨论。最好在#build(位于Matrix上)提出问题。请在“Firefox 构建系统::常规”中提交错误,并阻止Bug 901840