From 861d007da39418cc145a054cd46c89664ba72e64 Mon Sep 17 00:00:00 2001 From: Mark Rousskov Date: Wed, 6 Feb 2019 11:37:43 +0100 Subject: [PATCH 1/2] Never build rustdoc in stage 0 When a request for rustdoc is passed for stage 0, x.py build --stage 0 src/tools/rustdoc or ensure(tool::Rustdoc { .. }) with top_stage = 0, we return the rustdoc for that compiler (i.e., the beta rustdoc). --- src/bootstrap/tool.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/bootstrap/tool.rs b/src/bootstrap/tool.rs index cd3afc59e560c..45bf26f687a48 100644 --- a/src/bootstrap/tool.rs +++ b/src/bootstrap/tool.rs @@ -418,6 +418,12 @@ impl Step for Rustdoc { fn run(self, builder: &Builder) -> PathBuf { let target_compiler = builder.compiler(builder.top_stage, self.host); + if target_compiler.stage == 0 { + if !target_compiler.is_snapshot(builder) { + panic!("rustdoc in stage 0 must be snapshot rustdoc"); + } + return builder.initial_rustc.with_file_name(exe("rustdoc", &target_compiler.host)); + } let target = target_compiler.host; let build_compiler = if target_compiler.stage == 0 { builder.compiler(0, builder.config.build) From bb23b175e97b5f0c18440bb04efcb562f9026813 Mon Sep 17 00:00:00 2001 From: Mark Rousskov Date: Thu, 7 Feb 2019 16:20:17 +0100 Subject: [PATCH 2/2] This fixes doctests in stage 1 The RUSTDOC_LIBDIR should be rustc_libdir, not sysroot_libdir; rustdoc is like the compiler and should link against rustc's libdir. Some people currently (i.e., in general, may not be on master) have doc tests working, but no attempt to determine why has been attempted. --- src/bootstrap/builder.rs | 11 +++++------ src/bootstrap/tool.rs | 30 ++++++++++++------------------ 2 files changed, 17 insertions(+), 24 deletions(-) diff --git a/src/bootstrap/builder.rs b/src/bootstrap/builder.rs index f512e1d7a0c62..75fe664ef3cf1 100644 --- a/src/bootstrap/builder.rs +++ b/src/bootstrap/builder.rs @@ -677,10 +677,9 @@ impl<'a> Builder<'a> { let compiler = self.compiler(self.top_stage, host); cmd.env("RUSTC_STAGE", compiler.stage.to_string()) .env("RUSTC_SYSROOT", self.sysroot(compiler)) - .env( - "RUSTDOC_LIBDIR", - self.sysroot_libdir(compiler, self.config.build), - ) + // Note that this is *not* the sysroot_libdir because rustdoc must be linked + // equivalently to rustc. + .env("RUSTDOC_LIBDIR", self.rustc_libdir(compiler)) .env("CFG_RELEASE_CHANNEL", &self.config.channel) .env("RUSTDOC_REAL", self.rustdoc(host)) .env("RUSTDOC_CRATE_VERSION", self.rust_version()) @@ -874,7 +873,7 @@ impl<'a> Builder<'a> { } else { &maybe_sysroot }; - let libdir = sysroot.join(libdir(&compiler.host)); + let libdir = self.rustc_libdir(compiler); // Customize the compiler we're running. Specify the compiler to cargo // as our shim and then pass it some various options used to configure @@ -916,7 +915,7 @@ impl<'a> Builder<'a> { cargo.env("RUSTC_ERROR_FORMAT", error_format); } if cmd != "build" && cmd != "check" && cmd != "rustc" && want_rustdoc { - cargo.env("RUSTDOC_LIBDIR", self.sysroot_libdir(compiler, self.config.build)); + cargo.env("RUSTDOC_LIBDIR", self.rustc_libdir(compiler)); } if mode.is_tool() { diff --git a/src/bootstrap/tool.rs b/src/bootstrap/tool.rs index 45bf26f687a48..022f48d69d941 100644 --- a/src/bootstrap/tool.rs +++ b/src/bootstrap/tool.rs @@ -425,24 +425,18 @@ impl Step for Rustdoc { return builder.initial_rustc.with_file_name(exe("rustdoc", &target_compiler.host)); } let target = target_compiler.host; - let build_compiler = if target_compiler.stage == 0 { - builder.compiler(0, builder.config.build) - } else if target_compiler.stage >= 2 { - // Past stage 2, we consider the compiler to be ABI-compatible and hence capable of - // building rustdoc itself. - builder.compiler(target_compiler.stage, builder.config.build) - } else { - // Similar to `compile::Assemble`, build with the previous stage's compiler. Otherwise - // we'd have stageN/bin/rustc and stageN/bin/rustdoc be effectively different stage - // compilers, which isn't what we want. - builder.compiler(target_compiler.stage - 1, builder.config.build) - }; - - builder.ensure(compile::Rustc { compiler: build_compiler, target }); - builder.ensure(compile::Rustc { - compiler: build_compiler, - target: builder.config.build, - }); + // Similar to `compile::Assemble`, build with the previous stage's compiler. Otherwise + // we'd have stageN/bin/rustc and stageN/bin/rustdoc be effectively different stage + // compilers, which isn't what we want. Rustdoc should be linked in the same way as the + // rustc compiler it's paired with, so it must be built with the previous stage compiler. + let build_compiler = builder.compiler(target_compiler.stage - 1, builder.config.build); + + // The presence of `target_compiler` ensures that the necessary libraries (codegen backends, + // compiler libraries, ...) are built. Rustdoc does not require the presence of any + // libraries within sysroot_libdir (i.e., rustlib), though doctests may want it (since + // they'll be linked to those libraries). As such, don't explicitly `ensure` any additional + // libraries here. The intuition here is that If we've built a compiler, we should be able + // to build rustdoc. let mut cargo = prepare_tool_cargo( builder,