Skip to content

Commit 97e9f34

Browse files
committed
feat: strip basedirs from Rust hash key for cross-machine cache hits
SCCACHE_BASEDIRS now normalizes cwd, CARGO_MANIFEST_DIR, CARGO_WORKSPACE_DIR, CARGO_TARGET_TMPDIR, CARGO_MANIFEST_PATH, CARGO_BIN_EXE_*, dep-info env var values, and the concatenated argument string in the Rust compiler's hash key computation. This enables cache hits when the same crate is compiled from different absolute paths on different machines (e.g., CI runners with different checkout roots). strip_basedir_prefix now also matches when the value equals the basedir minus its trailing '/', so `cwd == basedir` strips to the empty string rather than passing through. Without this, two machines with different checkout paths produced different hashes even with matching basedirs -- the feature's central claim.
1 parent 0ba527a commit 97e9f34

11 files changed

Lines changed: 598 additions & 46 deletions

File tree

src/cache/readonly.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ mod test {
110110

111111
#[test]
112112
fn readonly_storage_is_readonly() {
113-
let storage = ReadOnlyStorage(Arc::new(MockStorage::new(None, false)));
113+
let storage = ReadOnlyStorage(Arc::new(MockStorage::default()));
114114
assert_eq!(
115115
storage.check().now_or_never().unwrap().unwrap(),
116116
CacheMode::ReadOnly
@@ -119,16 +119,15 @@ mod test {
119119

120120
#[test]
121121
fn readonly_storage_forwards_preprocessor_cache_mode_config() {
122-
let storage_no_preprocessor_cache =
123-
ReadOnlyStorage(Arc::new(MockStorage::new(None, false)));
122+
let storage_no_preprocessor_cache = ReadOnlyStorage(Arc::new(MockStorage::default()));
124123
assert!(
125124
!storage_no_preprocessor_cache
126125
.preprocessor_cache_mode_config()
127126
.use_preprocessor_cache_mode
128127
);
129128

130129
let storage_with_preprocessor_cache =
131-
ReadOnlyStorage(Arc::new(MockStorage::new(None, true)));
130+
ReadOnlyStorage(Arc::new(MockStorage::new(None, true, vec![])));
132131
assert!(
133132
storage_with_preprocessor_cache
134133
.preprocessor_cache_mode_config()
@@ -178,7 +177,7 @@ mod test {
178177
.build()
179178
.unwrap();
180179

181-
let storage = ReadOnlyStorage(Arc::new(MockStorage::new(None, true)));
180+
let storage = ReadOnlyStorage(Arc::new(MockStorage::new(None, true, vec![])));
182181
runtime.block_on(async move {
183182
assert_eq!(
184183
storage

src/compiler/clang.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1359,7 +1359,7 @@ mod test {
13591359
too_hard_for_preprocessor_cache_mode: None,
13601360
};
13611361
let runtime = single_threaded_runtime();
1362-
let storage = MockStorage::new(None, false);
1362+
let storage = MockStorage::default();
13631363
let storage: std::sync::Arc<MockStorage> = std::sync::Arc::new(storage);
13641364
let service = server::SccacheService::mock_with_storage(storage, runtime.handle().clone());
13651365
let compiler = &f.bins[0];

src/compiler/compiler.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2476,7 +2476,7 @@ LLVM version: 6.0",
24762476
false,
24772477
pool,
24782478
false,
2479-
Arc::new(MockStorage::new(None, preprocessor_cache_mode)),
2479+
Arc::new(MockStorage::new(None, preprocessor_cache_mode, vec![])),
24802480
CacheControl::Default,
24812481
)
24822482
.wait()
@@ -2544,7 +2544,7 @@ LLVM version: 6.0",
25442544
false,
25452545
pool,
25462546
false,
2547-
Arc::new(MockStorage::new(None, preprocessor_cache_mode)),
2547+
Arc::new(MockStorage::new(None, preprocessor_cache_mode, vec![])),
25482548
CacheControl::Default,
25492549
)
25502550
.wait()
@@ -2610,7 +2610,7 @@ LLVM version: 6.0",
26102610
false,
26112611
pool,
26122612
false,
2613-
Arc::new(MockStorage::new(None, preprocessor_cache_mode)),
2613+
Arc::new(MockStorage::new(None, preprocessor_cache_mode, vec![])),
26142614
CacheControl::Default,
26152615
)
26162616
.wait()
@@ -2912,7 +2912,7 @@ LLVM version: 6.0",
29122912
let gcc = f.mk_bin("gcc").unwrap();
29132913
let runtime = Runtime::new().unwrap();
29142914
let pool = runtime.handle().clone();
2915-
let storage = MockStorage::new(None, preprocessor_cache_mode);
2915+
let storage = MockStorage::new(None, preprocessor_cache_mode, vec![]);
29162916
let storage: Arc<MockStorage> = Arc::new(storage);
29172917
let service = server::SccacheService::mock_with_storage(storage.clone(), pool.clone());
29182918

@@ -3005,7 +3005,7 @@ LLVM version: 6.0",
30053005
std::fs::write(f.tempdir.path().join("foo.c"), "whatever").unwrap();
30063006
// Make our storage wait 2ms for each get/put operation.
30073007
let storage_delay = Duration::from_millis(2);
3008-
let storage = MockStorage::new(Some(storage_delay), preprocessor_cache_mode);
3008+
let storage = MockStorage::new(Some(storage_delay), preprocessor_cache_mode, vec![]);
30093009
let storage: Arc<MockStorage> = Arc::new(storage);
30103010
let service = server::SccacheService::mock_with_storage(storage.clone(), pool.clone());
30113011
// Pretend to be GCC.

src/compiler/diab.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -792,7 +792,7 @@ mod test {
792792
too_hard_for_preprocessor_cache_mode: None,
793793
};
794794
let runtime = single_threaded_runtime();
795-
let storage = MockStorage::new(None, false);
795+
let storage = MockStorage::default();
796796
let storage: std::sync::Arc<MockStorage> = std::sync::Arc::new(storage);
797797
let service = server::SccacheService::mock_with_storage(storage, runtime.handle().clone());
798798
let compiler = &f.bins[0];

src/compiler/gcc.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2389,7 +2389,7 @@ mod test {
23892389
too_hard_for_preprocessor_cache_mode: None,
23902390
};
23912391
let runtime = single_threaded_runtime();
2392-
let storage = MockStorage::new(None, false);
2392+
let storage = MockStorage::default();
23932393
let storage: std::sync::Arc<MockStorage> = std::sync::Arc::new(storage);
23942394
let service = server::SccacheService::mock_with_storage(storage, runtime.handle().clone());
23952395
let compiler = &f.bins[0];
@@ -2450,7 +2450,7 @@ mod test {
24502450
too_hard_for_preprocessor_cache_mode: None,
24512451
};
24522452
let runtime = single_threaded_runtime();
2453-
let storage = MockStorage::new(None, false);
2453+
let storage = MockStorage::default();
24542454
let storage: std::sync::Arc<MockStorage> = std::sync::Arc::new(storage);
24552455
let service = server::SccacheService::mock_with_storage(storage, runtime.handle().clone());
24562456
let compiler = &f.bins[0];
@@ -2509,7 +2509,7 @@ mod test {
25092509
too_hard_for_preprocessor_cache_mode: None,
25102510
};
25112511
let runtime = single_threaded_runtime();
2512-
let storage = MockStorage::new(None, false);
2512+
let storage = MockStorage::default();
25132513
let storage: std::sync::Arc<MockStorage> = std::sync::Arc::new(storage);
25142514
let service = server::SccacheService::mock_with_storage(storage, runtime.handle().clone());
25152515
let compiler = &f.bins[0];

src/compiler/msvc.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2852,7 +2852,7 @@ mod test {
28522852
too_hard_for_preprocessor_cache_mode: None,
28532853
};
28542854
let runtime = single_threaded_runtime();
2855-
let storage = MockStorage::new(None, false);
2855+
let storage = MockStorage::default();
28562856
let storage: std::sync::Arc<MockStorage> = std::sync::Arc::new(storage);
28572857
let service = server::SccacheService::mock_with_storage(storage, runtime.handle().clone());
28582858
let compiler = &f.bins[0];
@@ -2942,7 +2942,7 @@ mod test {
29422942
too_hard_for_preprocessor_cache_mode: None,
29432943
};
29442944
let runtime = single_threaded_runtime();
2945-
let storage = MockStorage::new(None, false);
2945+
let storage = MockStorage::default();
29462946
let storage: std::sync::Arc<MockStorage> = std::sync::Arc::new(storage);
29472947
let service = server::SccacheService::mock_with_storage(storage, runtime.handle().clone());
29482948
let compiler = &f.bins[0];

0 commit comments

Comments
 (0)