diff --git a/src/bootstrap/builder.rs b/src/bootstrap/builder.rs index 5c287f25e26bc..861f47484b96e 100644 --- a/src/bootstrap/builder.rs +++ b/src/bootstrap/builder.rs @@ -708,6 +708,80 @@ impl<'a> Builder<'a> { ) -> Command { let mut cargo = Command::new(&self.initial_cargo); let out_dir = self.stage_out(compiler, mode); + + // command specific path, we call clear_if_dirty with this + let mut my_out = match cmd { + "build" => self.cargo_out(compiler, mode, target), + + // This is the intended out directory for crate documentation. + "doc" => self.crate_doc_out(target), + + _ => self.stage_out(compiler, mode), + }; + + // This is for the original compiler, but if we're forced to use stage 1, then + // std/test/rustc stamps won't exist in stage 2, so we need to get those from stage 1, since + // we copy the libs forward. + let cmp = if self.force_use_stage1(compiler, target) { + self.compiler(1, compiler.host) + } else { + compiler + }; + + let libstd_stamp = match cmd { + "check" => check::libstd_stamp(self, cmp, target), + _ => compile::libstd_stamp(self, cmp, target), + }; + + let libtest_stamp = match cmd { + "check" => check::libtest_stamp(self, cmp, target), + _ => compile::libstd_stamp(self, cmp, target), + }; + + let librustc_stamp = match cmd { + "check" => check::librustc_stamp(self, cmp, target), + _ => compile::librustc_stamp(self, cmp, target), + }; + + if cmd == "doc" { + if mode == Mode::Rustc || mode == Mode::ToolRustc || mode == Mode::Codegen { + // This is the intended out directory for compiler documentation. + my_out = self.compiler_doc_out(target); + } + let rustdoc = self.rustdoc(compiler.host); + self.clear_if_dirty(&my_out, &rustdoc); + } else if cmd != "test" { + match mode { + Mode::Std => { + self.clear_if_dirty(&my_out, &self.rustc(compiler)); + }, + Mode::Test => { + self.clear_if_dirty(&my_out, &libstd_stamp); + }, + Mode::Rustc => { + self.clear_if_dirty(&my_out, &self.rustc(compiler)); + self.clear_if_dirty(&my_out, &libstd_stamp); + self.clear_if_dirty(&my_out, &libtest_stamp); + }, + Mode::Codegen => { + self.clear_if_dirty(&my_out, &librustc_stamp); + }, + Mode::ToolBootstrap => { }, + Mode::ToolStd => { + self.clear_if_dirty(&my_out, &libstd_stamp); + }, + Mode::ToolTest => { + self.clear_if_dirty(&my_out, &libstd_stamp); + self.clear_if_dirty(&my_out, &libtest_stamp); + }, + Mode::ToolRustc => { + self.clear_if_dirty(&my_out, &libstd_stamp); + self.clear_if_dirty(&my_out, &libtest_stamp); + self.clear_if_dirty(&my_out, &librustc_stamp); + }, + } + } + cargo .env("CARGO_TARGET_DIR", out_dir) .arg(cmd); diff --git a/src/bootstrap/check.rs b/src/bootstrap/check.rs index 20cdfcb3d2981..11463c1a056ec 100644 --- a/src/bootstrap/check.rs +++ b/src/bootstrap/check.rs @@ -12,7 +12,7 @@ use compile::{run_cargo, std_cargo, test_cargo, rustc_cargo, rustc_cargo_env, add_to_sysroot}; use builder::{RunConfig, Builder, ShouldRun, Step}; -use tool::{self, prepare_tool_cargo, SourceType}; +use tool::{prepare_tool_cargo, SourceType}; use {Compiler, Mode}; use cache::{INTERNER, Interned}; use std::path::PathBuf; @@ -40,14 +40,11 @@ impl Step for Std { let target = self.target; let compiler = builder.compiler(0, builder.config.build); - let out_dir = builder.stage_out(compiler, Mode::Std); - builder.clear_if_dirty(&out_dir, &builder.rustc(compiler)); - let mut cargo = builder.cargo(compiler, Mode::Std, target, "check"); std_cargo(builder, &compiler, target, &mut cargo); let _folder = builder.fold_output(|| format!("stage{}-std", compiler.stage)); - println!("Checking std artifacts ({} -> {})", &compiler.host, target); + builder.info(&format!("Checking std artifacts ({} -> {})", &compiler.host, target)); run_cargo(builder, &mut cargo, vec![], @@ -88,15 +85,13 @@ impl Step for Rustc { let compiler = builder.compiler(0, builder.config.build); let target = self.target; - let stage_out = builder.stage_out(compiler, Mode::Rustc); - builder.clear_if_dirty(&stage_out, &libstd_stamp(builder, compiler, target)); - builder.clear_if_dirty(&stage_out, &libtest_stamp(builder, compiler, target)); + builder.ensure(Test { target }); let mut cargo = builder.cargo(compiler, Mode::Rustc, target, "check"); rustc_cargo(builder, &mut cargo); let _folder = builder.fold_output(|| format!("stage{}-rustc", compiler.stage)); - println!("Checking compiler artifacts ({} -> {})", &compiler.host, target); + builder.info(&format!("Checking compiler artifacts ({} -> {})", &compiler.host, target)); run_cargo(builder, &mut cargo, vec![], @@ -139,8 +134,7 @@ impl Step for CodegenBackend { let target = self.target; let backend = self.backend; - let out_dir = builder.cargo_out(compiler, Mode::Codegen, target); - builder.clear_if_dirty(&out_dir, &librustc_stamp(builder, compiler, target)); + builder.ensure(Rustc { target }); let mut cargo = builder.cargo(compiler, Mode::Codegen, target, "check"); cargo.arg("--manifest-path").arg(builder.src.join("src/librustc_codegen_llvm/Cargo.toml")); @@ -180,14 +174,13 @@ impl Step for Test { let compiler = builder.compiler(0, builder.config.build); let target = self.target; - let out_dir = builder.stage_out(compiler, Mode::Test); - builder.clear_if_dirty(&out_dir, &libstd_stamp(builder, compiler, target)); + builder.ensure(Std { target }); let mut cargo = builder.cargo(compiler, Mode::Test, target, "check"); test_cargo(builder, &compiler, target, &mut cargo); let _folder = builder.fold_output(|| format!("stage{}-test", compiler.stage)); - println!("Checking test artifacts ({} -> {})", &compiler.host, target); + builder.info(&format!("Checking test artifacts ({} -> {})", &compiler.host, target)); run_cargo(builder, &mut cargo, vec![], @@ -223,10 +216,7 @@ impl Step for Rustdoc { let compiler = builder.compiler(0, builder.config.build); let target = self.target; - let stage_out = builder.stage_out(compiler, Mode::ToolRustc); - builder.clear_if_dirty(&stage_out, &libstd_stamp(builder, compiler, target)); - builder.clear_if_dirty(&stage_out, &libtest_stamp(builder, compiler, target)); - builder.clear_if_dirty(&stage_out, &librustc_stamp(builder, compiler, target)); + builder.ensure(Rustc { target }); let mut cargo = prepare_tool_cargo(builder, compiler, @@ -246,12 +236,7 @@ impl Step for Rustdoc { let libdir = builder.sysroot_libdir(compiler, target); add_to_sysroot(&builder, &libdir, &rustdoc_stamp(builder, compiler, target)); - - builder.ensure(tool::CleanTools { - compiler, - target, - cause: Mode::Rustc, - }); + builder.cargo(compiler, Mode::ToolRustc, target, "clean"); } } diff --git a/src/bootstrap/compile.rs b/src/bootstrap/compile.rs index da0ccf5e1773d..287b03f6c491d 100644 --- a/src/bootstrap/compile.rs +++ b/src/bootstrap/compile.rs @@ -32,7 +32,6 @@ use serde_json; use util::{exe, libdir, is_dylib, CiEnv}; use {Compiler, Mode}; use native; -use tool; use cache::{INTERNER, Interned}; use builder::{Step, RunConfig, ShouldRun, Builder}; @@ -107,8 +106,6 @@ impl Step for Std { copy_musl_third_party_objects(builder, target, &libdir); } - let out_dir = builder.cargo_out(compiler, Mode::Std, target); - builder.clear_if_dirty(&out_dir, &builder.rustc(compiler)); let mut cargo = builder.cargo(compiler, Mode::Std, target, "build"); std_cargo(builder, &compiler, target, &mut cargo); @@ -246,11 +243,7 @@ impl Step for StdLink { copy_apple_sanitizer_dylibs(builder, &builder.native_dir(target), "osx", &libdir); } - builder.ensure(tool::CleanTools { - compiler: target_compiler, - target, - cause: Mode::Std, - }); + builder.cargo(target_compiler, Mode::ToolStd, target, "clean"); } } @@ -387,8 +380,6 @@ impl Step for Test { return; } - let out_dir = builder.cargo_out(compiler, Mode::Test, target); - builder.clear_if_dirty(&out_dir, &libstd_stamp(builder, compiler, target)); let mut cargo = builder.cargo(compiler, Mode::Test, target, "build"); test_cargo(builder, &compiler, target, &mut cargo); @@ -448,11 +439,8 @@ impl Step for TestLink { target)); add_to_sysroot(builder, &builder.sysroot_libdir(target_compiler, target), &libtest_stamp(builder, compiler, target)); - builder.ensure(tool::CleanTools { - compiler: target_compiler, - target, - cause: Mode::Test, - }); + + builder.cargo(target_compiler, Mode::ToolTest, target, "clean"); } } @@ -519,9 +507,6 @@ impl Step for Rustc { compiler: builder.compiler(self.compiler.stage, builder.config.build), target: builder.config.build, }); - let cargo_out = builder.cargo_out(compiler, Mode::Rustc, target); - builder.clear_if_dirty(&cargo_out, &libstd_stamp(builder, compiler, target)); - builder.clear_if_dirty(&cargo_out, &libtest_stamp(builder, compiler, target)); let mut cargo = builder.cargo(compiler, Mode::Rustc, target, "build"); rustc_cargo(builder, &mut cargo); @@ -613,11 +598,7 @@ impl Step for RustcLink { target)); add_to_sysroot(builder, &builder.sysroot_libdir(target_compiler, target), &librustc_stamp(builder, compiler, target)); - builder.ensure(tool::CleanTools { - compiler: target_compiler, - target, - cause: Mode::Rustc, - }); + builder.cargo(target_compiler, Mode::ToolRustc, target, "clean"); } } @@ -674,7 +655,6 @@ impl Step for CodegenBackend { } let out_dir = builder.cargo_out(compiler, Mode::Codegen, target); - builder.clear_if_dirty(&out_dir, &librustc_stamp(builder, compiler, target)); let mut cargo = builder.cargo(compiler, Mode::Codegen, target, "rustc"); cargo.arg("--manifest-path") diff --git a/src/bootstrap/doc.rs b/src/bootstrap/doc.rs index 9a5d78e58ea3f..17ccb04a7146d 100644 --- a/src/bootstrap/doc.rs +++ b/src/bootstrap/doc.rs @@ -455,7 +455,6 @@ impl Step for Std { let out = builder.doc_out(target); t!(fs::create_dir_all(&out)); let compiler = builder.compiler(stage, builder.config.build); - let rustdoc = builder.rustdoc(compiler.host); let compiler = if builder.force_use_stage1(compiler, target) { builder.compiler(1, compiler.host) } else { @@ -480,7 +479,6 @@ impl Step for Std { // This way rustdoc generates output directly into the output, and rustdoc // will also directly handle merging. let my_out = builder.crate_doc_out(target); - builder.clear_if_dirty(&my_out, &rustdoc); t!(symlink_dir_force(&builder.config, &my_out, &out_dir)); let mut cargo = builder.cargo(compiler, Mode::Std, target, "doc"); @@ -535,7 +533,6 @@ impl Step for Test { let out = builder.doc_out(target); t!(fs::create_dir_all(&out)); let compiler = builder.compiler(stage, builder.config.build); - let rustdoc = builder.rustdoc(compiler.host); let compiler = if builder.force_use_stage1(compiler, target) { builder.compiler(1, compiler.host) } else { @@ -551,7 +548,6 @@ impl Step for Test { // See docs in std above for why we symlink let my_out = builder.crate_doc_out(target); - builder.clear_if_dirty(&my_out, &rustdoc); t!(symlink_dir_force(&builder.config, &my_out, &out_dir)); let mut cargo = builder.cargo(compiler, Mode::Test, target, "doc"); @@ -603,7 +599,6 @@ impl Step for WhitelistedRustc { let out = builder.doc_out(target); t!(fs::create_dir_all(&out)); let compiler = builder.compiler(stage, builder.config.build); - let rustdoc = builder.rustdoc(compiler.host); let compiler = if builder.force_use_stage1(compiler, target) { builder.compiler(1, compiler.host) } else { @@ -619,7 +614,6 @@ impl Step for WhitelistedRustc { // See docs in std above for why we symlink let my_out = builder.crate_doc_out(target); - builder.clear_if_dirty(&my_out, &rustdoc); t!(symlink_dir_force(&builder.config, &my_out, &out_dir)); let mut cargo = builder.cargo(compiler, Mode::Rustc, target, "doc"); @@ -678,7 +672,6 @@ impl Step for Rustc { // Get the correct compiler for this stage. let compiler = builder.compiler(stage, builder.config.build); - let rustdoc = builder.rustdoc(compiler.host); let compiler = if builder.force_use_stage1(compiler, target) { builder.compiler(1, compiler.host) } else { @@ -699,7 +692,6 @@ impl Step for Rustc { // We do not symlink to the same shared folder that already contains std library // documentation from previous steps as we do not want to include that. let out_dir = builder.stage_out(compiler, Mode::Rustc).join(target).join("doc"); - builder.clear_if_dirty(&out, &rustdoc); t!(symlink_dir_force(&builder.config, &out, &out_dir)); // Build cargo command. @@ -780,7 +772,6 @@ impl Step for Rustdoc { // Get the correct compiler for this stage. let compiler = builder.compiler(stage, builder.config.build); - let rustdoc = builder.rustdoc(compiler.host); let compiler = if builder.force_use_stage1(compiler, target) { builder.compiler(1, compiler.host) } else { @@ -803,7 +794,6 @@ impl Step for Rustdoc { .join(target) .join("doc"); t!(fs::create_dir_all(&out_dir)); - builder.clear_if_dirty(&out, &rustdoc); t!(symlink_dir_force(&builder.config, &out, &out_dir)); // Build cargo command. diff --git a/src/bootstrap/lib.rs b/src/bootstrap/lib.rs index 2725abdc3d95f..5e4c1786b0d31 100644 --- a/src/bootstrap/lib.rs +++ b/src/bootstrap/lib.rs @@ -347,6 +347,7 @@ pub enum Mode { /// Compile a tool which uses all libraries we compile (up to rustc). /// Doesn't use the stage0 compiler libraries like "other", and includes /// tools like rustdoc, cargo, rls, etc. + ToolTest, ToolStd, ToolRustc, } @@ -567,6 +568,7 @@ impl Build { Mode::Codegen => "-codegen", Mode::ToolBootstrap => "-bootstrap-tools", Mode::ToolStd => "-tools", + Mode::ToolTest => "-tools", Mode::ToolRustc => "-tools", }; self.out.join(&*compiler.host) diff --git a/src/bootstrap/tool.rs b/src/bootstrap/tool.rs index 04aaa97065473..e5299761a159f 100644 --- a/src/bootstrap/tool.rs +++ b/src/bootstrap/tool.rs @@ -19,62 +19,12 @@ use Mode; use Compiler; use builder::{Step, RunConfig, ShouldRun, Builder}; use util::{exe, add_lib_path}; -use compile::{self, libtest_stamp, libstd_stamp, librustc_stamp}; +use compile; use native; use channel::GitInfo; use cache::Interned; use toolstate::ToolState; -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub struct CleanTools { - pub compiler: Compiler, - pub target: Interned, - pub cause: Mode, -} - -impl Step for CleanTools { - type Output = (); - - fn should_run(run: ShouldRun) -> ShouldRun { - run.never() - } - - fn run(self, builder: &Builder) { - let compiler = self.compiler; - let target = self.target; - let cause = self.cause; - - // This is for the original compiler, but if we're forced to use stage 1, then - // std/test/rustc stamps won't exist in stage 2, so we need to get those from stage 1, since - // we copy the libs forward. - let tools_dir = builder.stage_out(compiler, Mode::ToolRustc); - let compiler = if builder.force_use_stage1(compiler, target) { - builder.compiler(1, compiler.host) - } else { - compiler - }; - - for &cur_mode in &[Mode::Std, Mode::Test, Mode::Rustc] { - let stamp = match cur_mode { - Mode::Std => libstd_stamp(builder, compiler, target), - Mode::Test => libtest_stamp(builder, compiler, target), - Mode::Rustc => librustc_stamp(builder, compiler, target), - _ => panic!(), - }; - - if builder.clear_if_dirty(&tools_dir, &stamp) { - break; - } - - // If we are a rustc tool, and std changed, we also need to clear ourselves out -- our - // dependencies depend on std. Therefore, we iterate up until our own mode. - if cause == cur_mode { - break; - } - } - } -} - #[derive(Debug, Clone, Hash, PartialEq, Eq)] pub enum SourceType { InTree,