Skip to content

Commit b3246e0

Browse files
committed
Set the proper sysroot for clippy
Clippy does its own runtime detection of the sysroot, which was incorrect in this case (it used the beta sysroot). This overrides the sysroot to use `stage0-sysroot` instead. - Get `x.py clippy` to work on nightly - Give a nice error message if nightly clippy isn't installed
1 parent 0da6d42 commit b3246e0

File tree

1 file changed

+39
-2
lines changed

1 file changed

+39
-2
lines changed

src/bootstrap/builder.rs

+39-2
Original file line numberDiff line numberDiff line change
@@ -850,7 +850,40 @@ impl<'a> Builder<'a> {
850850
cargo.args(s.split_whitespace());
851851
}
852852
rustflags.env("RUSTFLAGS_BOOTSTRAP");
853-
rustflags.arg("--cfg=bootstrap");
853+
if cmd == "clippy" {
854+
// clippy overwrites any sysroot we pass on the command line.
855+
// Tell it to use the appropriate sysroot instead.
856+
// NOTE: this can't be fixed in clippy because we explicitly don't set `RUSTC`,
857+
// so it has no way of knowing the sysroot.
858+
rustflags.arg("--sysroot");
859+
rustflags.arg(
860+
self.sysroot(compiler)
861+
.as_os_str()
862+
.to_str()
863+
.expect("sysroot must be valid UTF-8"),
864+
);
865+
// Only run clippy on a very limited subset of crates (in particular, not build scripts).
866+
cargo.arg("-Zunstable-options");
867+
// Explicitly does *not* set `--cfg=bootstrap`, since we're using a nightly clippy.
868+
let host_version = Command::new("rustc").arg("--version").output().map_err(|_| ());
869+
if let Err(_) = host_version.and_then(|output| {
870+
if output.status.success()
871+
&& t!(std::str::from_utf8(&output.stdout)).contains("nightly")
872+
{
873+
Ok(output)
874+
} else {
875+
Err(())
876+
}
877+
}) {
878+
eprintln!(
879+
"error: `x.py clippy` requires a nightly host `rustc` toolchain with the `clippy` component"
880+
);
881+
eprintln!("help: try `rustup default nightly`");
882+
std::process::exit(1);
883+
}
884+
} else {
885+
rustflags.arg("--cfg=bootstrap");
886+
}
854887
}
855888

856889
if self.config.rust_new_symbol_mangling {
@@ -975,7 +1008,6 @@ impl<'a> Builder<'a> {
9751008
// src/bootstrap/bin/{rustc.rs,rustdoc.rs}
9761009
cargo
9771010
.env("RUSTBUILD_NATIVE_DIR", self.native_dir(target))
978-
.env("RUSTC", self.out.join("bootstrap/debug/rustc"))
9791011
.env("RUSTC_REAL", self.rustc(compiler))
9801012
.env("RUSTC_STAGE", stage.to_string())
9811013
.env("RUSTC_SYSROOT", &sysroot)
@@ -991,6 +1023,11 @@ impl<'a> Builder<'a> {
9911023
)
9921024
.env("RUSTC_ERROR_METADATA_DST", self.extended_error_dir())
9931025
.env("RUSTC_BREAK_ON_ICE", "1");
1026+
// Clippy support is a hack and uses the default `cargo-clippy` in path.
1027+
// Don't override RUSTC so that the `cargo-clippy` in path will be run.
1028+
if cmd != "clippy" {
1029+
cargo.env("RUSTC", self.out.join("bootstrap/debug/rustc"));
1030+
}
9941031

9951032
// Dealing with rpath here is a little special, so let's go into some
9961033
// detail. First off, `-rpath` is a linker option on Unix platforms

0 commit comments

Comments
 (0)