blob: 3dc82da7aea0ecb3c83e504bae5cb147a8142bc9 [file] [log] [blame]
The only kind of bootstrap used here is `build`, which will erroneously try to build the Rust unit
test framework on all targets. On many targets, this is a harmless mistake, but on the bare metal
targets, this leads to an error such as:
warning: dropping unsupported crate type `dylib` for target `thumbv6m-none-eabi`
error[E0463]: can't find crate for `std`
error: aborting due to previous error
For more information about this error, try `rustc --explain E0463`.
error: Could not compile `term`.
The missing `std` crate is expected because building the `std` crate is not applicable on bare metal
targets. A deeper analysis of the bootstrap code follows:
In many instances in the bootstrap code, there appear lines such as:
builder.ensure(compile::Test { compiler, target });
These "ensure" that a specific target will get a certain component built (`compile::Test` in the
above line), if not already previously "ensured." Usually, there is a guard clause checking to see
if `target` is a `no_std` target (i.e. bare metal). However, these guard clauses and "ensure" calls
are moot because `compile::Test` is part of the initialzed list of ensured bootstrap components for
`Kind::Build` meaning that even `no_std` targets will get the unit test framework built, which has
already been established as an impossibility.
Note that there is a ton of code motion as of this commit:
https://github.com/rust-lang/rust/commit/b47c9690d2974ec0318f1e87bf38f8f7ee6cf202
Seeing as the `Std` build step behaves properly on no_std builds (see the comment in
'src/bootstrap/compile.rs': "for no-std targets we only compile a few no_std crates"), the merge the
libtest build step with libstd may actually mean things work properly without this patch in future
rust releases.
diff --git a/src/bootstrap/builder.rs b/src/bootstrap/builder.rs
index 4cd793adaf5..c9cd92b95f5 100644
--- a/src/bootstrap/compile.rs
+++ b/src/bootstrap/compile.rs
@@ -390,6 +390,10 @@ impl Step for Test {
let target = self.target;
let compiler = self.compiler;
+ if builder.no_std(target) == Some(true) {
+ return;
+ }
+
builder.ensure(Std { compiler, target });
if builder.config.keep_stage.contains(&compiler.stage) {