66//! which is performed by the `x clippy ci` command.
77//!
88//! In order to prepare a build compiler for running clippy, use the
9- //! ` check::prepare_compiler_for_check` function. That prepares a compiler and a standard library
9+ //! [ check::prepare_compiler_for_check] function. That prepares a compiler and a standard library
1010//! for running Clippy. The second part (actually building Clippy) is performed inside
1111//! [Builder::cargo_clippy_cmd]. It would be nice if this was more explicit, and we actually had
1212//! to pass a prebuilt Clippy from the outside when running `cargo clippy`, but that would be
1313//! (as usual) a massive undertaking/refactoring.
1414
15- use super :: check;
1615use super :: compile:: { run_cargo, rustc_cargo, std_cargo} ;
1716use super :: tool:: { RustcPrivateCompilers , SourceType , prepare_tool_cargo} ;
1817use crate :: builder:: { Builder , ShouldRun } ;
@@ -377,15 +376,19 @@ impl Step for CodegenGcc {
377376
378377macro_rules! lint_any {
379378 ( $(
380- $name: ident, $path: expr, $readable_name: expr
379+ $name: ident,
380+ $path: expr,
381+ $readable_name: expr,
382+ $mode: expr
381383 $( , lint_by_default = $lint_by_default: expr) *
382384 ;
383385 ) +) => {
384386 $(
385387
386388 #[ derive( Debug , Clone , Hash , PartialEq , Eq ) ]
387389 pub struct $name {
388- pub target: TargetSelection ,
390+ build_compiler: Compiler ,
391+ target: TargetSelection ,
389392 config: LintConfig ,
390393 }
391394
@@ -400,23 +403,19 @@ macro_rules! lint_any {
400403 fn make_run( run: RunConfig <' _>) {
401404 let config = LintConfig :: new( run. builder) ;
402405 run. builder. ensure( $name {
406+ build_compiler: prepare_compiler_for_check( run. builder, run. target, $mode) ,
403407 target: run. target,
404408 config,
405409 } ) ;
406410 }
407411
408412 fn run( self , builder: & Builder <' _>) -> Self :: Output {
409- let build_compiler = builder . compiler ( builder . top_stage , builder . config . host_target ) ;
413+ let build_compiler = self . build_compiler ;
410414 let target = self . target;
411-
412- if !builder. download_rustc( ) {
413- builder. ensure( check:: Rustc :: new( builder, target, vec![ ] ) ) ;
414- } ;
415-
416415 let cargo = prepare_tool_cargo(
417416 builder,
418417 build_compiler,
419- Mode :: ToolRustc ,
418+ $mode ,
420419 target,
421420 Kind :: Clippy ,
422421 $path,
@@ -427,13 +426,13 @@ macro_rules! lint_any {
427426 let _guard = builder. msg(
428427 Kind :: Clippy ,
429428 $readable_name,
430- Mode :: ToolRustc ,
429+ $mode ,
431430 build_compiler,
432431 target,
433432 ) ;
434433
435434 let stringified_name = stringify!( $name) . to_lowercase( ) ;
436- let stamp = BuildStamp :: new( & builder. cargo_out( build_compiler, Mode :: ToolRustc , target) )
435+ let stamp = BuildStamp :: new( & builder. cargo_out( build_compiler, $mode , target) )
437436 . with_prefix( & format!( "{}-check" , stringified_name) ) ;
438437
439438 run_cargo(
@@ -455,30 +454,32 @@ macro_rules! lint_any {
455454 }
456455}
457456
457+ // Note: we use ToolTarget instead of ToolBootstrap here, to allow linting in-tree host tools
458+ // using the in-tree Clippy. Because Mode::ToolBootstrap would always use stage 0 rustc/Clippy.
458459lint_any ! (
459- Bootstrap , "src/bootstrap" , "bootstrap" ;
460- BuildHelper , "src/build_helper" , "build_helper" ;
461- BuildManifest , "src/tools/build-manifest" , "build-manifest" ;
462- CargoMiri , "src/tools/miri/cargo-miri" , "cargo-miri" ;
463- Clippy , "src/tools/clippy" , "clippy" ;
464- CollectLicenseMetadata , "src/tools/collect-license-metadata" , "collect-license-metadata" ;
465- Compiletest , "src/tools/compiletest" , "compiletest" ;
466- CoverageDump , "src/tools/coverage-dump" , "coverage-dump" ;
467- Jsondocck , "src/tools/jsondocck" , "jsondocck" ;
468- Jsondoclint , "src/tools/jsondoclint" , "jsondoclint" ;
469- LintDocs , "src/tools/lint-docs" , "lint-docs" ;
470- LlvmBitcodeLinker , "src/tools/llvm-bitcode-linker" , "llvm-bitcode-linker" ;
471- Miri , "src/tools/miri" , "miri" ;
472- MiroptTestTools , "src/tools/miropt-test-tools" , "miropt-test-tools" ;
473- OptDist , "src/tools/opt-dist" , "opt-dist" ;
474- RemoteTestClient , "src/tools/remote-test-client" , "remote-test-client" ;
475- RemoteTestServer , "src/tools/remote-test-server" , "remote-test-server" ;
476- RustAnalyzer , "src/tools/rust-analyzer" , "rust-analyzer" ;
477- Rustdoc , "src/librustdoc" , "clippy" ;
478- Rustfmt , "src/tools/rustfmt" , "rustfmt" ;
479- RustInstaller , "src/tools/rust-installer" , "rust-installer" ;
480- Tidy , "src/tools/tidy" , "tidy" ;
481- TestFloatParse , "src/tools/test-float-parse" , "test-float-parse" ;
460+ Bootstrap , "src/bootstrap" , "bootstrap" , Mode :: ToolTarget ;
461+ BuildHelper , "src/build_helper" , "build_helper" , Mode :: ToolTarget ;
462+ BuildManifest , "src/tools/build-manifest" , "build-manifest" , Mode :: ToolTarget ;
463+ CargoMiri , "src/tools/miri/cargo-miri" , "cargo-miri" , Mode :: ToolRustc ;
464+ Clippy , "src/tools/clippy" , "clippy" , Mode :: ToolRustc ;
465+ CollectLicenseMetadata , "src/tools/collect-license-metadata" , "collect-license-metadata" , Mode :: ToolTarget ;
466+ Compiletest , "src/tools/compiletest" , "compiletest" , Mode :: ToolTarget ;
467+ CoverageDump , "src/tools/coverage-dump" , "coverage-dump" , Mode :: ToolTarget ;
468+ Jsondocck , "src/tools/jsondocck" , "jsondocck" , Mode :: ToolTarget ;
469+ Jsondoclint , "src/tools/jsondoclint" , "jsondoclint" , Mode :: ToolTarget ;
470+ LintDocs , "src/tools/lint-docs" , "lint-docs" , Mode :: ToolTarget ;
471+ LlvmBitcodeLinker , "src/tools/llvm-bitcode-linker" , "llvm-bitcode-linker" , Mode :: ToolTarget ;
472+ Miri , "src/tools/miri" , "miri" , Mode :: ToolRustc ;
473+ MiroptTestTools , "src/tools/miropt-test-tools" , "miropt-test-tools" , Mode :: ToolTarget ;
474+ OptDist , "src/tools/opt-dist" , "opt-dist" , Mode :: ToolTarget ;
475+ RemoteTestClient , "src/tools/remote-test-client" , "remote-test-client" , Mode :: ToolTarget ;
476+ RemoteTestServer , "src/tools/remote-test-server" , "remote-test-server" , Mode :: ToolTarget ;
477+ RustAnalyzer , "src/tools/rust-analyzer" , "rust-analyzer" , Mode :: ToolRustc ;
478+ Rustdoc , "src/librustdoc" , "clippy" , Mode :: ToolRustc ;
479+ Rustfmt , "src/tools/rustfmt" , "rustfmt" , Mode :: ToolRustc ;
480+ RustInstaller , "src/tools/rust-installer" , "rust-installer" , Mode :: ToolTarget ;
481+ Tidy , "src/tools/tidy" , "tidy" , Mode :: ToolTarget ;
482+ TestFloatParse , "src/tools/test-float-parse" , "test-float-parse" , Mode :: ToolStd ;
482483) ;
483484
484485#[ derive( Debug , Clone , PartialEq , Eq , Hash ) ]
@@ -502,6 +503,7 @@ impl Step for CI {
502503
503504 fn run ( self , builder : & Builder < ' _ > ) -> Self :: Output {
504505 builder. ensure ( Bootstrap {
506+ build_compiler : prepare_compiler_for_check ( builder, self . target , Mode :: ToolTarget ) ,
505507 target : self . target ,
506508 config : self . config . merge ( & LintConfig {
507509 allow : vec ! [ ] ,
0 commit comments