mirror of
https://github.com/ziglang/zig.git
synced 2026-02-04 05:33:39 +00:00
Compilation: unconditionally close open file handles for writable dance
This commit is contained in:
parent
205f8214d8
commit
281dabaa88
@ -2295,10 +2295,16 @@ pub fn update(comp: *Compilation, main_progress_node: *std.Progress.Node) !void
|
||||
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.
|
||||
// by closing and reopening the file handles.
|
||||
const need_writable_dance = builtin.os.tag == .windows and comp.bin_file.file != null;
|
||||
if (need_writable_dance) {
|
||||
try comp.bin_file.makeExecutable();
|
||||
// We cannot just call `makeExecutable` as it makes a false assumption that we have a
|
||||
// file handle open only when linking an executable file. This used to be true when
|
||||
// our linkers were incapable of emitting relocatables and static archive. Now that
|
||||
// they are capable, we need to unconditionally close the file handle and re-open it
|
||||
// in the follow up call to `makeWritable`.
|
||||
comp.bin_file.file.?.close();
|
||||
comp.bin_file.file = null;
|
||||
}
|
||||
|
||||
try comp.bin_file.renameTmpIntoCache(comp.local_cache_directory, tmp_dir_sub_path, o_sub_path);
|
||||
|
||||
@ -943,7 +943,6 @@ pub fn flushModule(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node
|
||||
|
||||
if (self.isObject() and self.zig_object_index == null) {
|
||||
// TODO this will become -r route I guess. For now, just copy the object file.
|
||||
assert(self.base.file == null); // TODO uncomment once we implement -r
|
||||
const the_object_path = blk: {
|
||||
if (self.base.options.objects.len != 0) {
|
||||
break :blk self.base.options.objects[0].path;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user