fix: override both rustc-unwrapped and rustc wrapper for symlink_file patch to propagate

This commit is contained in:
Oleks
2026-03-16 14:39:36 +02:00
parent 4b5e5eec2d
commit 0d46839c04
2 changed files with 20 additions and 6 deletions
+9 -6
View File
@@ -97,13 +97,16 @@
# Rustc bootstrap: symlink_file panics with "File exists" during
# s390x cross-compilation. Multiple call sites use t!(symlink_file(...)).
# Patch the symlink_file method body to remove existing dest first.
(final: prev: {
(final: prev: let
patchedRustcUnwrapped = prev.rustc-unwrapped.overrideAttrs (old: {
patches = (old.patches or [ ]) ++ [
./patches/rustc-symlink-file-eexist.patch
];
});
in {
rustc-unwrapped = patchedRustcUnwrapped;
rustc = prev.rustc.override {
rustc-unwrapped = prev.rustc.unwrapped.overrideAttrs (old: {
postPatch = (old.postPatch or "") + ''
sed -i "s|if !self.config.dry_run() { symlink_file(src.as_ref(), link.as_ref()) }|if !self.config.dry_run() { let _ = std::fs::remove_file(link.as_ref()); symlink_file(src.as_ref(), link.as_ref()) }|" src/bootstrap/src/lib.rs
'';
});
rustc-unwrapped = patchedRustcUnwrapped;
};
})
];
+11
View File
@@ -0,0 +1,11 @@
--- a/src/bootstrap/src/lib.rs
+++ b/src/bootstrap/src/lib.rs
@@ -1990,7 +1990,7 @@ impl Build {
use std::os::unix::fs::symlink as symlink_file;
#[cfg(windows)]
use std::os::windows::fs::symlink_file;
- if !self.config.dry_run() { symlink_file(src.as_ref(), link.as_ref()) } else { Ok(()) }
+ if !self.config.dry_run() { let _ = std::fs::remove_file(link.as_ref()); symlink_file(src.as_ref(), link.as_ref()) } else { Ok(()) }
}
/// Returns if config.ninja is enabled, and checks for ninja existence,