@@ -45,13 +45,13 @@ compiler.
4545
4646```mermaid
4747graph TD
48- s0c["stage0 compiler (1.63 )"]:::downloaded -->|A| s0l("stage0 std (1.64 )"):::with-s0c ;
48+ s0c["stage0 compiler (1.86.0-beta.1 )"]:::downloaded -->|A| s0l("stage0 std (1.86.0-beta.1 )"):::downloaded ;
4949 s0c & s0l --- stepb[ ]:::empty;
50- stepb -->|B| s0ca["stage0 compiler artifacts (1.64 )"]:::with-s0c;
51- s0ca -->|copy| s1c["stage1 compiler (1.64 )"]:::with-s0c;
52- s1c -->|C| s1l("stage1 std (1.64 )"):::with-s1c;
50+ stepb -->|B| s0ca["stage0 compiler artifacts (1.87.0-dev )"]:::with-s0c;
51+ s0ca -->|copy| s1c["stage1 compiler (1.87.0-dev )"]:::with-s0c;
52+ s1c -->|C| s1l("stage1 std (1.87.0-dev )"):::with-s1c;
5353 s1c & s1l --- stepd[ ]:::empty;
54- stepd -->|D| s1ca["stage1 compiler artifacts (1.64 )"]:::with-s1c;
54+ stepd -->|D| s1ca["stage1 compiler artifacts (1.87.0-dev )"]:::with-s1c;
5555 s1ca -->|copy| s2c["stage2 compiler"]:::with-s1c;
5656
5757 classDef empty width:0px,height:0px;
@@ -62,19 +62,21 @@ graph TD
6262
6363### Stage 0: the pre-compiled compiler
6464
65- The stage0 compiler is usually the current _beta_ `rustc` compiler and its
65+ The stage0 compiler is by default the very recent _beta_ `rustc` compiler and its
6666associated dynamic libraries, which `./x.py` will download for you. (You can
67- also configure `./x.py` to use something else.)
67+ also configure `./x.py` to change stage0 to something else.)
6868
69- The stage0 compiler is then used only to compile [`src/bootstrap`],
70- [`library/std`], and [`compiler/rustc`]. When assembling the libraries and
71- binaries that will become the stage1 `rustc` compiler, the freshly compiled
72- `std` and `rustc` are used. There are two concepts at play here: a compiler
73- (with its set of dependencies) and its 'target' or 'object' libraries (`std` and
74- `rustc`). Both are staged, but in a staggered manner.
69+ The precompiled stage0 compiler is then used only to compile [`src/bootstrap`] and [`compiler/rustc`]
70+ with precompiled stage0 std.
71+
72+ Note that to build the stage1 compiler we use the precompiled stage0 compiler and std.
73+ Therefore, to use a compiler with a std that is freshly built from the tree, you need to
74+ build the stage2 compiler.
75+
76+ There are two concepts at play here: a compiler (with its set of dependencies) and its
77+ 'target' or 'object' libraries (`std` and `rustc`). Both are staged, but in a staggered manner.
7578
7679[`compiler/rustc`]: https://github.com/rust-lang/rust/tree/master/compiler/rustc
77- [`library/std`]: https://github.com/rust-lang/rust/tree/master/library/std
7880[`src/bootstrap`]: https://github.com/rust-lang/rust/tree/master/src/bootstrap
7981
8082### Stage 1: from current code, by an earlier compiler
@@ -84,26 +86,25 @@ The rustc source code is then compiled with the `stage0` compiler to produce the
8486
8587### Stage 2: the truly current compiler
8688
87- We then rebuild our `stage1` compiler with itself to produce the `stage2`
89+ We then rebuild the compiler using `stage1` compiler with in-tree std to produce the `stage2`
8890compiler.
8991
90- In theory, the `stage1` compiler is functionally identical to the `stage2`
91- compiler, but in practice there are subtle differences. In particular, the
92- `stage1` compiler itself was built by `stage0` and hence not by the source in
93- your working directory. This means that the ABI generated by the `stage0`
94- compiler may not match the ABI that would have been made by the `stage1`
95- compiler, which can cause problems for dynamic libraries, tests, and tools using
96- `rustc_private`.
92+ The `stage1` compiler itself was built by precompiled `stage0` compiler and std
93+ and hence not by the source in your working directory. This means that the ABI
94+ generated by the `stage0` compiler may not match the ABI that would have been made
95+ by the `stage1` compiler, which can cause problems for dynamic libraries, tests
96+ and tools using `rustc_private`.
9797
9898Note that the `proc_macro` crate avoids this issue with a `C` FFI layer called
9999`proc_macro::bridge`, allowing it to be used with `stage1`.
100100
101101The `stage2` compiler is the one distributed with `rustup` and all other install
102102methods. However, it takes a very long time to build because one must first
103103build the new compiler with an older compiler and then use that to build the new
104- compiler with itself. For development, you usually only want the `stage1`
105- compiler, which you can build with `./x build library`. See [Building the
106- compiler](../how-to-build-and-run.html#building-the-compiler).
104+ compiler with itself.
105+
106+ For development, you usually only want to use `--stage 1` flag to build things.
107+ See [Building the compiler](../how-to-build-and-run.html#building-the-compiler).
107108
108109### Stage 3: the same-result test
109110
@@ -114,10 +115,11 @@ something has broken.
114115### Building the stages
115116
116117The script [`./x`] tries to be helpful and pick the stage you most likely meant
117- for each subcommand. These defaults are as follows :
118+ for each subcommand. Here are some `x` commands with their default stages :
118119
119- - `check`: `--stage 0`
120- - `doc`: `--stage 0`
120+ - `check`: `--stage 1`
121+ - `clippy`: `--stage 1`
122+ - `doc`: `--stage 1`
121123- `build`: `--stage 1`
122124- `test`: `--stage 1`
123125- `dist`: `--stage 2`
@@ -191,8 +193,8 @@ include, but are not limited to:
191193 without building `rustc` from source ('build with `stage0`, then test the
192194 artifacts'). If you're working on the standard library, this is normally the
193195 test command you want.
194- - `./x build --stage 0` means to build with the beta `rustc`.
195- - `./x doc --stage 0` means to document using the beta `rustdoc`.
196+ - `./x build --stage 0` means to build with the stage0 `rustc`.
197+ - `./x doc --stage 0` means to document using the stage0 `rustdoc`.
196198
197199#### Examples of what *not* to do
198200
@@ -208,9 +210,6 @@ include, but are not limited to:
208210
209211### Building vs. running
210212
211- Note that `build --stage N compiler/rustc` **does not** build the stage N
212- compiler: instead it builds the stage N+1 compiler _using_ the stage N compiler.
213-
214213In short, _stage 0 uses the `stage0` compiler to create `stage0` artifacts which
215214will later be uplifted to be the stage1 compiler_.
216215
@@ -268,23 +267,6 @@ However, when cross-compiling, `stage1` `std` will only run on the host. So the
268267
269268(See in the table how `stage2` only builds non-host `std` targets).
270269
271- ### Why does only libstd use `cfg(bootstrap)`?
272-
273- For docs on `cfg(bootstrap)` itself, see [Complications of
274- Bootstrapping](#complications-of-bootstrapping).
275-
276- The `rustc` generated by the `stage0` compiler is linked to the freshly-built
277- `std`, which means that for the most part only `std` needs to be `cfg`-gated, so
278- that `rustc` can use features added to `std` immediately after their addition,
279- without need for them to get into the downloaded `beta` compiler.
280-
281- Note this is different from any other Rust program: `stage1` `rustc` is built by
282- the _beta_ compiler, but using the _master_ version of `libstd`!
283-
284- The only time `rustc` uses `cfg(bootstrap)` is when it adds internal lints that
285- use diagnostic items, or when it uses unstable library features that were
286- recently changed.
287-
288270### What is a 'sysroot'?
289271
290272When you build a project with `cargo`, the build artifacts for dependencies are
@@ -459,7 +441,6 @@ compiler itself uses to run. These aren't actually used by artifacts the new
459441compiler generates. This step also copies the `rustc` and `rustdoc` binaries we
460442generated into `build/$HOST/stage/bin`.
461443
462- The `stage1/bin/rustc` is a fully functional compiler, but it doesn't yet have
463- any libraries to link built binaries or libraries to. The next 3 steps will
464- provide those libraries for it; they are mostly equivalent to constructing the
465- `stage1/bin` compiler so we don't go through them individually here.
444+ The `stage1/bin/rustc` is a fully functional compiler built with stage0 (precompiled) compiler and std.
445+ To use a compiler built entirely from source with the in-tree compiler and std, you need to build the
446+ stage2 compiler, which is compiled using the stage1 (in-tree) compiler and std.
0 commit comments