@@ -1130,22 +1130,32 @@ impl<'a> Builder<'a> {
11301130 cargo. env ( "RUSTC_VERBOSE" , self . verbosity . to_string ( ) ) ;
11311131
11321132 if source_type == SourceType :: InTree {
1133+ let mut lint_flags = Vec :: new ( ) ;
11331134 // When extending this list, add the new lints to the RUSTFLAGS of the
11341135 // build_bootstrap function of src/bootstrap/bootstrap.py as well as
11351136 // some code doesn't go through this `rustc` wrapper.
1136- rustflags . arg ( "-Wrust_2018_idioms" ) ;
1137- rustflags . arg ( "-Wunused_lifetimes" ) ;
1137+ lint_flags . push ( "-Wrust_2018_idioms" ) ;
1138+ lint_flags . push ( "-Wunused_lifetimes" ) ;
11381139
11391140 if self . config . deny_warnings {
1140- rustflags . arg ( "-Dwarnings" ) ;
1141+ lint_flags . push ( "-Dwarnings" ) ;
11411142 }
11421143
11431144 // FIXME(#58633) hide "unused attribute" errors in incremental
11441145 // builds of the standard library, as the underlying checks are
11451146 // not yet properly integrated with incremental recompilation.
11461147 if mode == Mode :: Std && compiler. stage == 0 && self . config . incremental {
1147- rustflags . arg ( "-Aunused-attributes" ) ;
1148+ lint_flags . push ( "-Aunused-attributes" ) ;
11481149 }
1150+ // This does not use RUSTFLAGS due to caching issues with Cargo.
1151+ // Clippy is treated as an "in tree" tool, but shares the same
1152+ // cache as other "submodule" tools. With these options set in
1153+ // RUSTFLAGS, that causes *every* shared dependency to be rebuilt.
1154+ // By injecting this into the rustc wrapper, this circumvents
1155+ // Cargo's fingerprint detection. This is fine because lint flags
1156+ // are always ignored in dependencies. Eventually this should be
1157+ // fixed via better support from Cargo.
1158+ cargo. env ( "RUSTC_LINT_FLAGS" , lint_flags. join ( " " ) ) ;
11491159 }
11501160
11511161 if let Mode :: Rustc | Mode :: Codegen = mode {
0 commit comments