diff options
| author | Joshua Nelson <jnelson@cloudflare.com> | 2022-07-10 17:24:43 -0500 |
|---|---|---|
| committer | Joshua Nelson <jnelson@cloudflare.com> | 2022-07-10 17:50:09 -0500 |
| commit | 7d4bd54f751db36a32a7d4594f075bf1a0b92bbf (patch) | |
| tree | 741d63651584b541533641e7a2aad6268170fdb2 /src/bootstrap/compile.rs | |
| parent | 17355a3b9f30e16870a1890033bd13463c664f81 (diff) | |
| download | rust-7d4bd54f751db36a32a7d4594f075bf1a0b92bbf.tar.gz rust-7d4bd54f751db36a32a7d4594f075bf1a0b92bbf.zip | |
Fix `x build library/std compiler/rustc`
Previously, this was broken because of improper caching: 1. `StepDescription::maybe_run` builds `Compile::Std`, which only built `std` and not `proc_macro` 1. `Std` calls `builder.ensure(StdLink)` 1. `Rustc` calls `ensure(Std)`, which builds all crates, including `proc_macro` 1. `Rustc` calls `ensure(StdLink)`. `ensure` would see that it had already been run and do nothing. <-- bug is here 1. Cargo gives an error that `proc_macro` doesn't exist. This fixes the caching by adding `crates` to `StdLink`, so it will get rerun if the crates that are built change. This also does the same for `RustcLink`; it doesn't matter in practice currently because nothing uses it except `impl Step for Rustc`, but it will avoid bugs if we start using it in the future (e.g. to build individual crates for rustfmt).
Diffstat (limited to 'src/bootstrap/compile.rs')
| -rw-r--r-- | src/bootstrap/compile.rs | 60 |
1 files changed, 38 insertions, 22 deletions
diff --git a/src/bootstrap/compile.rs b/src/bootstrap/compile.rs index ed5023ac61b..c099fedc3a7 100644 --- a/src/bootstrap/compile.rs +++ b/src/bootstrap/compile.rs @@ -104,7 +104,7 @@ impl Step for Std { || builder.config.keep_stage_std.contains(&compiler.stage) { builder.info("Warning: Using a potentially old libstd. This may not behave well."); - builder.ensure(StdLink { compiler, target_compiler: compiler, target }); + builder.ensure(StdLink::from_std(self, compiler)); return; } @@ -122,11 +122,7 @@ impl Step for Std { copy_third_party_objects(builder, &compiler, target); copy_self_contained_objects(builder, &compiler, target); - builder.ensure(StdLink { - compiler: compiler_to_use, - target_compiler: compiler, - target, - }); + builder.ensure(StdLink::from_std(self, compiler_to_use)); return; } @@ -149,11 +145,10 @@ impl Step for Std { false, ); - builder.ensure(StdLink { - compiler: builder.compiler(compiler.stage, builder.config.build), - target_compiler: compiler, - target, - }); + builder.ensure(StdLink::from_std( + self, + builder.compiler(compiler.stage, builder.config.build), + )); } } @@ -394,6 +389,19 @@ struct StdLink { pub compiler: Compiler, pub target_compiler: Compiler, pub target: TargetSelection, + /// Not actually used; only present to make sure the cache invalidation is correct. + crates: Interned<Vec<String>>, +} + +impl StdLink { + fn from_std(std: Std, host_compiler: Compiler) -> Self { + Self { + compiler: host_compiler, + target_compiler: std.compiler, + target: std.target, + crates: std.crates, + } + } } impl Step for StdLink { @@ -614,7 +622,7 @@ impl Step for Rustc { if builder.config.keep_stage.contains(&compiler.stage) { builder.info("Warning: Using a potentially old librustc. This may not behave well."); builder.info("Warning: Use `--keep-stage-std` if you want to rebuild the compiler when it changes"); - builder.ensure(RustcLink { compiler, target_compiler: compiler, target }); + builder.ensure(RustcLink::from_rustc(self, compiler)); return; } @@ -623,11 +631,7 @@ impl Step for Rustc { builder.ensure(Rustc::new(compiler_to_use, target)); builder .info(&format!("Uplifting stage1 rustc ({} -> {})", builder.config.build, target)); - builder.ensure(RustcLink { - compiler: compiler_to_use, - target_compiler: compiler, - target, - }); + builder.ensure(RustcLink::from_rustc(self, compiler_to_use)); return; } @@ -688,11 +692,10 @@ impl Step for Rustc { false, ); - builder.ensure(RustcLink { - compiler: builder.compiler(compiler.stage, builder.config.build), - target_compiler: compiler, - target, - }); + builder.ensure(RustcLink::from_rustc( + self, + builder.compiler(compiler.stage, builder.config.build), + )); } } @@ -807,6 +810,19 @@ struct RustcLink { pub compiler: Compiler, pub target_compiler: Compiler, pub target: TargetSelection, + /// Not actually used; only present to make sure the cache invalidation is correct. + crates: Interned<Vec<String>>, +} + +impl RustcLink { + fn from_rustc(rustc: Rustc, host_compiler: Compiler) -> Self { + Self { + compiler: host_compiler, + target_compiler: rustc.compiler, + target: rustc.target, + crates: rustc.crates, + } + } } impl Step for RustcLink { |
