File tree 3 files changed +57
-10
lines changed
3 files changed +57
-10
lines changed Original file line number Diff line number Diff line change @@ -182,14 +182,20 @@ impl CompileTarget {
182
182
/// See [`CompileKind::fingerprint_hash`].
183
183
pub fn fingerprint_hash ( & self ) -> u64 {
184
184
let mut hasher = StableHasher :: new ( ) ;
185
- self . name . hash ( & mut hasher) ;
186
- if self . name . ends_with ( ".json" ) {
187
- // This may have some performance concerns, since it is called
188
- // fairly often. If that ever seems worth fixing, consider
189
- // embedding this in `CompileTarget`.
190
- if let Ok ( contents) = fs:: read_to_string ( self . name ) {
185
+ match self
186
+ . name
187
+ . ends_with ( ".json" )
188
+ . then ( || fs:: read_to_string ( self . name ) )
189
+ {
190
+ Some ( Ok ( contents) ) => {
191
+ // This may have some performance concerns, since it is called
192
+ // fairly often. If that ever seems worth fixing, consider
193
+ // embedding this in `CompileTarget`.
191
194
contents. hash ( & mut hasher) ;
192
195
}
196
+ _ => {
197
+ self . name . hash ( & mut hasher) ;
198
+ }
193
199
}
194
200
hasher. finish ( )
195
201
}
Original file line number Diff line number Diff line change @@ -587,10 +587,12 @@ fn compute_metadata(
587
587
unit. mode . hash ( & mut hasher) ;
588
588
cx. lto [ unit] . hash ( & mut hasher) ;
589
589
590
- // Artifacts compiled for the host should have a different metadata
591
- // piece than those compiled for the target, so make sure we throw in
592
- // the unit's `kind` as well
593
- unit. kind . hash ( & mut hasher) ;
590
+ // Artifacts compiled for the host should have a different
591
+ // metadata piece than those compiled for the target, so make sure
592
+ // we throw in the unit's `kind` as well. Use `fingerprint_hash`
593
+ // so that the StableHash doesn't change based on the pathnames
594
+ // of the custom target JSON spec files.
595
+ unit. kind . fingerprint_hash ( ) . hash ( & mut hasher) ;
594
596
595
597
// Finally throw in the target name/kind. This ensures that concurrent
596
598
// compiles of targets in the same crate don't collide.
Original file line number Diff line number Diff line change @@ -234,3 +234,42 @@ fn changing_spec_relearns_crate_types() {
234
234
)
235
235
. run ( ) ;
236
236
}
237
+
238
+ #[ cargo_test]
239
+ fn custom_target_ignores_filepath ( ) {
240
+ // Changing the path of the .json file will not trigger a rebuild.
241
+ if !is_nightly ( ) {
242
+ // Requires features no_core, lang_items
243
+ return ;
244
+ }
245
+ let p = project ( )
246
+ . file (
247
+ "src/lib.rs" ,
248
+ & "
249
+ __MINIMAL_LIB__
250
+
251
+ pub fn foo() -> u32 {
252
+ 42
253
+ }
254
+ "
255
+ . replace ( "__MINIMAL_LIB__" , MINIMAL_LIB ) ,
256
+ )
257
+ . file ( "b/custom-target.json" , SIMPLE_SPEC )
258
+ . file ( "a/custom-target.json" , SIMPLE_SPEC )
259
+ . build ( ) ;
260
+
261
+ // Should build the library the first time.
262
+ p. cargo ( "build --lib --target a/custom-target.json" )
263
+ . with_stderr (
264
+ "\
265
+ [..]Compiling foo v0.0.1 ([..])
266
+ [FINISHED] dev [unoptimized + debuginfo] target(s) in [..]
267
+ " ,
268
+ )
269
+ . run ( ) ;
270
+
271
+ // But not the second time, even though the path to the custom target is dfferent.
272
+ p. cargo ( "build --lib --target b/custom-target.json" )
273
+ . with_stderr ( "[FINISHED] dev [unoptimized + debuginfo] target(s) in [..]" )
274
+ . run ( ) ;
275
+ }
You can’t perform that action at this time.
0 commit comments