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 } ;
@@ -373,15 +372,19 @@ impl Step for CodegenGcc {
373372
374373macro_rules! lint_any {
375374 ( $(
376- $name: ident, $path: expr, $readable_name: expr
375+ $name: ident,
376+ $path: expr,
377+ $readable_name: expr,
378+ $mode: expr
377379 $( , lint_by_default = $lint_by_default: expr) *
378380 ;
379381 ) +) => {
380382 $(
381383
382384 #[ derive( Debug , Clone , Hash , PartialEq , Eq ) ]
383385 pub struct $name {
384- pub target: TargetSelection ,
386+ build_compiler: Compiler ,
387+ target: TargetSelection ,
385388 config: LintConfig ,
386389 }
387390
@@ -396,23 +399,19 @@ macro_rules! lint_any {
396399 fn make_run( run: RunConfig <' _>) {
397400 let config = LintConfig :: new( run. builder) ;
398401 run. builder. ensure( $name {
402+ build_compiler: prepare_compiler_for_check( run. builder, run. target, $mode) ,
399403 target: run. target,
400404 config,
401405 } ) ;
402406 }
403407
404408 fn run( self , builder: & Builder <' _>) -> Self :: Output {
405- let compiler = builder . compiler ( builder . top_stage , builder . config . host_target ) ;
409+ let build_compiler = self . build_compiler ;
406410 let target = self . target;
407-
408- if !builder. download_rustc( ) {
409- builder. ensure( check:: Rustc :: new( builder, target, vec![ ] ) ) ;
410- } ;
411-
412411 let cargo = prepare_tool_cargo(
413412 builder,
414- compiler ,
415- Mode :: ToolRustc ,
413+ build_compiler ,
414+ $mode ,
416415 target,
417416 Kind :: Clippy ,
418417 $path,
@@ -422,15 +421,15 @@ macro_rules! lint_any {
422421
423422 let _guard = builder. msg_tool(
424423 Kind :: Clippy ,
425- Mode :: ToolRustc ,
424+ $mode ,
426425 $readable_name,
427- compiler . stage,
428- & compiler . host,
426+ build_compiler . stage,
427+ & build_compiler . host,
429428 & target,
430429 ) ;
431430
432431 let stringified_name = stringify!( $name) . to_lowercase( ) ;
433- let stamp = BuildStamp :: new( & builder. cargo_out( compiler , Mode :: ToolRustc , target) )
432+ let stamp = BuildStamp :: new( & builder. cargo_out( build_compiler , $mode , target) )
434433 . with_prefix( & format!( "{}-check" , stringified_name) ) ;
435434
436435 run_cargo(
@@ -452,30 +451,32 @@ macro_rules! lint_any {
452451 }
453452}
454453
454+ // Note: we use ToolTarget instead of ToolBootstrap here, to allow linting in-tree host tools
455+ // using the in-tree Clippy. Because Mode::ToolBootstrap would always use stage 0 rustc/Clippy.
455456lint_any ! (
456- Bootstrap , "src/bootstrap" , "bootstrap" ;
457- BuildHelper , "src/build_helper" , "build_helper" ;
458- BuildManifest , "src/tools/build-manifest" , "build-manifest" ;
459- CargoMiri , "src/tools/miri/cargo-miri" , "cargo-miri" ;
460- Clippy , "src/tools/clippy" , "clippy" ;
461- CollectLicenseMetadata , "src/tools/collect-license-metadata" , "collect-license-metadata" ;
462- Compiletest , "src/tools/compiletest" , "compiletest" ;
463- CoverageDump , "src/tools/coverage-dump" , "coverage-dump" ;
464- Jsondocck , "src/tools/jsondocck" , "jsondocck" ;
465- Jsondoclint , "src/tools/jsondoclint" , "jsondoclint" ;
466- LintDocs , "src/tools/lint-docs" , "lint-docs" ;
467- LlvmBitcodeLinker , "src/tools/llvm-bitcode-linker" , "llvm-bitcode-linker" ;
468- Miri , "src/tools/miri" , "miri" ;
469- MiroptTestTools , "src/tools/miropt-test-tools" , "miropt-test-tools" ;
470- OptDist , "src/tools/opt-dist" , "opt-dist" ;
471- RemoteTestClient , "src/tools/remote-test-client" , "remote-test-client" ;
472- RemoteTestServer , "src/tools/remote-test-server" , "remote-test-server" ;
473- RustAnalyzer , "src/tools/rust-analyzer" , "rust-analyzer" ;
474- Rustdoc , "src/librustdoc" , "clippy" ;
475- Rustfmt , "src/tools/rustfmt" , "rustfmt" ;
476- RustInstaller , "src/tools/rust-installer" , "rust-installer" ;
477- Tidy , "src/tools/tidy" , "tidy" ;
478- TestFloatParse , "src/tools/test-float-parse" , "test-float-parse" ;
457+ Bootstrap , "src/bootstrap" , "bootstrap" , Mode :: ToolTarget ;
458+ BuildHelper , "src/build_helper" , "build_helper" , Mode :: ToolTarget ;
459+ BuildManifest , "src/tools/build-manifest" , "build-manifest" , Mode :: ToolTarget ;
460+ CargoMiri , "src/tools/miri/cargo-miri" , "cargo-miri" , Mode :: ToolRustc ;
461+ Clippy , "src/tools/clippy" , "clippy" , Mode :: ToolRustc ;
462+ CollectLicenseMetadata , "src/tools/collect-license-metadata" , "collect-license-metadata" , Mode :: ToolTarget ;
463+ Compiletest , "src/tools/compiletest" , "compiletest" , Mode :: ToolTarget ;
464+ CoverageDump , "src/tools/coverage-dump" , "coverage-dump" , Mode :: ToolTarget ;
465+ Jsondocck , "src/tools/jsondocck" , "jsondocck" , Mode :: ToolTarget ;
466+ Jsondoclint , "src/tools/jsondoclint" , "jsondoclint" , Mode :: ToolTarget ;
467+ LintDocs , "src/tools/lint-docs" , "lint-docs" , Mode :: ToolTarget ;
468+ LlvmBitcodeLinker , "src/tools/llvm-bitcode-linker" , "llvm-bitcode-linker" , Mode :: ToolTarget ;
469+ Miri , "src/tools/miri" , "miri" , Mode :: ToolRustc ;
470+ MiroptTestTools , "src/tools/miropt-test-tools" , "miropt-test-tools" , Mode :: ToolTarget ;
471+ OptDist , "src/tools/opt-dist" , "opt-dist" , Mode :: ToolTarget ;
472+ RemoteTestClient , "src/tools/remote-test-client" , "remote-test-client" , Mode :: ToolTarget ;
473+ RemoteTestServer , "src/tools/remote-test-server" , "remote-test-server" , Mode :: ToolTarget ;
474+ RustAnalyzer , "src/tools/rust-analyzer" , "rust-analyzer" , Mode :: ToolRustc ;
475+ Rustdoc , "src/librustdoc" , "clippy" , Mode :: ToolRustc ;
476+ Rustfmt , "src/tools/rustfmt" , "rustfmt" , Mode :: ToolRustc ;
477+ RustInstaller , "src/tools/rust-installer" , "rust-installer" , Mode :: ToolTarget ;
478+ Tidy , "src/tools/tidy" , "tidy" , Mode :: ToolTarget ;
479+ TestFloatParse , "src/tools/test-float-parse" , "test-float-parse" , Mode :: ToolStd ;
479480) ;
480481
481482#[ derive( Debug , Clone , PartialEq , Eq , Hash ) ]
@@ -499,6 +500,7 @@ impl Step for CI {
499500
500501 fn run ( self , builder : & Builder < ' _ > ) -> Self :: Output {
501502 builder. ensure ( Bootstrap {
503+ build_compiler : prepare_compiler_for_check ( builder, self . target , Mode :: ToolTarget ) ,
502504 target : self . target ,
503505 config : self . config . merge ( & LintConfig {
504506 allow : vec ! [ ] ,
0 commit comments