Bug 1852754: part 9) Add tests for dynamically loading <link rel="prefetch"> elements...
[gecko.git] / build / docs / toolchains.rst
blob534f269c071406a1ad134e727d1735907d0ec916
1 .. _build_toolchains:
3 ===========================
4 Creating Toolchain Archives
5 ===========================
7 There are various scripts in the repository for producing archives
8 of the build tools (e.g. compilers and linkers) required to build.
10 Clang and Rust
11 ==============
13 To modify the toolchains used for a particular task, you may need several
14 things:
16 1. A `build task`_
18 2. Which uses a toolchain task
20     - `clang toolchain`_
21     - `rust toolchain`_
23 3. Which uses a git fetch
25     - `clang fetch`_
26     - (from-source ``dev`` builds only) `rust fetch`_
28 4. (clang only) Which uses a `config json`_
30 5. Which takes patches_ you may want to apply.
32 For the most part, you should be able to accomplish what you want by
33 copying/editing the existing examples in those files.
35 .. _build task: https://searchfox.org/mozilla-central/rev/168c45a7acc44e9904cfd4eebcb9eb080e05699c/taskcluster/ci/build/linux.yml#5-45
36 .. _clang toolchain: https://searchfox.org/mozilla-central/rev/168c45a7acc44e9904cfd4eebcb9eb080e05699c/taskcluster/ci/toolchain/clang.yml#51-72
37 .. _rust toolchain: https://searchfox.org/mozilla-central/rev/168c45a7acc44e9904cfd4eebcb9eb080e05699c/taskcluster/ci/toolchain/rust.yml#57-74
38 .. _clang fetch: https://searchfox.org/mozilla-central/rev/168c45a7acc44e9904cfd4eebcb9eb080e05699c/taskcluster/ci/fetch/toolchains.yml#413-418
39 .. _rust fetch: https://searchfox.org/mozilla-central/rev/168c45a7acc44e9904cfd4eebcb9eb080e05699c/taskcluster/ci/fetch/toolchains.yml#434-439
40 .. _config json: https://searchfox.org/mozilla-central/rev/168c45a7acc44e9904cfd4eebcb9eb080e05699c/build/build-clang/clang-linux64.json
41 .. _patches: https://searchfox.org/mozilla-central/rev/168c45a7acc44e9904cfd4eebcb9eb080e05699c/build/build-clang/static-llvm-symbolizer.patch
43 Clang
44 -----
46 Building clang is handled by `build-clang.py`_, which uses several resources
47 in the `build-clang`_ directory. Read the `build-clang README`_ for more
48 details.
50 Note for local builds: build-clang.py can be run on developer machines but its
51 lengthy multi-stage build process is unnecessary for most local development. The
52 upstream `LLVM Getting Started Guide`_ has instructions on how to build
53 clang more directly.
55 .. _build-clang.py: https://searchfox.org/mozilla-central/source/build/build-clang/build-clang.py
56 .. _build-clang README: https://searchfox.org/mozilla-central/source/build/build-clang/README
57 .. _build-clang: https://searchfox.org/mozilla-central/source/build/build-clang/
58 .. _LLVM Getting Started Guide: https://llvm.org/docs/GettingStarted.html
60 Rust
61 ----
63 Rust builds are handled by `repack_rust.py`_. The primary purpose of
64 that script is to download prebuilt tarballs from the Rust project.
66 It uses the same basic format as `rustup` for specifying the toolchain
67 (via ``--channel``):
69 - request a stable build with ``1.xx.y`` (e.g. ``1.47.0``)
70 - request a beta build with ``beta-yyyy-mm-dd`` (e.g. ``beta-2020-08-26``)
71 - request a nightly build with ``nightly-yyyy-mm-dd`` (e.g. ``nightly-2020-08-26``)
72 - request a build from `Rust's ci`_ with ``bors-$sha`` (e.g. ``bors-796a2a9bbe7614610bd67d4cd0cf0dfff0468778``)
73 - request a from-source build with ``dev``
75 Rust From Source
76 ----------------
78 As of this writing, from-source builds for Rust are a new feature, and not
79 used anywhere by default. The feature was added so that we can test patches
80 to rustc against the tree. Expect things to be a bit hacky and limited.
82 Most importantly, building from source requires your toolchain to have a
83 `fetch of the rust tree`_ as well as `clang and binutils toolchains`_. It is also
84 recommended to upgrade the worker-type to e.g. ``b-linux-large``.
86 Rust's build dependencies are fairly minimal, and it has a sanity check
87 that should catch any missing or too-old dependencies. See the `Rust README`_
88 for more details.
90 Patches are set via `the --patch flag`_ (passed via ``toolchain/rust.yml``).
91 Patch paths are assumed to be relative to ``/build/build-rust/``, and may be
92 optionally prefixed with ``module-path:`` to specify they apply to that git
93 submodule in the Rust source. e.g. ``--patch src/llvm-project:mypatch.diff``
94 patches rust's llvm with ``/build/build-rust/mypatch.diff``. There are no
95 currently checked in rust patches to use as an example, but they should be
96 the same format as `the clang ones`_.
98 Rust builds are not currently configurable, and uses a `hardcoded config.toml`_,
99 which you may need to edit for your purposes. See Rust's `example config`_ for
100 details/defaults. Note that these options do occasionally change, so be sure
101 you're using options for the version you're targeting. For instance, there was
102 a large change around Rust ~1.48, and the currently checked in config was for
103 1.47, so it may not work properly when building the latest version of Rust.
105 Rust builds are currently limited to targeting only the host platform.
106 Although the machinery is in place to request additional targets, the
107 cross-compilation fails for some unknown reason. We have not yet investigated
108 what needs to be done to get this working.
110 While Rust generally maintains a clean tree for building ``rustc`` and
111 ``cargo``, other tools like ``rustfmt`` or ``miri`` are allowed to be
112 transiently broken. This means not every commit in the Rust tree will be
113 able to build the `tools we require`_.
115 Although ``repack_rust`` considers ``rustfmt`` an optional package, Rust builds
116 do not currently implement this and will fail if ``rustfmt`` is busted. Some
117 attempt was made to work around it, but `more work is needed`_.
119 .. _Rust's ci: https://github.com/rust-lang/rust/pull/77875#issuecomment-736092083
120 .. _repack_rust.py: https://searchfox.org/mozilla-central/source/taskcluster/scripts/misc/repack_rust.py
121 .. _fetch of the rust tree: https://searchfox.org/mozilla-central/rev/168c45a7acc44e9904cfd4eebcb9eb080e05699c/taskcluster/ci/toolchain/rust.yml#69-71
122 .. _clang and binutils toolchains: https://searchfox.org/mozilla-central/rev/168c45a7acc44e9904cfd4eebcb9eb080e05699c/taskcluster/ci/toolchain/rust.yml#72-74
123 .. _the --patch flag: https://searchfox.org/mozilla-central/rev/168c45a7acc44e9904cfd4eebcb9eb080e05699c/taskcluster/scripts/misc/repack_rust.py#667-675
124 .. _the clang ones: https://searchfox.org/mozilla-central/rev/168c45a7acc44e9904cfd4eebcb9eb080e05699c/build/build-clang/static-llvm-symbolizer.patch
125 .. _Rust README: https://github.com/rust-lang/rust/#building-on-a-unix-like-system
126 .. _hardcoded config.toml: https://searchfox.org/mozilla-central/rev/168c45a7acc44e9904cfd4eebcb9eb080e05699c/taskcluster/scripts/misc/repack_rust.py#384-421
127 .. _example config: https://github.com/rust-lang/rust/blob/b7ebc6b0c1ba3c27ebb17c0b496ece778ef11e18/config.toml.example
128 .. _tools we require: https://searchfox.org/mozilla-central/rev/168c45a7acc44e9904cfd4eebcb9eb080e05699c/taskcluster/scripts/misc/repack_rust.py#398
129 .. _more work is needed: https://github.com/rust-lang/rust/issues/79249
131 Python
132 ------
134 Python is built from source by ``taskcluster/scripts/misc/build-cpython.sh`` on
135 Linux and OSX. We use the upstream installer on Windows, through
136 ``taskcluster/scripts/misc/pack-cpython.sh``. In order to ensure consistency, we
137 use the same version for both approaches. Note however that the Windows installer is
138 not packaged for all patch versions, so there might be a slight delta there.
140 Windows
141 =======
143 The ``build/vs/generate_yaml.py`` and ``taskcluster/scripts/misc/get_vs.py``
144 scripts are used to manage and get Windows toolchains containing Visual
145 Studio executables, SDKs, etc.
147 The ``build/vs/generate_yaml.py`` script is used to generate one of the
148 YAML files used in the relevant toolchain task. The exact command line
149 used to generate the file is stored in the header of the YAML file itself.
150 Each YAML file records the necessary downloads from Microsoft servers to
151 install the required Visual Studio components given on the command line.
153 The ``taskcluster/scripts/misc/get_vs.py`` script takes a YAML file as
154 input and fills a directory with the corresponding Visual Studio components.
156 Both scripts should be run via ``mach python --virtualenv build``. The
157 latter is automatically invoked by the bootstrapping mechanism.
160 MacOS
161 =====
163 The ``build/macosx/catalog.py`` and ``taskcluster/scripts/misc/unpack-sdk.py``
164 scripts are used to manage and get macOS SDKs.
166 The ``build/macosx/catalog.py`` script is used to explore the Apple
167 software update catalog. Running the script with no argument will show
168 a complete list of "products". You probably don't want that, but rather
169 start with a filter:
171 .. code-block:: shell
173     $ ./mach python build/macosx/catalog.py --filter SDK
174     061-44071 Beats Updater 1.0
175     071-29699 Command Line Tools for Xcode 12.5
176     001-89745 Command Line Tools for Xcode 12.4
177     071-54303 Command Line Tools for Xcode 12.5
178     002-41708 Command Line Tools for Xcode 13.2
179     002-83793 Command Line Tools for Xcode 13.4
180     012-92431 Command Line Tools for Xcode 14.2
181     032-64167 Command Line Tools for Xcode 14.3
183 From there, pick the id of the product you're interested in, and run the
184 script again with that id:
186 .. code-block:: shell
188     $ ./mach python build/macosx/catalog.py 032-64167
189     com.apple.pkg.CLTools_Executables https://swcdn.apple.com/content/downloads/38/61/032-64167-A_F8LL7XSTW6/k3kg0uip4kxd3qupgy6y8fzp27mnxdpt6y/CLTools_Executables.pkg
190     com.apple.pkg.CLTools_SDK_macOS13 https://swcdn.apple.com/content/downloads/38/61/032-64167-A_F8LL7XSTW6/k3kg0uip4kxd3qupgy6y8fzp27mnxdpt6y/CLTools_macOSNMOS_SDK.pkg
191     com.apple.pkg.CLTools_SDK_macOS12 https://swcdn.apple.com/content/downloads/38/61/032-64167-A_F8LL7XSTW6/k3kg0uip4kxd3qupgy6y8fzp27mnxdpt6y/CLTools_macOSLMOS_SDK.pkg
192     com.apple.pkg.CLTools_macOS_SDK https://swcdn.apple.com/content/downloads/38/61/032-64167-A_F8LL7XSTW6/k3kg0uip4kxd3qupgy6y8fzp27mnxdpt6y/CLTools_macOS_SDK.pkg
193     com.apple.pkg.CLTools_SwiftBackDeploy https://swcdn.apple.com/content/downloads/38/61/032-64167-A_F8LL7XSTW6/k3kg0uip4kxd3qupgy6y8fzp27mnxdpt6y/CLTools_SwiftBackDeploy.pkg
195 From there, pick the id of the package you're interested in, and run the
196 script again with a combination of both product and package ids to inspect
197 its content and ensure that's what you're looking for.
199 .. code-block:: shell
201     $ ./mach python build/macosx/catalog.py 032-64167/com.apple.pkg.CLTools_SDK_macOS13
202     Library
203     Library/Developer
204     Library/Developer/CommandLineTools
205     Library/Developer/CommandLineTools/SDKs
206     Library/Developer/CommandLineTools/SDKs/MacOSX13.sdk
207     Library/Developer/CommandLineTools/SDKs/MacOSX13.3.sdk
208     Library/Developer/CommandLineTools/SDKs/MacOSX13.3.sdk/usr
209     (...)
211 Once you have found the SDK you want, you can create or update toolchain tasks
212 in ``taskcluster/ci/toolchain/macosx-sdk.yml``.
214 The ``taskcluster/scripts/misc/unpack-sdk.py`` script takes the url of a SDK
215 package, the sha256 hash for its content, the path to the SDK in the package,
216 and an output directory, and extracts the package in that directory.
218 Both scripts should be run via ``mach python``. The latter is automatically
219 invoked by the bootstrapping mechanism.
221 Firefox for Android with Gradle
222 ===============================
224 To build Firefox for Android with Gradle in automation, archives
225 containing both the Gradle executable and a Maven repository
226 comprising the exact build dependencies are produced and uploaded to
227 an internal Mozilla server.  The build automation will download,
228 verify, and extract these archive before building.  These archives
229 provide a self-contained Gradle and Maven repository so that machines
230 don't need to fetch additional Maven dependencies at build time.
231 (Gradle and the downloaded Maven dependencies can be both
232 redistributed publicly.)
234 Archiving the Gradle executable is straight-forward, but archiving a
235 local Maven repository is not.  Therefore a toolchain job exists for
236 producing the required archives, `android-gradle-dependencies`.  The
237 job runs in a container based on a custom Docker image and spawns a
238 Sonatype Nexus proxying Maven repository process in the background.
239 The job builds Firefox for Android using Gradle and the in-tree Gradle
240 configuration rooted at ``build.gradle``.  The spawned proxying Maven
241 repository downloads external dependencies and collects them.  After
242 the Gradle build completes, the job archives the Gradle version used
243 to build, and the downloaded Maven repository, and exposes them as
244 Task Cluster artifacts.
246 To update the version of Gradle in the archive produced, update
247 ``gradle/wrapper/gradle-wrapper.properties``.  Be sure to also update
248 the SHA256 checksum to prevent poisoning the build machines!
250 To update the versions of Gradle dependencies used, update
251 ``dependencies`` sections in the in-tree Gradle configuration rooted
252 at ``build.gradle``.  Once you are confident your changes build
253 locally, push a fresh build to try.  The `android-gradle-dependencies`
254 toolchain should run automatically, fetching your new dependencies and
255 wiring them into the appropriate try build jobs.
257 To update the version of Sonatype Nexus, update the `sonatype-nexus`
258 `fetch` task definition.
260 To modify the Sonatype Nexus configuration, typically to proxy a new
261 remote Maven repository, modify
262 `taskcluster/scripts/misc/android-gradle-dependencies/nexus.xml`.
264 There is also a toolchain job that fetches the Android SDK and related
265 packages.  To update the versions of packaged fetched, modify
266 `python/mozboot/mozboot/android-packages.txt` and update the various
267 in-tree versions accordingly.