统一构建

Firefox 构建系统使用“统一构建”(或在其他地方称为“unity builds”)技术来提高编译性能。它不是单独编译源文件,而是将同一目录中的文件组连接在一起,然后一次性批量编译。

可以使用 moz.build 文件中的 UNIFIED_SOURCES 变量配置统一构建。

当我更改文件时,为什么会出现无关的编译错误?

由于在统一构建中将多个文件连接在一起,因此一个文件中的更改可能会导致看似无关的文件的编译失败。这通常是因为源文件变得隐式地相互依赖于

  • #include 语句

  • using namespace ...; 语句

  • 其他符号导入或定义

更常见的意外错误情况之一是添加或删除源代码文件,并且“分块”发生了更改。组合在一起进行单个编译的文件数量有限制,因此有时添加新文件会导致另一个文件被推送到不同的块中。如果该其他块不满足被推入文件的隐式要求,则会出现难以调试的编译错误。

在统一环境外部构建

如上所述,统一构建会导致源文件隐式地相互依赖,这不仅会导致意外的构建错误,而且在使用源代码分析工具时也可能导致问题。为了解决这个问题,我们将使用“非统一”构建,该构建尝试尽可能多地单独编译文件。

要在非统一模式下构建,请在 mozconfig 中设置以下标志

ac_add_options --disable-unified-build

其他说明:

  • 某些 IDE(例如带有 clangd 的 VSCode)以独立模式构建文件,因此它们可能显示比 mach build 更多的错误。

  • 每个块的文件数量可以在 moz.build 文件中使用 FILES_PER_UNIFIED_FILE 变量进行调整。请注意,更改块大小可能会导致如上所述的编译错误。

  • 我们很乐意接受修复有问题的统一构建块的补丁(例如通过添加包含或命名空间注释)。