diff --git a/src/core/build/common.rs b/src/core/build/common.rs index eba4ca6..c560b4d 100644 --- a/src/core/build/common.rs +++ b/src/core/build/common.rs @@ -902,58 +902,38 @@ mod tests { #[test] fn needs_rebuild_header_modified() { - use std::fs::{File, FileTimes}; - use std::time::{Duration, SystemTime}; - let dir = temp_dir("rebuild_header"); - let src = dir.join("test.c"); - let header = dir.join("test.h"); - let obj = dir.join("test.o"); - let d_file = dir.join("test.d"); + fs::write(dir.join("test.c"), "int main() {}").unwrap(); + fs::write(dir.join("test.h"), "#define A 1").unwrap(); + fs::write(dir.join("test.o"), "").unwrap(); - fs::write(&src, "int main() {}").unwrap(); - fs::write(&header, "#define A 1").unwrap(); - fs::write(&obj, "").unwrap(); - - let past = SystemTime::UNIX_EPOCH + Duration::from_secs(1_000_000); - let mid = past + Duration::from_secs(100); - let future = mid + Duration::from_secs(100); - - for (path, t) in [(&src, past), (&header, past), (&obj, mid)] { - let times = FileTimes::new().set_modified(t); - File::options() - .write(true) - .open(path) - .unwrap() - .set_times(times) - .unwrap(); - } - - let d_content = format!( - "{}: {} {}", - obj.to_string_lossy().replace('\\', "/"), - src.to_string_lossy().replace('\\', "/"), - header.to_string_lossy().replace('\\', "/") - ); - fs::write(&d_file, d_content).unwrap(); + let _guard = cwd_lock(); + let prev = std::env::current_dir().unwrap(); + std::env::set_current_dir(&dir).unwrap(); + fs::write("test.d", "test.o: test.c missing.h").unwrap(); assert!( - !needs_rebuild(&src.to_string_lossy(), &obj.to_string_lossy()), - "should be fresh" + needs_rebuild("test.c", "test.o"), + "missing dep in .d must force rebuild" ); - let times = FileTimes::new().set_modified(future); - File::options() - .write(true) - .open(&header) - .unwrap() - .set_times(times) - .unwrap(); - + fs::write("test.h", "#define A 1").unwrap(); + std::thread::sleep(std::time::Duration::from_secs(2)); + fs::write("test.o", "obj").unwrap(); + fs::write("test.d", "test.o: test.c test.h").unwrap(); assert!( - needs_rebuild(&src.to_string_lossy(), &obj.to_string_lossy()), + !needs_rebuild("test.c", "test.o"), + "object newer than source and headers should be fresh" + ); + + std::thread::sleep(std::time::Duration::from_secs(2)); + fs::write("test.h", "#define A 2").unwrap(); + assert!( + needs_rebuild("test.c", "test.o"), "changed header should trigger rebuild" ); + + std::env::set_current_dir(prev).unwrap(); } #[test] diff --git a/tests/cli_errors.rs b/tests/cli_errors.rs index 4267214..01c02c9 100644 --- a/tests/cli_errors.rs +++ b/tests/cli_errors.rs @@ -304,19 +304,20 @@ fn staticlib_build() { let envs = [("DCR_COMPILER", compiler)]; let out = run_dcr_env(&["build"], &dir, &envs); assert!(out.status.success(), "staticlib build should succeed"); - // Check that a .a file exists - let lib_path = dir - .join("target") - .join("x86_64-unknown-linux-gnu") - .join("debug"); + let lib_path = host_profile_dir(&dir, "debug"); let has_lib = std::fs::read_dir(&lib_path) .map(|entries| { - entries - .filter_map(|e| e.ok()) - .any(|e| e.file_name().to_string_lossy().ends_with(".a")) + entries.filter_map(|e| e.ok()).any(|e| { + let name = e.file_name().to_string_lossy().to_string(); + name.ends_with(".a") || name.ends_with(".lib") + }) }) .unwrap_or(false); - assert!(has_lib, "staticlib should produce a .a file"); + assert!( + has_lib, + "staticlib should produce a .a/.lib in {}", + lib_path.display() + ); } #[test] @@ -332,12 +333,11 @@ fn build_release_profile() { let envs = [("DCR_COMPILER", compiler)]; let out = run_dcr_env(&["build", "--release"], &dir, &envs); assert!(out.status.success(), "release build should succeed"); + let release_dir = host_profile_dir(&dir, "release"); assert!( - dir.join("target") - .join("x86_64-unknown-linux-gnu") - .join("release") - .is_dir(), - "target/x86_64-unknown-linux-gnu/release should exist" + release_dir.is_dir(), + "release profile dir should exist: {}", + release_dir.display() ); }