aboutsummaryrefslogtreecommitdiff
path: root/src/Compilation.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2022-10-17 16:54:52 -0700
committerAndrew Kelley <andrew@ziglang.org>2022-10-18 16:52:43 -0700
commitcb635e084b0c36e3c7a6bf63f49f7e7e9918532d (patch)
tree92d53f835566b630fd39f44a5e8c8ef9b3339add /src/Compilation.zig
parent9ee4530b9b38805f88a1e3df4b4b74db240f05df (diff)
downloadzig-cb635e084b0c36e3c7a6bf63f49f7e7e9918532d.tar.gz
zig-cb635e084b0c36e3c7a6bf63f49f7e7e9918532d.zip
stage2: better handling of CacheMode.whole on Windows
Windows gives AccessDenied if you delete a directory which contains open file handles. This could be triggered when using CacheMode.whole when cross compiling macho test binaries.
Diffstat (limited to 'src/Compilation.zig')
-rw-r--r--src/Compilation.zig16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/Compilation.zig b/src/Compilation.zig
index 659cfda9bd..52acf1f031 100644
--- a/src/Compilation.zig
+++ b/src/Compilation.zig
@@ -2390,9 +2390,21 @@ pub fn update(comp: *Compilation) !void {
const o_sub_path = try std.fs.path.join(comp.gpa, &[_][]const u8{ "o", &digest });
defer comp.gpa.free(o_sub_path);
+ // Work around windows `AccessDenied` if any files within this directory are open
+ // by doing the makeExecutable/makeWritable dance.
+ const need_writable_dance = builtin.os.tag == .windows and comp.bin_file.file != null;
+ if (need_writable_dance) {
+ try comp.bin_file.makeExecutable();
+ }
+
try comp.bin_file.renameTmpIntoCache(comp.local_cache_directory, tmp_dir_sub_path, o_sub_path);
comp.wholeCacheModeSetBinFilePath(&digest);
+ // Has to be after the `wholeCacheModeSetBinFilePath` above.
+ if (need_writable_dance) {
+ try comp.bin_file.makeWritable();
+ }
+
// This is intentionally sandwiched between renameTmpIntoCache() and writeManifest().
if (comp.bin_file.options.module) |module| {
// We need to set the zig_cache_artifact_directory for -femit-asm, -femit-llvm-ir,
@@ -3207,8 +3219,8 @@ fn processOneJob(comp: *Compilation, job: Job) !void {
// TODO Surface more error details.
comp.lockAndSetMiscFailure(
.mingw_crt_file,
- "unable to build mingw-w64 CRT file: {s}",
- .{@errorName(err)},
+ "unable to build mingw-w64 CRT file {s}: {s}",
+ .{ @tagName(crt_file), @errorName(err) },
);
};
},