@@ -20,11 +20,22 @@ pub struct Std {
2020     /// 
2121     /// [`compile::Rustc`]: crate::core::build_steps::compile::Rustc 
2222     crates :  Vec < String > , 
23+     /// Whether to force `Kind::Check` on cargo invocations. 
24+      /// 
25+      /// By default, `Builder::kind` is propagated to the cargo invocations. However, there are cases 
26+      /// when this is not desirable. For example, when running `x clippy $tool_name`, passing `Builder::kind` 
27+      /// to cargo invocations would run clippy on the entire compiler and library, which is not useful if 
28+      /// we only want to lint a few crates with specific rules. 
29+      force_check :  bool , 
2330} 
2431
2532impl  Std  { 
2633    pub  fn  new ( target :  TargetSelection )  -> Self  { 
27-         Self  {  target,  crates :  vec ! [ ]  } 
34+         Self  {  target,  crates :  vec ! [ ] ,  force_check :  false  } 
35+     } 
36+ 
37+     pub  fn  new_with_force_check_flag ( target :  TargetSelection ,  force_check :  bool )  -> Self  { 
38+         Self  {  target,  crates :  vec ! [ ] ,  force_check } 
2839    } 
2940} 
3041
@@ -38,7 +49,7 @@ impl Step for Std {
3849
3950    fn  make_run ( run :  RunConfig < ' _ > )  { 
4051        let  crates = run. make_run_crates ( Alias :: Library ) ; 
41-         run. builder . ensure ( Std  {  target :  run. target ,  crates } ) ; 
52+         run. builder . ensure ( Std  {  target :  run. target ,  crates,   force_check :   false  } ) ; 
4253    } 
4354
4455    fn  run ( self ,  builder :  & Builder < ' _ > )  { 
@@ -53,7 +64,7 @@ impl Step for Std {
5364            Mode :: Std , 
5465            SourceType :: InTree , 
5566            target, 
56-             builder. kind , 
67+             if   self . force_check   {   Kind :: Check   }   else   {   builder. kind   } , 
5768        ) ; 
5869
5970        std_cargo ( builder,  target,  compiler. stage ,  & mut  cargo) ; 
@@ -148,6 +159,13 @@ pub struct Rustc {
148159     /// 
149160     /// [`compile::Rustc`]: crate::core::build_steps::compile::Rustc 
150161     crates :  Vec < String > , 
162+     /// Whether to force `Kind::Check` on cargo invocations. 
163+      /// 
164+      /// By default, `Builder::kind` is propagated to the cargo invocations. However, there are cases 
165+      /// when this is not desirable. For example, when running `x clippy $tool_name`, passing `Builder::kind` 
166+      /// to cargo invocations would run clippy on the entire compiler and library, which is not useful if 
167+      /// we only want to lint a few crates with specific rules. 
168+      force_check :  bool , 
151169} 
152170
153171impl  Rustc  { 
@@ -157,7 +175,20 @@ impl Rustc {
157175            . into_iter ( ) 
158176            . map ( |krate| krate. name . to_string ( ) ) 
159177            . collect ( ) ; 
160-         Self  {  target,  crates } 
178+         Self  {  target,  crates,  force_check :  false  } 
179+     } 
180+ 
181+     pub  fn  new_with_force_check_flag ( 
182+         target :  TargetSelection , 
183+         builder :  & Builder < ' _ > , 
184+         force_check :  bool , 
185+     )  -> Self  { 
186+         let  crates = builder
187+             . in_tree_crates ( "rustc-main" ,  Some ( target) ) 
188+             . into_iter ( ) 
189+             . map ( |krate| krate. name . to_string ( ) ) 
190+             . collect ( ) ; 
191+         Self  {  target,  crates,  force_check } 
161192    } 
162193} 
163194
@@ -172,7 +203,7 @@ impl Step for Rustc {
172203
173204    fn  make_run ( run :  RunConfig < ' _ > )  { 
174205        let  crates = run. make_run_crates ( Alias :: Compiler ) ; 
175-         run. builder . ensure ( Rustc  {  target :  run. target ,  crates } ) ; 
206+         run. builder . ensure ( Rustc  {  target :  run. target ,  crates,   force_check :   false  } ) ; 
176207    } 
177208
178209    /// Builds the compiler. 
@@ -193,7 +224,7 @@ impl Step for Rustc {
193224            builder. ensure ( crate :: core:: build_steps:: compile:: Std :: new ( compiler,  compiler. host ) ) ; 
194225            builder. ensure ( crate :: core:: build_steps:: compile:: Std :: new ( compiler,  target) ) ; 
195226        }  else  { 
196-             builder. ensure ( Std :: new ( target) ) ; 
227+             builder. ensure ( Std :: new_with_force_check_flag ( target,   self . force_check ) ) ; 
197228        } 
198229
199230        let  mut  cargo = builder:: Cargo :: new ( 
@@ -202,7 +233,7 @@ impl Step for Rustc {
202233            Mode :: Rustc , 
203234            SourceType :: InTree , 
204235            target, 
205-             builder. kind , 
236+             if   self . force_check   {   Kind :: Check   }   else   {   builder. kind   } , 
206237        ) ; 
207238
208239        rustc_cargo ( builder,  & mut  cargo,  target,  & compiler) ; 
0 commit comments