diff --git a/content/inside-rust/stage0-redesign/index.md b/content/inside-rust/stage0-redesign/index.md new file mode 100644 index 000000000..fbe8e689f --- /dev/null +++ b/content/inside-rust/stage0-redesign/index.md @@ -0,0 +1,56 @@ ++++ +path = "inside-rust/9999/12/31/redesigning-stage-0-std" +title = "Redesigning stage 0 std" +authors = ["Jieyou Xu"] + +[extra] +team = "Bootstrap" +team_url = "https://www.rust-lang.org/governance/teams/infra#team-bootstrap" ++++ + +# Redesigning stage 0 std + +## Summary + +We are reworking how the stage 0 bootstrap sequence works (the sequence used to build a stage 1 compiler). + +- Before: a stage 0 (beta by default) compiler is used to build the in-tree std, which in turn is used to build the stage 1 compiler. +- After: a stage 0 (beta by default) compiler and a precompiled stage 0 std is instead used to build the stage 1 compiler. + +![Difference in stage 0 bootstrap sequence](stage0-redesign-diff.svg) + +Notably, this means that after [redesign stage 0 std #119899](https://github.com/rust-lang/rust/pull/119899) PR lands: + +- `./x {build,test,check} library --stage 0` becomes no-op, as stage 0 std is no longer the built in-tree std, and the minimum supported stage to build std is now `1`. + - Consequently, default (test, check, bench) stage values in the library profile are no longer `0`, but instead defaults to `1`. +- Some additional `cfg(bootstrap)` usages may be needed in the compiler sources for dogfooding unstable library features. + +## Motivation + +The previous stage 0 bootstrapping sequence was a source of endless confusion for compiler, library and bootstrap contributors alike, because std had to support being built by *both* a previous beta rustc and in-tree rustc, with `cfg(bootstrap)` in std sources necessary to distinguish between them. By adjusting the stage 0 bootstrap sequence to instead use a precompiled stage 0 std instead of building the in-tree std, we hope to (1) simplify library development workflow to no longer need `cfg(bootstrap)` and (2) enable simplifying some bootstrap logic related to building in-tree std in stage 0. + +This was [originally proposed by @jyn514 in the MCP rust-lang/compiler-team#619](https://github.com/rust-lang/compiler-team/issues/619). + +## What does this mean for a typical library workflow? + +- Crucially, `./x {build,test,check} library --stage 0` becomes no-op and are no longer supported. Building the in-tree std now requires a stage 1 compiler. + - Consequently, library contributors are *strongly* encouraged to enable `rust.download-rustc = "if-unchanged"` to avoid having to build a stage 1 compiler. Note that this is the default for `profile = "library"`, but you may need to specify it manually if you don't use a `profile`. +- `cfg(bootstrap)` should no longer be needed for library sources. + +### Caveat: `libtest` changes + +See the *Recommended config: have `compiletest` instead depend on precompiled stage 0 libtest* section below. + +## What does this mean for a typical compiler workflow? + +- If unstable library features are being dogfooded, some additional `cfg(bootstrap)` usages may now be needed in compiler sources. + +### Caveat: `libtest` changes + +See the *Recommended config: have `compiletest` instead depend on precompiled stage 0 libtest* section below. + +## Recommended config: have `compiletest` instead depend on precompiled stage 0 libtest + +`compiletest` currently depends on in-tree libtest. For workflows that involve building the compiler, this can cause `compiletest` rebuilds if stage 1 library is rebuilt as a consequence of compiler changes. If you don't intend to change libtest, you can [specify `build.compiletest-use-stage0-libtest = true` to instead have `compiletest` depend on precompiled stage 0 libtest](https://github.com/rust-lang/rust/pull/139386). That way, compiler test iterations can avoid rebuilding `compiletest` unnecessarily. This is already the default unless the `dist` profile is used. + +Note that some CI jobs have `build.compiletest-use-stage0-libtest = true` set while others have `build.compiletest-use-stage0-libtest = false`, meaning that libtest programmatic API changes can require adding `cfg(bootstrap)`/`cfg(not(bootstrap))` to `compiletest`'s libtest API use sites. However, in practice we expect this to be very rare. diff --git a/content/inside-rust/stage0-redesign/stage0-redesign-diff.svg b/content/inside-rust/stage0-redesign/stage0-redesign-diff.svg new file mode 100644 index 000000000..5751ab021 --- /dev/null +++ b/content/inside-rust/stage0-redesign/stage0-redesign-diff.svg @@ -0,0 +1,3 @@ + + +
Builds
Builds
stage 0 compiler (1.86.0-beta.1)
stage 0 compiler (1.86.0-beta.1)
stage 0 std (1.86.0-beta.1)
stage 0 std (1.86.0-beta.1)
Assemble
Assemble
stage 0 compiler artifacts (1.87.0-dev)
stage 0 compiler artifacts (1.87.0-dev)
Builds
Builds
stage 1 compiler (1.87.0-dev)
stage 1 compiler (1.87.0-dev)
stage 1 std (1.87.0-dev)
stage 1 std (1.87.0-dev)
Assemble
Assemble
stage 1 compiler artifacts (1.87.0-dev)
stage 1 compiler artifacts (1.87.0-dev)
stage 2 compiler (1.87.0-dev)
stage 2 compiler (1.87.0-dev)

After stage 0 std redesign

Note specifically stage 0 std difference, as stage 0 std is now the precompiled beta std (by default).

After stage 0 std redesign...
Builds
Builds
stage 0 compiler (1.86.0-beta.1)
stage 0 compiler (1.86.0-beta.1)
stage 0 std (1.87.0-dev)
stage 0 std (1.87.0-dev)
Assemble
Assemble
stage 0 compiler artifacts (1.87.0-dev)
stage 0 compiler artifacts (1.87.0-dev)
Builds
Builds
stage 1 compiler (1.87.0-dev)
stage 1 compiler (1.87.0-dev)
stage 1 std (1.87.0-dev)
stage 1 std (1.87.0-dev)
Assemble
Assemble
stage 1 compiler artifacts (1.87.0-dev)
stage 1 compiler artifacts (1.87.0-dev)
stage 2 compiler (1.87.0-dev)
stage 2 compiler (1.87.0-dev)

Before stage 0 std redesign

Stage 0 std corresponds to in-tree std built by precompiled beta rustc (by default).

Before stage 0 std redesign...
Precompiled (and downloaded) by default
Precompiled (and downloa...
Built by stage 0 compiler
Built by stage 0 compiler
Built by stage 1 compiler
Built by stage 1 compiler
Key
Key
\ No newline at end of file