From 0bfd34342bdd9ae2179150bfce7fcc7b2014ea49 Mon Sep 17 00:00:00 2001 From: David Date: Sat, 3 Oct 2026 16:28:20 +0400 Subject: [PATCH 1/2] std.Io.Threaded: only use spawnDarwin in processReplace when spawning is supported ios, tvos, visionos and watchos can't spawn processes, so their null_file has no fd and spawnDarwin doesn't compile for them. The vtable always references processReplace and the default panic handler uses Threaded, so nearly every program for these targets failed to compile. Fall back to posixExec there, as before 9fe0ebe108. closes https://codeberg.org/ziglang/zig/issues/37061 --- lib/std/Io/Threaded.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/std/Io/Threaded.zig b/lib/std/Io/Threaded.zig index 2c7cdbc8e99e37081200900866b94edf7672e272..4b1693cbd1ab92c67090a790cdde9e244c9d5f57 100644 --- a/lib/std/Io/Threaded.zig +++ b/lib/std/Io/Threaded.zig @@ -15214,7 +15214,7 @@ fn processReplace(userdata: ?*anyopaque, options: process.ReplaceOptions) proces }); }; - if (is_darwin) if (t.spawnDarwin( + if (is_darwin and process.can_spawn) if (t.spawnDarwin( .replace, options.exe, argv_buf.ptr, -- 2.54.0 From c92c8ef8cf6ef32e8242e7e55bc065171b8d49cb Mon Sep 17 00:00:00 2001 From: David Date: Sun, 4 Oct 2026 10:39:43 +0400 Subject: [PATCH 2/2] std.process: match can_spawn and can_replace to Apple SDK availability --- lib/std/Io/Threaded.zig | 8 ++++---- lib/std/process.zig | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/std/Io/Threaded.zig b/lib/std/Io/Threaded.zig index 4b1693cbd1ab92c67090a790cdde9e244c9d5f57..b8182ba5c8c294b9001fe94318cf450957d29501 100644 --- a/lib/std/Io/Threaded.zig +++ b/lib/std/Io/Threaded.zig @@ -354,7 +354,7 @@ pub const NullFile = switch (native_os) { } } }, - .wasi, .ios, .tvos, .visionos, .watchos => struct { + .wasi, .tvos, .watchos => struct { fn deinit(this: @This()) void { _ = this; } @@ -15214,7 +15214,7 @@ fn processReplace(userdata: ?*anyopaque, options: process.ReplaceOptions) proces }); }; - if (is_darwin and process.can_spawn) if (t.spawnDarwin( + if (is_darwin) if (t.spawnDarwin( .replace, options.exe, argv_buf.ptr, @@ -15259,9 +15259,9 @@ fn processReplace(userdata: ?*anyopaque, options: process.ReplaceOptions) proces } const processSpawn = switch (native_os) { - .wasi, .emscripten, .ios, .tvos, .visionos, .watchos => processSpawnUnsupported, + .wasi, .emscripten, .tvos, .watchos => processSpawnUnsupported, .windows => processSpawnWindows, - .driverkit, .maccatalyst, .macos => processSpawnDarwin, + .driverkit, .ios, .maccatalyst, .macos, .visionos => processSpawnDarwin, else => processSpawnPosix, }; diff --git a/lib/std/process.zig b/lib/std/process.zig index ed4dceabdde0abee586683e90daddf144d78fff9..af733757aa13f22df79e314e42c9247290f8170d 100644 --- a/lib/std/process.zig +++ b/lib/std/process.zig @@ -254,13 +254,13 @@ pub fn getBaseAddress() usize { /// process image. If this is `false` then calling `replace` or `replaceFile` /// functions will return `error.OperationUnsupported`. pub const can_replace = switch (native_os) { - .windows, .haiku, .wasi => false, + .windows, .haiku, .wasi, .tvos, .watchos => false, else => true, }; /// Tells whether spawning child processes is supported. pub const can_spawn = switch (native_os) { - .wasi, .ios, .tvos, .visionos, .watchos => false, + .wasi, .tvos, .watchos => false, else => true, }; -- 2.54.0