配置构建选项

本文档详细介绍了如何配置 Firefox 构建。大多数情况下,不需要 mozconfig 文件。默认选项支持度最高,因此最好尽可能少添加选项。在构建之前,请仔细阅读以下说明,并按顺序执行。跳过任何步骤都可能导致构建失败或构建的软件无法使用。构建选项(包括无法从命令行使用的选项)可能会出现在源代码树中的“confvars.sh”文件中。

使用 mozconfig 配置文件

可以在 mozconfig 文件中配置要构建哪个 Mozilla 项目以及其他配置选项。(可以使用命令行选项手动调用 configure,但不推荐这样做)。mozconfig 文件应位于您的源代码目录(即 /mozilla-central/mozconfig)。

创建一个空白的 mozconfig 文件

echo "# My first mozilla config" > mozconfig

如果您的 mozconfig 不在您的源代码目录中,您还可以使用 MOZCONFIG 环境变量来指定 mozconfig 的路径。您指定的路径**必须**是**绝对**路径,否则 client.mk 将找不到它。如果您选择为不同的项目或配置创建多个 mozconfig 文件,这将非常有用(有关完整示例,请参见下文)。请注意,在下面的 export 示例中,文件名不是 mozconfig。无论您使用哪个实际文件的名称,在下面的示例中,我们都将此文件称为 mozconfig 文件。

设置 mozconfig 路径

export MOZCONFIG=$HOME/mozilla/mozconfig-firefox

注意

也支持将文件命名为 .mozconfig(前面带一个点),但不推荐这样做,因为它可能使文件难以查找。这在进行故障排除时也会有所帮助,因为人们想知道您选择了哪些构建选项,并假设您已将它们放在 mozconfig 文件中。

mozconfig 包含两种类型的选项:

  • mk_add_options 为前缀的选项将传递给 client.mk。其中最重要的是 MOZ_OBJDIR,它控制项目构建的位置(也称为对象目录)。

  • ac_add_options 为前缀的选项将传递给 configure,并影响构建过程。

使用 objdir 构建

这意味着源代码和对象文件不会在您的目录系统中混合在一起,您可以从同一源代码树构建多个项目(例如 Firefox 和 Thunderbird)。如果未指定 MOZ_OBJDIR,它将自动设置为 @TOPSRCDIR@/obj-@CONFIG_GUESS@

如果需要重新运行 configure,最简单的方法是使用 ./mach configure;强烈建议不要手动运行 configure

将以下行添加到您的 mozconfig 中,可以更改 objdir

mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/obj-@CONFIG_GUESS@

最好让您的 objdir 名称以 obj 开头,以便 Mercurial 忽略它。

有时构建源代码的多个版本(例如带和不带诊断断言的版本)会很有用。为了避免执行完整重建所需的时间,您可以创建多个 mozconfig 文件,这些文件指定不同的 objdir。例如,一个 mozconfig-dbg

mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/obj-ff-dbg
ac_add_options --enable-debug

和一个 mozconfig-rel-opt

mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/obj-ff-rel-opt
ac_add_options --disable-debug
ac_add_options --enable-optimize

允许通过 MOZCONFIG 环境变量指定配置来构建这两个版本

$ env MOZCONFIG=/path/to/mozconfig-dbg ./mach build
$ env MOZCONFIG=/path/to/mozconfig-rel-opt ./mach build

不要忘记也为 mach run 命令设置 MOZCONFIG 环境变量。

请注意,更改 mozconfig 将需要重新运行配置过程,因此构建将花费更长的时间,因此如果您发现自己经常更改相同的选项,则可能值得为每个选项创建一个单独的 mozconfig。这样做的主要缺点是每个 objdir 都会占用磁盘上的大量空间。

并行编译

注意

构建系统会自动智能地猜测在构建时使用多少个 CPU 内核。通常不需要以下选项。

大多数现代系统都具有多个内核或 CPU,并且可以可选地并发使用它们以加快构建速度。-j 标志控制将并发运行多少个并行构建。您将看到(递减)收益,直到达到系统上内核数量的约 1.5 倍到 2.0 倍的值。

mk_add_options MOZ_PARALLEL_BUILD=4

如果您的机器过热,您可能需要尝试较低的值。

选择一个项目

--enable-project=project 标志用于选择要构建的项目。Firefox 为默认值。

选择以下选项之一添加到您的 mozconfig 文件中

浏览器 (Firefox)
ac_add_options --enable-project=browser

注意

这是默认值

邮件 (Thunderbird)
ac_add_options --enable-project=comm/mail
Mozilla 套件 (SeaMonkey)
ac_add_options --enable-project=suite
日历 (Lightning 扩展,使用 Thunderbird)
ac_add_options --enable-project=comm/mail
ac_add_options --enable-calendar

选择构建选项

您选择的构建选项取决于您正在构建的项目以及您将如何使用构建。如果您想定期使用构建,则需要一个没有额外调试信息的发布版本;如果您是想要修改源代码的开发人员,则可能需要一个未经优化的版本,其中包含额外的调试宏。

配置脚本识别许多选项,这些选项是专为嵌入器或其他特殊情况而设计的专用选项,不应用于构建完整的套件/XUL 项目。可以通过运行 ./mach configure -- --help 获取完整的选项列表。

警告

除非您知道某个配置选项的作用,否则请勿使用它。默认值通常是正确的。您添加到 mozconfig 文件中的每个额外选项都会降低构建成功编译和运行的可能性。

以下构建选项非常常见

sccache

SCCache 通过缓存编译结果来加快后续 C/C++ 构建的速度。与 ccache 不同,它还允许缓存 Rust 工件,并支持 分布式编译

为了为 Firefox 构建启用 sccache,您可以使用 ac_add_options --with-ccache=sccache

从 0.7.4 版本开始,sccache 本地构建默认使用 preprocessor cache mode。使用热缓存,与以前的方法相比,它将构建时间缩短了 2 到 3 倍。此功能的工作方式类似于 ccache 中的直接模式,使用类似的方法来处理缓存和依赖项。

注意

使用 sccache 时,由于对文件和存储的操作,Firefox 的初始构建速度会变慢。

优化

ac_add_options --enable-optimize

启用默认编译器优化选项

注意

默认情况下启用此选项

ac_add_options --enable-optimize=-O2

选择特定的编译器优化选项。在大多数情况下,这不会产生预期的结果,除非您非常了解 Mozilla 代码库;但是请注意,如果您使用 Microsoft 编译器构建,则可能**确实**需要这样做,因为与 GCC 不同,-O1 将针对大小进行优化。

ac_add_options --enable-debug

在 C++ 和 JavaScript 中启用断言,以及其他仅限调试的代码。这会显着减慢构建速度,但在编写补丁时非常宝贵。**开发补丁的人员(尤其是在 C++ 中)通常应该使用此选项。**

ac_add_options --disable-optimize

禁用编译器优化。这使得在调试器中单步执行代码变得更加容易。

ac_add_options --enable-release

启用更保守的、面向发布工程的选项。这可能会减慢构建速度。这还会为 Rust 启用完全优化。请注意,在构建发布版/测试版/ESR 时,这是默认设置。

ac_add_options --enable-debug-js-modules

仅启用 JavaScript 断言。这在本地处理 DevTools 等基于 JavaScript 的组件时很有用。这将有助于捕获引入 JS 代码中的任何错误,与 --enable-debug 选项相比,性能影响较小。

export RUSTC_OPT_LEVEL=2

为 Rust 代码启用完全优化。

您可以使用调试符号进行优化构建。请参阅 使用调试符号构建

作为 Beta 版或发布版构建

ac_add_options --as-milestone=release

这使得使用发布版或测试版配置轻松构建 nightly 版本以测试不同的 ifdef 行为。要进行完整的测试版模拟,请参阅 Sheriffing/How To/Beta simulations

  • 早期测试版

  • 后期测试版

  • 发布版

测试

ac_add_options --disable-tests

默认情况下,会构建许多辅助测试程序,这有助于调试和修补 mozilla 源代码。禁用这些测试可以显着加快构建速度并减少磁盘空间。开发人员通常不应使用此选项。

本地化

mk_add_options MOZ_CO_LOCALES=ISOcode

待定。

ac_add_options --enable-ui-locale=ISOcode

待定。

ac_add_options --with-l10n-base=/path/to/base/dir

待定。

其他选项

mk_add_options AUTOCLOBBER=1

如果构建前需要清除,这将导致 mach 清除并继续构建,而不是要求用户手动清除并退出。

ac_add_options --enable-warnings-as-errors

这会将编译器警告转换为错误,导致构建失败。这很有用,因为某些警告与 reviewbot lint 冲突,必须在合并之前修复。

示例 mozconfig 文件

Mozilla 的官方构建使用每个存储库中相应目录下的 mozconfig 文件。

警告

这些 mozconfig 文件取自生产构建,仅供示例使用。建议使用默认构建选项,并且仅在需要时更改上述列表中的属性。生产构建不适合本地构建。”

从同一源代码树构建多个项目

只要您为每个项目使用不同的 objdir,就可以从同一源代码树构建多个项目。

您需要创建多个 mozconfig 文件。

例如,可以使用以下步骤构建 Firefox 和 Thunderbird。您应该首先创建三个 mozconfig 文件。

mozconfig-common:

# add common options here, such as making an optimized release build
mk_add_options MOZ_PARALLEL_BUILD=4
ac_add_options --enable-optimize --disable-debug

mozconfig-firefox:

# include the common mozconfig
. ./mozconfig-common

# Build Firefox
mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/obj-firefox
ac_add_options --enable-project=browser

mozconfig-thunderbird:

# include the common mozconfig
. ./mozconfig-common

# Build Thunderbird
mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/obj-thunderbird
ac_add_options --enable-project=comm/mail

要构建 Firefox,请运行以下命令

export MOZCONFIG=/path/to/mozilla/mozconfig-firefox
./mach build

要构建 Thunderbird,请运行以下命令

export MOZCONFIG=/path/to/mozilla/mozconfig-thunderbird
./mach build

使用 mozconfigwrapper

Mozconfigwrapper 类似于使用多个 mozconfig 文件,只是它对它们进行了抽象和隐藏,因此您不必担心它们在哪里或您创建了哪些文件。它还可以避免您每次都必须导出 MOZCONFIG 变量。有关安装和配置 mozconfigwrapper 的信息,请参阅 https://github.com/ahal/mozconfigwrapper

每个目录更改构建选项 - moz.build 钩子

mozconfig 文件中添加如下语句

ac_add_options MOZ_BUILD_HOOK=/absolute/path/to/file/buildhook.py

将导致此文件被附加到树的每个 moz.build 文件中。建议将此文件放在树之外,以便在通过 hg cleangit clean 清理树时不会被删除。

此钩子文件使用与 moz.build 文件相同的 Python 子集编写。

可能性是无限的,但这对于调整选定目录的编译器选项特别有用,例如禁用优化以获得更好的调试体验,而不会使整个浏览器变得非常缓慢

nonopt = [
    "dom/media/",
    "media/ffvpx/",
    "media/libcubeb/"
]
if RELATIVEDIR.startswith(nonopt):
    COMPILE_FLAGS["OPTIMIZE"] = []

将使这三个路径及其下所有编译单元都没有优化。

另一个每个目录有用的设置是 FILES_PER_UNIFIED_FILE=1 以禁用统一构建