配置构建选项¶
本文档详细介绍了如何配置 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
文件取自生产构建,仅供示例使用。建议使用默认构建选项,并且仅在需要时更改上述列表中的属性。生产构建不适合本地构建。”
Firefox,调试构建 (macOS 64 位)
从同一源代码树构建多个项目¶
只要您为每个项目使用不同的 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 clean
或 git clean
清理树时不会被删除。
此钩子文件使用与 moz.build
文件相同的 Python 子集编写。
可能性是无限的,但这对于调整选定目录的编译器选项特别有用,例如禁用优化以获得更好的调试体验,而不会使整个浏览器变得非常缓慢
nonopt = [
"dom/media/",
"media/ffvpx/",
"media/libcubeb/"
]
if RELATIVEDIR.startswith(nonopt):
COMPILE_FLAGS["OPTIMIZE"] = []
将使这三个路径及其下所有编译单元都没有优化。
另一个每个目录有用的设置是 FILES_PER_UNIFIED_FILE=1
以禁用统一构建。