diff --git a/src/bootstrap/lib.rs b/src/bootstrap/lib.rs index b2279bc8b5614..5d32b4f801a18 100644 --- a/src/bootstrap/lib.rs +++ b/src/bootstrap/lib.rs @@ -1497,14 +1497,20 @@ impl Build { let dst = dstdir.join(src.file_name().unwrap()); self.verbose_than(1, &format!("Install {:?} to {:?}", src, dst)); t!(fs::create_dir_all(dstdir)); + drop(fs::remove_file(&dst)); { if !src.exists() { panic!("Error: File \"{}\" not found!", src.display()); } - self.copy(src, &dst); + let metadata = t!(src.symlink_metadata()); + if let Err(e) = fs::copy(&src, &dst) { + panic!("failed to copy `{}` to `{}`: {}", src.display(), dst.display(), e) + } + t!(fs::set_permissions(&dst, metadata.permissions())); + let atime = FileTime::from_last_access_time(&metadata); + let mtime = FileTime::from_last_modification_time(&metadata); + t!(filetime::set_file_times(&dst, atime, mtime)); } - // NOTE: when using hard-links, this will also update the permissions on the original file. - // We never use permissions that are more restrictive than the original, so this shouldn't cause any issues. chmod(&dst, perms); }