diff options
| author | Jakub Beránek <berykubik@gmail.com> | 2025-08-06 16:35:50 +0200 |
|---|---|---|
| committer | Jakub Beránek <berykubik@gmail.com> | 2025-08-10 11:39:06 +0200 |
| commit | 02fc091c9d9410cf5c679f11a9ee1b7a661bd31d (patch) | |
| tree | a8433a04828e1cded4fa8deee85da4edf59f97c3 | |
| parent | 980fe06c62b96fcc200329fbd16535b20223b23f (diff) | |
| download | rust-02fc091c9d9410cf5c679f11a9ee1b7a661bd31d.tar.gz rust-02fc091c9d9410cf5c679f11a9ee1b7a661bd31d.zip | |
Update `Reference` doc step
| -rw-r--r-- | src/bootstrap/src/core/build_steps/doc.rs | 55 | ||||
| -rw-r--r-- | src/bootstrap/src/core/builder/tests.rs | 16 |
2 files changed, 56 insertions, 15 deletions
diff --git a/src/bootstrap/src/core/build_steps/doc.rs b/src/bootstrap/src/core/build_steps/doc.rs index dea1db1bc2b..24dadcd8313 100644 --- a/src/bootstrap/src/core/build_steps/doc.rs +++ b/src/bootstrap/src/core/build_steps/doc.rs @@ -57,7 +57,7 @@ macro_rules! book { src: builder.src.join($path), parent: Some(self), languages: $lang.into(), - rustdoc_compiler: None, + build_compiler: None, }) } } @@ -105,7 +105,7 @@ impl Step for UnstableBook { src: builder.md_doc_out(self.target).join("unstable-book"), parent: Some(self), languages: vec![], - rustdoc_compiler: None, + build_compiler: None, }) } } @@ -117,7 +117,8 @@ struct RustbookSrc<P: Step> { src: PathBuf, parent: Option<P>, languages: Vec<&'static str>, - rustdoc_compiler: Option<Compiler>, + /// Compiler whose rustdoc should be used to document things using `mdbook-spec`. + build_compiler: Option<Compiler>, } impl<P: Step> Step for RustbookSrc<P> { @@ -150,7 +151,7 @@ impl<P: Step> Step for RustbookSrc<P> { let mut rustbook_cmd = builder.tool_cmd(Tool::Rustbook); - if let Some(compiler) = self.rustdoc_compiler { + if let Some(compiler) = self.build_compiler { let mut rustdoc = builder.rustdoc_for_compiler(compiler); rustdoc.pop(); let old_path = env::var_os("PATH").unwrap_or_default(); @@ -193,11 +194,21 @@ impl<P: Step> Step for RustbookSrc<P> { builder.maybe_open_in_browser::<P>(index) } } + + fn metadata(&self) -> Option<StepMetadata> { + let mut metadata = StepMetadata::doc(&format!("{} (book)", self.name), self.target); + if let Some(compiler) = self.build_compiler { + metadata = metadata.built_by(compiler); + } + + Some(metadata) + } } #[derive(Debug, Clone, Hash, PartialEq, Eq)] pub struct TheBook { - compiler: Compiler, + /// Compiler whose rustdoc will be used to generated documentation. + build_compiler: Compiler, target: TargetSelection, } @@ -212,7 +223,7 @@ impl Step for TheBook { fn make_run(run: RunConfig<'_>) { run.builder.ensure(TheBook { - compiler: run.builder.compiler(run.builder.top_stage, run.builder.config.host_target), + build_compiler: prepare_doc_compiler(run.builder, run.target, run.builder.top_stage), target: run.target, }); } @@ -229,7 +240,7 @@ impl Step for TheBook { fn run(self, builder: &Builder<'_>) { builder.require_submodule("src/doc/book", None); - let compiler = self.compiler; + let compiler = self.build_compiler; let target = self.target; let absolute_path = builder.src.join("src/doc/book"); @@ -242,7 +253,7 @@ impl Step for TheBook { src: absolute_path.clone(), parent: Some(self), languages: vec![], - rustdoc_compiler: None, + build_compiler: None, }); // building older edition redirects @@ -255,7 +266,7 @@ impl Step for TheBook { // treat the other editions as not having a parent. parent: Option::<Self>::None, languages: vec![], - rustdoc_compiler: None, + build_compiler: None, }); } @@ -1271,15 +1282,18 @@ impl Step for RustcBook { src: out_base, parent: Some(self), languages: vec![], - rustdoc_compiler: None, + build_compiler: None, }); } } +/// Documents the reference. +/// It is always done using a stage 1+ compiler, because it references in-tree compiler/stdlib +/// concepts. #[derive(Ord, PartialOrd, Debug, Clone, Hash, PartialEq, Eq)] pub struct Reference { - pub compiler: Compiler, - pub target: TargetSelection, + build_compiler: Compiler, + target: TargetSelection, } impl Step for Reference { @@ -1292,8 +1306,19 @@ impl Step for Reference { } fn make_run(run: RunConfig<'_>) { + // Bump the stage to 2, because the reference requires an in-tree compiler. + // At the same time, since this step is enabled by default, we don't want `x doc` to fail + // in stage 1. + // FIXME: create a shared method on builder for auto-bumping, and print some warning when + // it happens. + let stage = if run.builder.config.is_explicit_stage() || run.builder.top_stage >= 2 { + run.builder.top_stage + } else { + 2 + }; + run.builder.ensure(Reference { - compiler: run.builder.compiler(run.builder.top_stage, run.builder.config.host_target), + build_compiler: prepare_doc_compiler(run.builder, run.target, stage), target: run.target, }); } @@ -1304,14 +1329,14 @@ impl Step for Reference { // This is needed for generating links to the standard library using // the mdbook-spec plugin. - builder.std(self.compiler, builder.config.host_target); + builder.std(self.build_compiler, builder.config.host_target); // Run rustbook/mdbook to generate the HTML pages. builder.ensure(RustbookSrc { target: self.target, name: "reference".to_owned(), src: builder.src.join("src/doc/reference"), - rustdoc_compiler: Some(self.compiler), + build_compiler: Some(self.build_compiler), parent: Some(self), languages: vec![], }); diff --git a/src/bootstrap/src/core/builder/tests.rs b/src/bootstrap/src/core/builder/tests.rs index e45a5b8fba9..4fc2f56da88 100644 --- a/src/bootstrap/src/core/builder/tests.rs +++ b/src/bootstrap/src/core/builder/tests.rs @@ -1870,6 +1870,22 @@ mod snapshot { [doc] Compiletest <host> "); } + + // Reference should be auto-bumped to stage 2. + #[test] + fn doc_reference() { + let ctx = TestCtx::new(); + insta::assert_snapshot!( + ctx.config("doc") + .path("reference") + .render_steps(), @r" + [build] llvm <host> + [build] rustc 0 <host> -> rustc 1 <host> + [build] rustc 1 <host> -> std 1 <host> + [build] rustc 0 <host> -> Rustbook 1 <host> + [doc] rustc 1 <host> -> reference (book) 2 <host> + "); + } } struct ExecutedSteps { |
