summaryrefslogtreecommitdiffstats
path: root/build/docs/unified-builds.rst
blob: b8d3fcbbdaf80a9d477f210b9c63020856f09eac (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
.. _unified-builds:

==============
Unified Builds
==============

The Firefox build system uses the technique of "unified builds" (or elsewhere
called "`unity builds <https://en.wikipedia.org/wiki/Unity_build>`_") to
improve compilation performance. Rather than compiling source files individually,
groups of files in the same directory are concatenated together, then compiled once
in a single batch.

Unified builds can be configured using the ``UNIFIED_SOURCES`` variable in ``moz.build`` files.

.. _unified_build_compilation_failures:

Why are there unrelated compilation failures when I change files?
=================================================================

Since multiple files are concatenated together in a unified build, it's possible for a change
in one file to cause the compilation of a seemingly unrelated file to fail.
This is usually because source files become implicitly dependent on each other for:

* ``#include`` statements
* ``using namespace ...;`` statements
* Other symbol imports or definitions

One of the more common cases of unexpected failures are when source code files are added or
removed, and the "chunking" is changed. There's a limit on the number of files that are combined
together for a single compilation, so sometimes the addition of a new file will cause another one
to be bumped into a different chunk. If that other chunk doesn't meet the implicit requirements
of the bumped file, there will be a tough-to-debug compilation failure.

Building outside of the unified environment
===========================================

As described above, unified builds can cause source files to implicitly depend on each other, which
not only causes unexpected build failures but also can cause issues when using source-analysis tools.
To combat this, we'll use a "hybrid" build that attempts to perform a build with as many files compiled
individually as possible.

Due to the implicit dependency problem, not all modules are able to be compiled in a non-unified
environment yet. To designate these for the hybrid build, the ``REQUIRES_UNIFIED_BUILD`` option can be
set in their corresponding ``moz.build`` file.

To build in the hybrid mode, set the following flag in your ``mozconfig``:

``ac_add_options --disable-unified-build``

Other notes:
============

* Some IDEs (such as VSCode with ``clangd``) build files in standalone mode, so they may show
  more failures than a ``mach build``.
* The amount of files per chunk can be adjusted in ``moz.build`` files with the
  ``FILES_PER_UNIFIED_FILE`` variable. Note that changing the chunk size can introduce
  compilation failures as described :ref:`above<unified_build_compilation_failures>`.
* We are happy to accept patches that fix problematic unified build chunks (such as by adding
  includes or namespace annotations).