Commit 9ab7eec23e

Alex Rønne Petersen <alex@alexrp.com>
2025-11-13 18:05:46
represent Mac Catalyst as aarch64-maccatalyst-none rather than aarch64-ios-macabi
Apple's own headers and tbd files prefer to think of Mac Catalyst as a distinct OS target. Earlier, when DriverKit support was added to LLVM, it was represented a distinct OS. So why Apple decided to only represent Mac Catalyst as an ABI in the target triple is beyond me. But this isn't the first time they've ignored established target triple norms (see: armv7k and aarch64_32) and it probably won't be the last. While doing this, I also audited all Darwin OS prongs throughout the codebase and made sure they cover all the tags.
1 parent 2e6f7d3
lib/compiler/aro/aro/Compilation.zig
@@ -335,6 +335,7 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void {
         .openbsd => try define(w, "__OpenBSD__"),
         .dragonfly => try define(w, "__DragonFly__"),
         .illumos => try defineStd(w, "sun", is_gnu),
+        .maccatalyst,
         .macos,
         .tvos,
         .ios,
@@ -635,7 +636,7 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void {
         },
         .aarch64, .aarch64_be => {
             try define(w, "__aarch64__");
-            if (comp.target.os.tag == .macos) {
+            if (comp.target.os.tag.isDarwin()) {
                 try define(w, "__AARCH64_SIMD__");
                 if (ptr_width == 32) {
                     try define(w, "__ARM64_ARCH_8_32__");
@@ -992,7 +993,7 @@ fn writeBuiltinMacros(comp: *Compilation, system_defines_mode: SystemDefinesMode
         \\
     );
     if (comp.langopts.standard.atLeast(.c11)) switch (comp.target.os.tag) {
-        .openbsd, .driverkit, .ios, .macos, .tvos, .visionos, .watchos => {
+        .openbsd, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => {
             try w.writeAll("#define __STDC_NO_THREADS__ 1\n");
         },
         .ps4, .ps5 => {
lib/compiler/aro/aro/Driver.zig
@@ -1467,6 +1467,7 @@ pub fn getPICMode(d: *Driver, lastpic: []const u8) Compilation.Error!struct { ba
     // generation, independent of the argument order.
     if (kernel_or_kext and
         (!(target.os.tag != .ios) or (target.os.isAtLeast(.ios, .{ .major = 6, .minor = 0, .patch = 0 }) orelse false)) and
+        (!(target.os.tag != .maccatalyst) or (target.os.isAtLeast(.maccatalyst, .{ .major = 6, .minor = 0, .patch = 0 }) orelse false)) and
         !(target.os.tag != .watchos) and
         !(target.os.tag != .driverkit))
     {
lib/compiler/aro/aro/target.zig
@@ -674,7 +674,7 @@ pub fn toLLVMTriple(target: std.Target, buf: []u8) []const u8 {
         .emscripten => "emscripten",
         .uefi => "windows",
         .macos => "macosx",
-        .ios => "ios",
+        .ios, .maccatalyst => "ios",
         .tvos => "tvos",
         .watchos => "watchos",
         .driverkit => "driverkit",
@@ -703,7 +703,8 @@ pub fn toLLVMTriple(target: std.Target, buf: []u8) []const u8 {
     writer.writeByte('-') catch unreachable;
 
     const llvm_abi = switch (target.abi) {
-        .none, .ilp32 => "unknown",
+        .none => if (target.os.tag == .maccatalyst) "macabi" else "unknown",
+        .ilp32 => "unknown",
         .gnu => "gnu",
         .gnuabin32 => "gnuabin32",
         .gnuabi64 => "gnuabi64",
@@ -728,7 +729,6 @@ pub fn toLLVMTriple(target: std.Target, buf: []u8) []const u8 {
         .msvc => "msvc",
         .itanium => "itanium",
         .simulator => "simulator",
-        .macabi => "macabi",
         .ohos => "ohos",
         .ohoseabi => "ohoseabi",
     };
@@ -742,6 +742,7 @@ pub fn isPIEDefault(target: std.Target) DefaultPIStatus {
     return switch (target.os.tag) {
         .haiku,
 
+        .maccatalyst,
         .macos,
         .ios,
         .tvos,
@@ -809,6 +810,7 @@ pub fn isPICdefault(target: std.Target) DefaultPIStatus {
     return switch (target.os.tag) {
         .haiku,
 
+        .maccatalyst,
         .macos,
         .ios,
         .tvos,
@@ -917,6 +919,7 @@ pub fn isPICDefaultForced(target: std.Target) DefaultPIStatus {
             return if (target.cpu.arch == .x86_64) .yes else .no;
         },
 
+        .maccatalyst,
         .macos,
         .ios,
         .tvos,
lib/compiler/aro/aro/TypeStore.zig
@@ -2091,7 +2091,7 @@ fn generateVaListType(ts: *TypeStore, comp: *Compilation) !QualType {
         .xcore,
         => return .void_pointer,
         .aarch64, .aarch64_be => switch (comp.target.os.tag) {
-            .driverkit, .ios, .macos, .tvos, .visionos, .watchos, .windows => return .char_pointer,
+            .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos, .windows => return .char_pointer,
             else => .aarch64_va_list,
         },
         .arm, .armeb, .thumb, .thumbeb => .arm_va_list,
lib/compiler_rt/clear_cache.zig
@@ -49,7 +49,7 @@ fn clear_cache(start: usize, end: usize) callconv(.c) void {
         else => false,
     };
     const apple = switch (os) {
-        .ios, .macos, .watchos, .tvos, .visionos => true,
+        .ios, .maccatalyst, .macos, .watchos, .tvos, .visionos => true,
         else => false,
     };
     if (x86) {
lib/std/Build/Cache.zig
@@ -538,7 +538,7 @@ pub const Manifest = struct {
                     // disambiguates by returning EEXIST, indicating original
                     // failure was a race, or ENOENT, indicating deletion of
                     // the directory of our open handle.
-                    if (builtin.os.tag != .macos) {
+                    if (!builtin.os.tag.isDarwin()) {
                         self.diagnostic = .{ .manifest_create = error.FileNotFound };
                         return error.CacheCheckFailed;
                     }
lib/std/crypto/Certificate/Bundle.zig
@@ -73,7 +73,7 @@ pub const RescanError = RescanLinuxError || RescanMacError || RescanWithPathErro
 pub fn rescan(cb: *Bundle, gpa: Allocator, io: Io, now: Io.Timestamp) RescanError!void {
     switch (builtin.os.tag) {
         .linux => return rescanLinux(cb, gpa, io, now),
-        .macos => return rescanMac(cb, gpa, io, now),
+        .maccatalyst, .macos => return rescanMac(cb, gpa, io, now),
         .freebsd, .openbsd => return rescanWithPath(cb, gpa, io, now, "/etc/ssl/cert.pem"),
         .netbsd => return rescanWithPath(cb, gpa, io, now, "/etc/openssl/certs/ca-certificates.crt"),
         .dragonfly => return rescanWithPath(cb, gpa, io, now, "/usr/local/etc/ssl/cert.pem"),
lib/std/debug/cpu_context.zig
@@ -2131,7 +2131,7 @@ const signal_ucontext_t = switch (native_os) {
         },
     },
     // https://github.com/ziglang/zig/blob/60be67d3c0ba6ae15fa7115596734ab1e74fbcd3/lib/libc/include/any-macos-any/sys/_types/_ucontext.h
-    .driverkit, .macos, .ios, .tvos, .watchos, .visionos => extern struct {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .watchos, .visionos => extern struct {
         _onstack: i32,
         _sigmask: std.c.sigset_t,
         _stack: std.c.stack_t,
lib/std/fs/Dir.zig
@@ -39,7 +39,7 @@ const IteratorError = error{
 } || posix.UnexpectedError;
 
 pub const Iterator = switch (native_os) {
-    .macos, .ios, .freebsd, .netbsd, .dragonfly, .openbsd, .illumos => struct {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos, .freebsd, .netbsd, .dragonfly, .openbsd, .illumos => struct {
         dir: Dir,
         seek: i64,
         buf: [1024]u8 align(@alignOf(posix.system.dirent)),
@@ -55,7 +55,7 @@ pub const Iterator = switch (native_os) {
         /// with subsequent calls to `next`, as well as when this `Dir` is deinitialized.
         pub fn next(self: *Self) Error!?Entry {
             switch (native_os) {
-                .macos, .ios => return self.nextDarwin(),
+                .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => return self.nextDarwin(),
                 .freebsd, .netbsd, .dragonfly, .openbsd => return self.nextBsd(),
                 .illumos => return self.nextIllumos(),
                 else => @compileError("unimplemented"),
@@ -612,8 +612,13 @@ pub fn iterateAssumeFirstIteration(self: Dir) Iterator {
 
 fn iterateImpl(self: Dir, first_iter_start_value: bool) Iterator {
     switch (native_os) {
-        .macos,
+        .driverkit,
         .ios,
+        .maccatalyst,
+        .macos,
+        .tvos,
+        .visionos,
+        .watchos,
         .freebsd,
         .netbsd,
         .dragonfly,
@@ -1103,7 +1108,7 @@ pub fn deleteFileZ(self: Dir, sub_path_c: [*:0]const u8) DeleteFileError!void {
         error.AccessDenied, error.PermissionDenied => |e| switch (native_os) {
             // non-Linux POSIX systems return permission errors when trying to delete a
             // directory, so we need to handle that case specifically and translate the error
-            .macos, .ios, .freebsd, .netbsd, .dragonfly, .openbsd, .illumos => {
+            .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos, .freebsd, .netbsd, .dragonfly, .openbsd, .illumos => {
                 // Don't follow symlinks to match unlinkat (which acts on symlinks rather than follows them)
                 const fstat = posix.fstatatZ(self.fd, sub_path_c, posix.AT.SYMLINK_NOFOLLOW) catch return e;
                 const is_dir = fstat.mode & posix.S.IFMT == posix.S.IFDIR;
lib/std/fs/get_app_data_dir.zig
@@ -23,7 +23,7 @@ pub fn getAppDataDir(allocator: mem.Allocator, appname: []const u8) GetAppDataDi
             defer allocator.free(local_app_data_dir);
             return fs.path.join(allocator, &[_][]const u8{ local_app_data_dir, appname });
         },
-        .macos => {
+        .maccatalyst, .macos => {
             const home_dir = posix.getenv("HOME") orelse {
                 // TODO look in /etc/passwd
                 return error.AppDataDirUnavailable;
lib/std/Io/Threaded.zig
@@ -5140,11 +5140,11 @@ fn clockToPosix(clock: Io.Clock) posix.clockid_t {
     return switch (clock) {
         .real => posix.CLOCK.REALTIME,
         .awake => switch (native_os) {
-            .macos, .ios, .watchos, .tvos => posix.CLOCK.UPTIME_RAW,
+            .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => posix.CLOCK.UPTIME_RAW,
             else => posix.CLOCK.MONOTONIC,
         },
         .boot => switch (native_os) {
-            .macos, .ios, .watchos, .tvos => posix.CLOCK.MONOTONIC_RAW,
+            .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => posix.CLOCK.MONOTONIC_RAW,
             // On freebsd derivatives, use MONOTONIC_FAST as currently there's
             // no precision tradeoff.
             .freebsd, .dragonfly => posix.CLOCK.MONOTONIC_FAST,
@@ -5687,7 +5687,7 @@ fn futexWait(t: *Threaded, ptr: *const std.atomic.Value(u32), expect: u32) Io.Ca
                 else => unreachable,
             };
         },
-        .driverkit, .ios, .macos, .tvos, .visionos, .watchos => {
+        .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => {
             const c = std.c;
             const flags: c.UL = .{
                 .op = .COMPARE_AND_WAIT,
@@ -5774,7 +5774,7 @@ pub fn futexWaitUncancelable(ptr: *const std.atomic.Value(u32), expect: u32) voi
                 else => recoverableOsBugDetected(),
             }
         },
-        .driverkit, .ios, .macos, .tvos, .visionos, .watchos => {
+        .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => {
             const c = std.c;
             const flags: c.UL = .{
                 .op = .COMPARE_AND_WAIT,
@@ -5872,7 +5872,7 @@ pub fn futexWake(ptr: *const std.atomic.Value(u32), max_waiters: u32) void {
                 else => return recoverableOsBugDetected(), // deadlock due to operating system bug
             }
         },
-        .driverkit, .ios, .macos, .tvos, .visionos, .watchos => {
+        .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => {
             const c = std.c;
             const flags: c.UL = .{
                 .op = .COMPARE_AND_WAIT,
lib/std/math/modf.zig
@@ -85,7 +85,7 @@ fn ModfTests(comptime T: type) type {
             try expectApproxEqAbs(expected_c, r.fpart, epsilon);
         }
         test "vector" {
-            if (builtin.os.tag == .macos and builtin.cpu.arch == .aarch64) return error.SkipZigTest;
+            if (builtin.os.tag.isDarwin() and builtin.cpu.arch == .aarch64) return error.SkipZigTest;
             if (builtin.cpu.arch == .s390x) return error.SkipZigTest;
             if (comptime builtin.cpu.has(.loongarch, .lsx)) return error.SkipZigTest; // https://github.com/llvm/llvm-project/issues/159529
 
lib/std/posix/test.zig
@@ -521,7 +521,7 @@ test "getrlimit and setrlimit" {
 }
 
 test "sigrtmin/max" {
-    if (native_os == .wasi or native_os == .windows or native_os == .macos) {
+    if (native_os == .wasi or native_os == .windows or native_os.isDarwin()) {
         return error.SkipZigTest;
     }
 
@@ -550,7 +550,7 @@ test "sigset empty/full" {
 // Some signals (i.e., 32 - 34 on glibc/musl) are not allowed to be added to a
 // sigset by the C library, so avoid testing them.
 fn reserved_signo(i: usize) bool {
-    if (native_os == .macos) return false;
+    if (native_os.isDarwin()) return false;
     if (!builtin.link_libc) return false;
     const max = if (native_os == .netbsd) 32 else 31;
     return i > max and i < posix.sigrtmin();
lib/std/process/Child.zig
@@ -136,7 +136,7 @@ pub const ResourceUsageStatistics = struct {
                     return null;
                 }
             },
-            .macos, .ios => {
+            .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => {
                 if (rus.rusage) |ru| {
                     // Darwin oddly reports in bytes instead of kilobytes.
                     return @as(usize, @intCast(ru.maxrss));
@@ -149,7 +149,7 @@ pub const ResourceUsageStatistics = struct {
     }
 
     const rusage_init = switch (native_os) {
-        .linux, .macos, .ios => @as(?posix.rusage, null),
+        .linux, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => @as(?posix.rusage, null),
         .windows => @as(?windows.VM_COUNTERS, null),
         else => {},
     };
@@ -486,7 +486,7 @@ fn waitUnwrappedPosix(self: *ChildProcess) void {
     const res: posix.WaitPidResult = res: {
         if (self.request_resource_usage_statistics) {
             switch (native_os) {
-                .linux, .macos, .ios => {
+                .linux, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => {
                     var ru: posix.rusage = undefined;
                     const res = posix.wait4(self.id, 0, &ru);
                     self.resource_usage_statistics.rusage = ru;
lib/std/zig/system/darwin.zig
@@ -37,13 +37,9 @@ pub fn isSdkInstalled(allocator: Allocator) bool {
 pub fn getSdk(allocator: Allocator, target: *const Target) ?[]const u8 {
     const is_simulator_abi = target.abi == .simulator;
     const sdk = switch (target.os.tag) {
-        .ios => switch (target.abi) {
-            .macabi => "macosx",
-            .simulator => "iphonesimulator",
-            else => "iphoneos",
-        },
         .driverkit => "driverkit",
-        .macos => "macosx",
+        .ios => if (is_simulator_abi) "iphonesimulator" else "iphoneos",
+        .maccatalyst, .macos => "macosx",
         .tvos => if (is_simulator_abi) "appletvsimulator" else "appletvos",
         .visionos => if (is_simulator_abi) "xrsimulator" else "xros",
         .watchos => if (is_simulator_abi) "watchsimulator" else "watchos",
lib/std/zig/LibCDirs.zig
@@ -227,7 +227,7 @@ pub fn detectFromBuilding(
 fn libCGenericName(target: *const std.Target) [:0]const u8 {
     switch (target.os.tag) {
         .windows => return "mingw",
-        .macos, .ios, .tvos, .watchos, .visionos => return "darwin",
+        .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => return "darwin",
         .freebsd => return "freebsd",
         .netbsd => return "netbsd",
         else => {},
@@ -263,7 +263,6 @@ fn libCGenericName(target: *const std.Target) [:0]const u8 {
         .msvc,
         .itanium,
         .simulator,
-        .macabi,
         => unreachable,
     }
 }
lib/std/zig/system.zig
@@ -81,7 +81,7 @@ pub fn getExternalExecutor(
     // If the OS match and OS is macOS and CPU is arm64, we can use Rosetta 2
     // to emulate the foreign architecture.
     if (options.allow_rosetta and os_match and
-        host.os.tag == .macos and host.cpu.arch == .aarch64)
+        (host.os.tag == .maccatalyst or host.os.tag == .macos) and host.cpu.arch == .aarch64)
     {
         switch (candidate.cpu.arch) {
             .x86_64 => return .rosetta,
lib/std/builtin.zig
@@ -987,7 +987,7 @@ pub const VaList = switch (builtin.cpu.arch) {
     .xcore,
     => *anyopaque,
     .aarch64, .aarch64_be => switch (builtin.os.tag) {
-        .driverkit, .ios, .macos, .tvos, .visionos, .watchos, .windows => *u8,
+        .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos, .windows => *u8,
         else => switch (builtin.zig_backend) {
             else => VaListAarch64,
             .stage2_llvm => @compileError("disabled due to miscompilations"),
lib/std/c.zig
@@ -115,7 +115,7 @@ pub const timespec = switch (native_os) {
         sec: time_t,
         nsec: c_long,
     },
-    .dragonfly, .freebsd, .macos, .ios, .tvos, .watchos, .visionos => extern struct {
+    .dragonfly, .freebsd, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => extern struct {
         sec: isize,
         nsec: isize,
     },
@@ -134,7 +134,7 @@ pub const dev_t = switch (native_os) {
     .linux => linux.dev_t,
     .emscripten => emscripten.dev_t,
     .wasi => wasi.device_t,
-    .openbsd, .haiku, .illumos, .macos, .ios, .tvos, .watchos, .visionos => i32,
+    .openbsd, .haiku, .illumos, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => i32,
     // https://github.com/SerenityOS/serenity/blob/b98f537f117b341788023ab82e0c11ca9ae29a57/Kernel/API/POSIX/sys/types.h#L43
     .netbsd, .freebsd, .serenity => u64,
     else => void,
@@ -145,7 +145,7 @@ pub const mode_t = switch (native_os) {
     .emscripten => emscripten.mode_t,
     .openbsd, .haiku, .netbsd, .illumos, .wasi, .windows => u32,
     // https://github.com/SerenityOS/serenity/blob/b98f537f117b341788023ab82e0c11ca9ae29a57/Kernel/API/POSIX/sys/types.h#L44
-    .freebsd, .macos, .ios, .tvos, .watchos, .visionos, .dragonfly, .serenity => u16,
+    .freebsd, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos, .dragonfly, .serenity => u16,
     else => u0,
 };
 
@@ -194,7 +194,7 @@ pub const passwd = switch (native_os) {
         dir: ?[*:0]const u8, // home directory
         shell: ?[*:0]const u8, // shell program
     },
-    .netbsd, .openbsd, .macos => extern struct {
+    .netbsd, .openbsd, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => extern struct {
         name: ?[*:0]const u8, // user name
         passwd: ?[*:0]const u8, // encrypted password
         uid: uid_t, // user uid
@@ -223,7 +223,7 @@ pub const passwd = switch (native_os) {
 };
 
 pub const group = switch (native_os) {
-    .linux, .freebsd, .openbsd, .dragonfly, .netbsd, .macos => extern struct {
+    .linux, .freebsd, .openbsd, .dragonfly, .netbsd, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => extern struct {
         name: ?[*:0]const u8,
         passwd: ?[*:0]const u8,
         gid: gid_t,
@@ -275,7 +275,7 @@ pub const CLOCK = clockid_t;
 pub const clockid_t = switch (native_os) {
     .linux, .emscripten => linux.clockid_t,
     .wasi => wasi.clockid_t,
-    .macos, .ios, .tvos, .watchos, .visionos => enum(u32) {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => enum(u32) {
         REALTIME = 0,
         MONOTONIC = 6,
         MONOTONIC_RAW = 4,
@@ -457,7 +457,7 @@ pub const E = switch (native_os) {
         DQUOT = 10069,
         _,
     },
-    .macos, .ios, .tvos, .watchos, .visionos => darwin.E,
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => darwin.E,
     .freebsd => freebsd.E,
     .illumos => enum(u16) {
         /// No error occurred.
@@ -833,7 +833,7 @@ pub const F = switch (native_os) {
         pub const GETFL = 3;
         pub const SETFL = 4;
     },
-    .macos, .ios, .tvos, .watchos, .visionos => struct {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => struct {
         /// duplicate file descriptor
         pub const DUPFD = 0;
         /// get file descriptor flags
@@ -1243,7 +1243,7 @@ pub const R_OK = switch (native_os) {
 pub const Flock = switch (native_os) {
     .linux => linux.Flock,
     .emscripten => emscripten.Flock,
-    .openbsd, .dragonfly, .netbsd, .macos, .ios, .tvos, .watchos, .visionos => extern struct {
+    .openbsd, .dragonfly, .netbsd, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => extern struct {
         start: off_t,
         len: off_t,
         pid: pid_t,
@@ -1294,7 +1294,7 @@ pub const Flock = switch (native_os) {
 };
 pub const HOST_NAME_MAX = switch (native_os) {
     .linux => linux.HOST_NAME_MAX,
-    .macos, .ios, .tvos, .watchos, .visionos => 72,
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => 72,
     .openbsd, .haiku, .dragonfly, .netbsd, .illumos, .freebsd => 255,
     // https://github.com/SerenityOS/serenity/blob/c87557e9c1865fa1a6440de34ff6ce6fc858a2b7/Kernel/API/POSIX/sys/limits.h#L22
     .serenity => 64,
@@ -1305,7 +1305,7 @@ pub const IOV_MAX = switch (native_os) {
     .emscripten => emscripten.IOV_MAX,
     // https://github.com/SerenityOS/serenity/blob/098af0f846a87b651731780ff48420205fd33754/Kernel/API/POSIX/sys/uio.h#L16
     .openbsd, .haiku, .illumos, .wasi, .serenity => 1024,
-    .macos, .ios, .tvos, .watchos, .visionos => 16,
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => 16,
     .dragonfly, .netbsd, .freebsd => KERN.IOV_MAX,
     else => {},
 };
@@ -1524,7 +1524,7 @@ pub const KERN = switch (native_os) {
 pub const MADV = switch (native_os) {
     .linux => linux.MADV,
     .emscripten => emscripten.MADV,
-    .macos, .ios, .tvos, .watchos, .visionos => struct {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => struct {
         pub const NORMAL = 0;
         pub const RANDOM = 1;
         pub const SEQUENTIAL = 2;
@@ -1622,7 +1622,7 @@ pub const MLOCK = switch (native_os) {
 pub const MSF = switch (native_os) {
     .linux => linux.MSF,
     .emscripten => emscripten.MSF,
-    .macos, .ios, .tvos, .watchos, .visionos => struct {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => struct {
         pub const ASYNC = 0x1;
         pub const INVALIDATE = 0x2;
         /// invalidate, leave mapped
@@ -1651,7 +1651,7 @@ pub const NAME_MAX = switch (native_os) {
     // character, but POSIX definition says that NAME_MAX does not include the
     // terminating null.
     // https://github.com/SerenityOS/serenity/blob/c87557e9c1865fa1a6440de34ff6ce6fc858a2b7/Kernel/API/POSIX/sys/limits.h#L20
-    .haiku, .openbsd, .dragonfly, .netbsd, .illumos, .freebsd, .macos, .ios, .tvos, .watchos, .visionos, .serenity => 255,
+    .haiku, .openbsd, .dragonfly, .netbsd, .illumos, .freebsd, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos, .serenity => 255,
     else => {},
 };
 pub const PATH_MAX = switch (native_os) {
@@ -1659,7 +1659,7 @@ pub const PATH_MAX = switch (native_os) {
     .emscripten => emscripten.PATH_MAX,
     .wasi => 4096,
     .windows => 260,
-    .openbsd, .haiku, .dragonfly, .netbsd, .illumos, .freebsd, .macos, .ios, .tvos, .watchos, .visionos, .serenity => 1024,
+    .openbsd, .haiku, .dragonfly, .netbsd, .illumos, .freebsd, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos, .serenity => 1024,
     else => {},
 };
 
@@ -1676,7 +1676,7 @@ pub const POLL = switch (native_os) {
         pub const NVAL = 0x4000;
     },
     .windows => ws2_32.POLL,
-    .macos, .ios, .tvos, .watchos, .visionos => struct {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => struct {
         pub const IN = 0x001;
         pub const PRI = 0x002;
         pub const OUT = 0x004;
@@ -1823,7 +1823,7 @@ pub const PROT = switch (native_os) {
         /// page can be executed
         pub const EXEC = 0x4;
     },
-    .macos, .ios, .tvos, .watchos, .visionos => struct {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => struct {
         /// [MC2] no permissions
         pub const NONE: vm_prot_t = 0x00;
         /// [MC2] pages can be read
@@ -1846,7 +1846,7 @@ pub const RLIM = switch (native_os) {
     .linux => linux.RLIM,
     .emscripten => emscripten.RLIM,
     // https://github.com/SerenityOS/serenity/blob/aae106e37b48f2158e68902293df1e4bf7b80c0f/Userland/Libraries/LibC/sys/resource.h#L52
-    .openbsd, .haiku, .dragonfly, .netbsd, .freebsd, .macos, .ios, .tvos, .watchos, .visionos, .serenity => struct {
+    .openbsd, .haiku, .dragonfly, .netbsd, .freebsd, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos, .serenity => struct {
         /// No limit
         pub const INFINITY: rlim_t = (1 << 63) - 1;
 
@@ -1903,7 +1903,7 @@ pub const S = switch (native_os) {
             return m & IFMT == IFSOCK;
         }
     },
-    .macos, .ios, .tvos, .watchos, .visionos => struct {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => struct {
         pub const IFMT = 0o170000;
 
         pub const IFIFO = 0o010000;
@@ -2396,7 +2396,7 @@ pub const S = switch (native_os) {
 pub const SA = switch (native_os) {
     .linux => linux.SA,
     .emscripten => emscripten.SA,
-    .macos, .ios, .tvos, .watchos, .visionos => struct {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => struct {
         /// take signal on signal stack
         pub const ONSTACK = 0x0001;
         /// restart system on signal return
@@ -2502,7 +2502,7 @@ pub const _SC = if (builtin.abi.isAndroid()) enum(c_int) {
     PAGESIZE = 39,
     NPROCESSORS_ONLN = 97,
 } else switch (native_os) {
-    .driverkit, .ios, .macos, .tvos, .visionos, .watchos => enum(c_int) {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => enum(c_int) {
         PAGESIZE = 29,
     },
     .dragonfly => enum(c_int) {
@@ -2562,7 +2562,7 @@ pub const SEEK = switch (native_os) {
         pub const END: wasi.whence_t = .END;
     },
     // https://github.com/SerenityOS/serenity/blob/808ce594db1f2190e5212a250e900bde2ffe710b/Kernel/API/POSIX/stdio.h#L15-L17
-    .openbsd, .haiku, .netbsd, .freebsd, .macos, .ios, .tvos, .watchos, .visionos, .windows, .serenity => struct {
+    .openbsd, .haiku, .netbsd, .freebsd, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos, .windows, .serenity => struct {
         pub const SET = 0;
         pub const CUR = 1;
         pub const END = 2;
@@ -2622,7 +2622,7 @@ pub const SIG = switch (native_os) {
         /// Signal error value (returned by signal call on error)
         pub const ERR = -1;
     },
-    .macos, .ios, .tvos, .watchos, .visionos => enum(u32) {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => enum(u32) {
         pub const ERR: ?Sigaction.handler_fn = @ptrFromInt(maxInt(usize));
         pub const DFL: ?Sigaction.handler_fn = @ptrFromInt(0);
         pub const IGN: ?Sigaction.handler_fn = @ptrFromInt(1);
@@ -3185,7 +3185,7 @@ pub const Sigaction = switch (native_os) {
         else => common_linux_Sigaction,
     },
     .emscripten => emscripten.Sigaction,
-    .netbsd, .macos, .ios, .tvos, .watchos, .visionos => extern struct {
+    .netbsd, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => extern struct {
         pub const handler_fn = *align(1) const fn (SIG) callconv(.c) void;
         pub const sigaction_fn = *const fn (SIG, *const siginfo_t, ?*anyopaque) callconv(.c) void;
 
@@ -3273,7 +3273,7 @@ pub const Sigaction = switch (native_os) {
 };
 pub const T = switch (native_os) {
     .linux => linux.T,
-    .macos, .ios, .tvos, .watchos, .visionos => struct {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => struct {
         pub const IOCGWINSZ = ior(0x40000000, 't', 104, @sizeOf(winsize));
 
         fn ior(inout: u32, group_arg: usize, num: usize, len: usize) usize {
@@ -3664,7 +3664,7 @@ pub const T = switch (native_os) {
 };
 pub const IOCPARM_MASK = switch (native_os) {
     .windows => ws2_32.IOCPARM_MASK,
-    .macos, .ios, .tvos, .watchos, .visionos => 0x1fff,
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => 0x1fff,
     else => void,
 };
 pub const TCSA = std.posix.TCSA;
@@ -3679,7 +3679,7 @@ pub const VDSO = switch (native_os) {
 pub const W = switch (native_os) {
     .linux => linux.W,
     .emscripten => emscripten.W,
-    .macos, .ios, .tvos, .watchos, .visionos => struct {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => struct {
         /// [XSI] no hang in wait/no child to reap
         pub const NOHANG = 0x00000001;
         /// [XSI] notify on stop, untraced child
@@ -3939,7 +3939,7 @@ pub const accept_filter_arg = switch (native_os) {
     // https://github.com/DragonFlyBSD/DragonFlyBSD/blob/6098912863ed4c7b3f70d7483910ce2956cf4ed3/sys/sys/socket.h#L164
     // https://github.com/NetBSD/src/blob/cad5c68a8524927f65e22ad651de3905382be6e0/sys/sys/socket.h#L188
     // https://github.com/apple/darwin-xnu/blob/2ff845c2e033bd0ff64b5b6aa6063a1f8f65aa32/bsd/sys/socket.h#L504
-    .freebsd, .dragonfly, .netbsd, .macos, .driverkit, .ios, .tvos, .watchos, .visionos => extern struct {
+    .freebsd, .dragonfly, .netbsd, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => extern struct {
         name: [16]u8,
         arg: [240]u8,
     },
@@ -3948,7 +3948,7 @@ pub const accept_filter_arg = switch (native_os) {
 pub const clock_t = switch (native_os) {
     .linux => linux.clock_t,
     .emscripten => emscripten.clock_t,
-    .macos, .ios, .tvos, .watchos, .visionos => c_ulong,
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => c_ulong,
     .freebsd => isize,
     .openbsd, .illumos => i64,
     .netbsd => u32,
@@ -4034,7 +4034,7 @@ pub const in_pktinfo = switch (native_os) {
     .linux => linux.in_pktinfo,
     // https://github.com/illumos/illumos-gate/blob/608eb926e14f4ba4736b2d59e891335f1cba9e1e/usr/src/uts/common/netinet/in.h#L1132
     // https://github.com/apple/darwin-xnu/blob/2ff845c2e033bd0ff64b5b6aa6063a1f8f65aa32/bsd/netinet/in.h#L696
-    .illumos, .driverkit, .ios, .macos, .tvos, .watchos, .visionos => extern struct {
+    .illumos, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => extern struct {
         ifindex: u32,
         spec_dst: u32,
         addr: u32,
@@ -4051,7 +4051,7 @@ pub const in6_pktinfo = switch (native_os) {
     // https://github.com/apple/darwin-xnu/blob/2ff845c2e033bd0ff64b5b6aa6063a1f8f65aa32/bsd/netinet6/in6.h#L737
     // https://github.com/haiku/haiku/blob/2aab5f5f14aeb3f34c3a3d9a9064cc3c0d914bea/headers/posix/netinet6/in6.h#L63
     // https://github.com/SerenityOS/serenity/blob/5bd8af99be0bc4b2e14f361fd7d7590e6bcfa4d6/Kernel/API/POSIX/sys/socket.h#L122
-    .freebsd, .dragonfly, .netbsd, .openbsd, .illumos, .driverkit, .ios, .macos, .tvos, .watchos, .visionos, .haiku, .serenity => extern struct {
+    .freebsd, .dragonfly, .netbsd, .openbsd, .illumos, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos, .haiku, .serenity => extern struct {
         addr: [16]u8,
         ifindex: u32,
     },
@@ -4084,10 +4084,11 @@ pub const linger = switch (native_os) {
     // https://github.com/apple/darwin-xnu/blob/2ff845c2e033bd0ff64b5b6aa6063a1f8f65aa32/bsd/sys/socket.h#L498
     .driverkit,
     .ios,
+    .maccatalyst,
     .macos,
     .tvos,
-    .watchos,
     .visionos,
+    .watchos,
     => extern struct {
         onoff: i32, // non-zero to linger on close
         linger: i32, // time to linger in seconds
@@ -4104,9 +4105,10 @@ pub const msghdr = switch (native_os) {
     .netbsd,
     .haiku,
     .illumos,
-    .macos,
     .driverkit,
     .ios,
+    .maccatalyst,
+    .macos,
     .tvos,
     .visionos,
     .watchos,
@@ -4139,9 +4141,10 @@ pub const msghdr_const = switch (native_os) {
     .netbsd,
     .haiku,
     .illumos,
-    .macos,
     .driverkit,
     .ios,
+    .maccatalyst,
+    .macos,
     .tvos,
     .visionos,
     .watchos,
@@ -4191,9 +4194,10 @@ pub const cmsghdr = switch (native_os) {
     // https://github.com/haiku/haiku/blob/b54f586058fd6623645512e4631468cede9933b9/headers/posix/sys/socket.h#L132
     .haiku,
     // https://github.com/apple/darwin-xnu/blob/2ff845c2e033bd0ff64b5b6aa6063a1f8f65aa32/bsd/sys/socket.h#L1041
-    .macos,
     .driverkit,
     .ios,
+    .maccatalyst,
+    .macos,
     .tvos,
     .visionos,
     .watchos,
@@ -4215,7 +4219,7 @@ pub const nfds_t = switch (native_os) {
     .emscripten => emscripten.nfds_t,
     .haiku, .illumos, .wasi => usize,
     .windows => c_ulong,
-    .openbsd, .dragonfly, .netbsd, .freebsd, .macos, .ios, .tvos, .watchos, .visionos => u32,
+    .openbsd, .dragonfly, .netbsd, .freebsd, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => u32,
     // https://github.com/SerenityOS/serenity/blob/265764ff2fec038855193296588a887fc322d76a/Kernel/API/POSIX/poll.h#L32
     .serenity => c_uint,
     else => void,
@@ -4251,7 +4255,7 @@ pub const pollfd = switch (native_os) {
 pub const rlim_t = switch (native_os) {
     .linux => linux.rlim_t,
     .emscripten => emscripten.rlim_t,
-    .openbsd, .netbsd, .illumos, .macos, .ios, .tvos, .watchos, .visionos => u64,
+    .openbsd, .netbsd, .illumos, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => u64,
     .haiku, .dragonfly, .freebsd => i64,
     // https://github.com/SerenityOS/serenity/blob/aae106e37b48f2158e68902293df1e4bf7b80c0f/Userland/Libraries/LibC/sys/resource.h#L54
     .serenity => usize,
@@ -4271,7 +4275,7 @@ pub const rlimit = switch (native_os) {
 pub const rlimit_resource = switch (native_os) {
     .linux => linux.rlimit_resource,
     .emscripten => emscripten.rlimit_resource,
-    .openbsd, .macos, .ios, .tvos, .watchos, .visionos => enum(c_int) {
+    .openbsd, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => enum(c_int) {
         CPU = 0,
         FSIZE = 1,
         DATA = 2,
@@ -4378,7 +4382,7 @@ pub const rlimit_resource = switch (native_os) {
 pub const rusage = switch (native_os) {
     .linux => linux.rusage,
     .emscripten => emscripten.rusage,
-    .macos, .ios, .tvos, .watchos, .visionos => extern struct {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => extern struct {
         utime: timeval,
         stime: timeval,
         maxrss: isize,
@@ -4449,7 +4453,7 @@ pub const rusage = switch (native_os) {
 pub const siginfo_t = switch (native_os) {
     .linux => linux.siginfo_t,
     .emscripten => emscripten.siginfo_t,
-    .driverkit, .macos, .ios, .tvos, .watchos, .visionos => extern struct {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => extern struct {
         signo: SIG,
         errno: c_int,
         code: c_int,
@@ -4639,7 +4643,7 @@ pub const sigset_t = switch (native_os) {
     .emscripten => emscripten.sigset_t,
     // https://github.com/SerenityOS/serenity/blob/ec492a1a0819e6239ea44156825c4ee7234ca3db/Kernel/API/POSIX/signal.h#L19
     .openbsd, .serenity => u32,
-    .macos, .ios, .tvos, .watchos, .visionos => darwin.sigset_t,
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => darwin.sigset_t,
     .dragonfly, .netbsd, .illumos, .freebsd => extern struct {
         __bits: [SIG.WORDS]u32,
     },
@@ -4669,7 +4673,7 @@ pub const addrinfo = if (builtin.abi.isAndroid()) extern struct {
 } else switch (native_os) {
     .linux, .emscripten => linux.addrinfo,
     .windows => ws2_32.addrinfo,
-    .freebsd, .macos, .ios, .tvos, .watchos, .visionos => extern struct {
+    .freebsd, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => extern struct {
         flags: AI,
         family: i32,
         socktype: i32,
@@ -4735,7 +4739,7 @@ pub const addrinfo = if (builtin.abi.isAndroid()) extern struct {
 pub const sockaddr = switch (native_os) {
     .linux, .emscripten => linux.sockaddr,
     .windows => ws2_32.sockaddr,
-    .macos, .ios, .tvos, .watchos, .visionos => extern struct {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => extern struct {
         len: u8,
         family: sa_family_t,
         data: [14]u8,
@@ -5077,7 +5081,7 @@ pub const in_port_t = u16;
 pub const sa_family_t = switch (native_os) {
     .linux, .emscripten => linux.sa_family_t,
     .windows => ws2_32.ADDRESS_FAMILY,
-    .openbsd, .haiku, .dragonfly, .netbsd, .freebsd, .macos, .ios, .tvos, .watchos, .visionos => u8,
+    .openbsd, .haiku, .dragonfly, .netbsd, .freebsd, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => u8,
     // https://github.com/SerenityOS/serenity/blob/ac44ec5ebc707f9dd0c3d4759a1e17e91db5d74f/Kernel/API/POSIX/sys/socket.h#L66
     .illumos, .serenity => u16,
     else => void,
@@ -5130,7 +5134,7 @@ pub const AF = if (builtin.abi.isAndroid()) struct {
 } else switch (native_os) {
     .linux, .emscripten => linux.AF,
     .windows => ws2_32.AF,
-    .macos, .ios, .tvos, .watchos, .visionos => struct {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => struct {
         pub const UNSPEC = 0;
         pub const LOCAL = 1;
         pub const UNIX = LOCAL;
@@ -5416,7 +5420,7 @@ pub const PF = if (builtin.abi.isAndroid()) struct {
     pub const PF_MAX = AF.MAX;
 } else switch (native_os) {
     .linux, .emscripten => linux.PF,
-    .macos, .ios, .tvos, .watchos, .visionos => struct {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => struct {
         pub const UNSPEC = AF.UNSPEC;
         pub const LOCAL = AF.LOCAL;
         pub const UNIX = PF.LOCAL;
@@ -5650,7 +5654,7 @@ pub const PF = if (builtin.abi.isAndroid()) struct {
 pub const DT = switch (native_os) {
     .linux => linux.DT,
     // https://github.com/SerenityOS/serenity/blob/1262a7d1424d0d2e89d80644409721cbf056ab17/Kernel/API/POSIX/dirent.h#L16-L35
-    .netbsd, .freebsd, .openbsd, .macos, .ios, .tvos, .watchos, .visionos, .serenity => struct {
+    .netbsd, .freebsd, .openbsd, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos, .serenity => struct {
         pub const UNKNOWN = 0;
         pub const FIFO = 1;
         pub const CHR = 2;
@@ -5679,7 +5683,7 @@ pub const MSG = switch (native_os) {
     .linux => linux.MSG,
     .emscripten => emscripten.MSG,
     .windows => ws2_32.MSG,
-    .driverkit, .macos, .ios, .tvos, .watchos, .visionos => darwin.MSG,
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => darwin.MSG,
     .haiku => struct {
         pub const OOB = 0x0001;
         pub const PEEK = 0x0002;
@@ -5796,7 +5800,7 @@ pub const SOCK = switch (native_os) {
     .linux => linux.SOCK,
     .emscripten => emscripten.SOCK,
     .windows => ws2_32.SOCK,
-    .macos, .ios, .tvos, .watchos, .visionos => struct {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => struct {
         pub const STREAM = 1;
         pub const DGRAM = 2;
         pub const RAW = 3;
@@ -5897,7 +5901,7 @@ pub const SOCK = switch (native_os) {
     else => void,
 };
 pub const TCP = switch (native_os) {
-    .macos => darwin.TCP,
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => darwin.TCP,
     .linux => linux.TCP,
     .emscripten => emscripten.TCP,
     .windows => ws2_32.TCP,
@@ -5911,7 +5915,7 @@ pub const TCP = switch (native_os) {
 pub const IPPROTO = switch (native_os) {
     .linux, .emscripten => linux.IPPROTO,
     .windows => ws2_32.IPPROTO,
-    .macos, .ios, .tvos, .watchos, .visionos => struct {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => struct {
         pub const ICMP = 1;
         pub const ICMPV6 = 58;
         pub const TCP = 6;
@@ -6543,7 +6547,7 @@ pub const SOL = switch (native_os) {
     .linux => linux.SOL,
     .emscripten => emscripten.SOL,
     .windows => ws2_32.SOL,
-    .openbsd, .haiku, .dragonfly, .netbsd, .freebsd, .macos, .ios, .tvos, .watchos, .visionos => struct {
+    .openbsd, .haiku, .dragonfly, .netbsd, .freebsd, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => struct {
         pub const SOCKET = 0xffff;
     },
     .illumos => struct {
@@ -6562,7 +6566,7 @@ pub const SO = switch (native_os) {
     .linux => linux.SO,
     .emscripten => emscripten.SO,
     .windows => ws2_32.SO,
-    .macos, .ios, .tvos, .watchos, .visionos => struct {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => struct {
         pub const DEBUG = 0x0001;
         pub const ACCEPTCONN = 0x0002;
         pub const REUSEADDR = 0x0004;
@@ -6807,7 +6811,7 @@ pub const SOMAXCONN = switch (native_os) {
     // https://github.com/NetBSD/src/blob/a673fb3f8487e974c669216064f7588207229fea/sys/sys/socket.h#L472
     // https://github.com/openbsd/src/blob/8ba9cd88f10123fef7af805b8e5ccc2463ad8fa4/sys/sys/socket.h#L483
     // https://github.com/apple/darwin-xnu/blob/2ff845c2e033bd0ff64b5b6aa6063a1f8f65aa32/bsd/sys/socket.h#L815
-    .freebsd, .dragonfly, .netbsd, .openbsd, .driverkit, .macos, .ios, .tvos, .watchos, .visionos => 128,
+    .freebsd, .dragonfly, .netbsd, .openbsd, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => 128,
     else => void,
 };
 pub const SCM = switch (native_os) {
@@ -6856,7 +6860,7 @@ pub const SCM = switch (native_os) {
         pub const TIMESTAMP = 0x04;
     },
     // https://github.com/apple/darwin-xnu/blob/2ff845c2e033bd0ff64b5b6aa6063a1f8f65aa32/bsd/sys/socket.h#L1114
-    .driverkit, .macos, .ios, .tvos, .watchos, .visionos => struct {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => struct {
         pub const RIGHTS = 1;
         pub const TIMESTAMP = 2;
         pub const CREDS = 3;
@@ -6870,7 +6874,7 @@ pub const IFNAMESIZE = switch (native_os) {
     .emscripten => emscripten.IFNAMESIZE,
     .windows => 30,
     // https://github.com/SerenityOS/serenity/blob/9882848e0bf783dfc8e8a6d887a848d70d9c58f4/Kernel/API/POSIX/net/if.h#L50
-    .openbsd, .dragonfly, .netbsd, .freebsd, .macos, .ios, .tvos, .watchos, .visionos, .serenity => 16,
+    .openbsd, .dragonfly, .netbsd, .freebsd, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos, .serenity => 16,
     .illumos => 32,
     else => {},
 };
@@ -6921,7 +6925,7 @@ pub const timeval = switch (native_os) {
         sec: c_long,
         usec: c_long,
     },
-    .macos, .ios, .tvos, .watchos, .visionos => extern struct {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => extern struct {
         sec: c_long,
         usec: i32,
     },
@@ -6941,7 +6945,7 @@ pub const timeval = switch (native_os) {
 pub const timezone = switch (native_os) {
     .linux => linux.timezone,
     .emscripten => emscripten.timezone,
-    .openbsd, .macos, .ios, .tvos, .watchos, .visionos => extern struct {
+    .openbsd, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => extern struct {
         minuteswest: i32,
         dsttime: i32,
     },
@@ -6968,7 +6972,7 @@ pub const utsname = switch (native_os) {
         machine: [256:0]u8,
         domainname: [256:0]u8,
     },
-    .macos => extern struct {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => extern struct {
         sysname: [255:0]u8,
         nodename: [255:0]u8,
         release: [255:0]u8,
@@ -6999,7 +7003,7 @@ pub const _errno = switch (native_os) {
     .emscripten => private.__errno_location,
     .wasi, .dragonfly => private.errnoFromThreadLocal,
     .windows => private._errno,
-    .macos, .ios, .tvos, .watchos, .visionos, .freebsd => private.__error,
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos, .freebsd => private.__error,
     .illumos => private.___errno,
     .openbsd, .netbsd => private.__errno,
     .haiku => haiku._errnop,
@@ -7070,7 +7074,7 @@ pub const RTLD = switch (native_os) {
         TRACE: bool = false,
         _: u22 = 0,
     },
-    .macos, .ios, .tvos, .watchos, .visionos => packed struct(u32) {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => packed struct(u32) {
         LAZY: bool = false,
         NOW: bool = false,
         LOCAL: bool = false,
@@ -7102,7 +7106,7 @@ pub const dirent = switch (native_os) {
         type: u8,
         name: [256]u8,
     },
-    .macos, .ios, .tvos, .watchos, .visionos => extern struct {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => extern struct {
         ino: u64,
         seekoff: u64,
         reclen: u16,
@@ -7246,7 +7250,7 @@ pub const AI = if (builtin.abi.isAndroid()) packed struct(u32) {
         ADDRCONFIG: bool = false,
         _: u25 = 0,
     },
-    .macos, .ios, .tvos, .watchos, .visionos => packed struct(u32) {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => packed struct(u32) {
         PASSIVE: bool = false,
         CANONNAME: bool = false,
         NUMERICHOST: bool = false,
@@ -7363,7 +7367,7 @@ pub const EAI = if (builtin.abi.isAndroid()) enum(c_int) {
 
         _,
     },
-    .haiku, .dragonfly, .netbsd, .freebsd, .macos, .ios, .tvos, .watchos, .visionos => enum(c_int) {
+    .haiku, .dragonfly, .netbsd, .freebsd, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => enum(c_int) {
         /// address family for hostname not supported
         ADDRFAMILY = 1,
         /// temporary failure in name resolution
@@ -7697,7 +7701,7 @@ pub const Stat = switch (native_os) {
             };
         }
     },
-    .macos, .ios, .tvos, .watchos, .visionos => extern struct {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => extern struct {
         dev: i32,
         mode: u16,
         nlink: u16,
@@ -7940,7 +7944,7 @@ pub const pthread_mutex_t = switch (native_os) {
             else => @compileError("unsupported ABI"),
         };
     },
-    .macos, .ios, .tvos, .watchos, .visionos => extern struct {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => extern struct {
         sig: c_long = 0x32AAABA7,
         data: [data_len]u8 = [_]u8{0} ** data_len,
 
@@ -7997,7 +8001,7 @@ pub const pthread_cond_t = switch (native_os) {
     .linux => extern struct {
         data: [48]u8 align(@alignOf(usize)) = [_]u8{0} ** 48,
     },
-    .macos, .ios, .tvos, .watchos, .visionos => extern struct {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => extern struct {
         sig: c_long = 0x3CB0B1BB,
         data: [data_len]u8 = [_]u8{0} ** data_len,
         const data_len = if (@sizeOf(usize) == 8) 40 else 24;
@@ -8056,7 +8060,7 @@ pub const pthread_rwlock_t = switch (native_os) {
             data: [56]u8 align(@alignOf(usize)) = [_]u8{0} ** 56,
         },
     },
-    .macos, .ios, .tvos, .watchos, .visionos => extern struct {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => extern struct {
         sig: c_long = 0x2DA8B3B4,
         data: [192]u8 = [_]u8{0} ** 192,
     },
@@ -8108,7 +8112,7 @@ pub const pthread_attr_t = switch (native_os) {
         __size: [56]u8,
         __align: c_long,
     },
-    .macos, .ios, .tvos, .watchos, .visionos => extern struct {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => extern struct {
         __sig: c_long,
         __opaque: [56]u8,
     },
@@ -8136,7 +8140,7 @@ pub const pthread_attr_t = switch (native_os) {
 
 pub const pthread_key_t = switch (native_os) {
     .linux, .emscripten => c_uint,
-    .macos, .ios, .tvos, .watchos, .visionos => c_ulong,
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => c_ulong,
     // https://github.com/SerenityOS/serenity/blob/b98f537f117b341788023ab82e0c11ca9ae29a57/Kernel/API/POSIX/sys/types.h#L65
     .openbsd, .illumos, .serenity => c_int,
     else => void,
@@ -8169,7 +8173,7 @@ pub const sem_t = switch (native_os) {
     .linux, .emscripten => extern struct {
         __size: [4 * @sizeOf(usize)]u8 align(@alignOf(usize)),
     },
-    .macos, .ios, .tvos, .watchos, .visionos => c_int,
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => c_int,
     .freebsd => extern struct {
         _magic: u32,
         _kern: extern struct {
@@ -8213,7 +8217,7 @@ pub const Kevent = switch (native_os) {
         data: i64,
         udata: usize,
     },
-    .macos, .ios, .tvos, .watchos, .visionos => extern struct {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => extern struct {
         ident: usize,
         filter: i16,
         flags: u16,
@@ -8293,7 +8297,7 @@ pub const AT = switch (native_os) {
         /// Remove directory instead of unlinking file
         pub const REMOVEDIR = 0x200;
     },
-    .macos, .ios, .tvos, .watchos, .visionos => struct {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => struct {
         pub const FDCWD = -2;
         /// Use effective ids in access check
         pub const EACCESS = 0x0010;
@@ -8548,7 +8552,7 @@ pub const O = switch (native_os) {
         DIRECTORY: bool = false,
         _: u10 = 0,
     },
-    .macos, .ios, .tvos, .watchos, .visionos => packed struct(u32) {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => packed struct(u32) {
         ACCMODE: std.posix.ACCMODE = .RDONLY,
         NONBLOCK: bool = false,
         APPEND: bool = false,
@@ -8727,7 +8731,7 @@ pub const MAP = switch (native_os) {
         NORESERVE: bool = false,
         _: u27 = 0,
     },
-    .macos, .ios, .tvos, .watchos, .visionos => packed struct(u32) {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => packed struct(u32) {
         TYPE: enum(u4) {
             SHARED = 0x01,
             PRIVATE = 0x02,
@@ -8812,7 +8816,7 @@ pub const cc_t = u8;
 /// Indices into the `cc` array in the `termios` struct.
 pub const V = switch (native_os) {
     .linux => linux.V,
-    .macos, .ios, .tvos, .watchos, .visionos, .netbsd, .openbsd => enum {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos, .netbsd, .openbsd => enum {
         EOF,
         EOL,
         EOL2,
@@ -8932,7 +8936,7 @@ pub const V = switch (native_os) {
 
 pub const NCCS = switch (native_os) {
     .linux => linux.NCCS,
-    .macos, .ios, .tvos, .watchos, .visionos, .freebsd, .netbsd, .openbsd, .dragonfly => 20,
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos, .freebsd, .netbsd, .openbsd, .dragonfly => 20,
     .haiku => 11,
     .illumos => 19,
     // https://github.com/SerenityOS/serenity/blob/d277cdfd4c7ed21d5248a83217ae03b9f890c3c8/Kernel/API/POSIX/termios.h#L15
@@ -8942,7 +8946,7 @@ pub const NCCS = switch (native_os) {
 
 pub const termios = switch (native_os) {
     .linux => linux.termios,
-    .macos, .ios, .tvos, .watchos, .visionos => extern struct {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => extern struct {
         iflag: tc_iflag_t,
         oflag: tc_oflag_t,
         cflag: tc_cflag_t,
@@ -8993,7 +8997,7 @@ pub const termios = switch (native_os) {
 
 pub const tc_iflag_t = switch (native_os) {
     .linux => linux.tc_iflag_t,
-    .macos, .ios, .tvos, .watchos, .visionos => packed struct(u64) {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => packed struct(u64) {
         IGNBRK: bool = false,
         BRKINT: bool = false,
         IGNPAR: bool = false,
@@ -9104,7 +9108,7 @@ pub const tc_iflag_t = switch (native_os) {
 
 pub const tc_oflag_t = switch (native_os) {
     .linux => linux.tc_oflag_t,
-    .macos, .ios, .tvos, .watchos, .visionos => packed struct(u64) {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => packed struct(u64) {
         OPOST: bool = false,
         ONLCR: bool = false,
         OXTABS: bool = false,
@@ -9202,7 +9206,7 @@ pub const CSIZE = switch (native_os) {
 
 pub const tc_cflag_t = switch (native_os) {
     .linux => linux.tc_cflag_t,
-    .macos, .ios, .tvos, .watchos, .visionos => packed struct(u64) {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => packed struct(u64) {
         CIGNORE: bool = false,
         _1: u5 = 0,
         CSTOPB: bool = false,
@@ -9351,7 +9355,7 @@ pub const tc_cflag_t = switch (native_os) {
 
 pub const tc_lflag_t = switch (native_os) {
     .linux => linux.tc_lflag_t,
-    .macos, .ios, .tvos, .watchos, .visionos => packed struct(u64) {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => packed struct(u64) {
         ECHOKE: bool = false,
         ECHOE: bool = false,
         ECHOK: bool = false,
@@ -9498,7 +9502,7 @@ pub const tc_lflag_t = switch (native_os) {
 
 pub const speed_t = switch (native_os) {
     .linux => linux.speed_t,
-    .macos, .ios, .tvos, .watchos, .visionos, .openbsd => enum(u64) {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos, .openbsd => enum(u64) {
         B0 = 0,
         B50 = 50,
         B75 = 75,
@@ -9693,7 +9697,7 @@ pub const NSIG = switch (native_os) {
     .windows => 23,
     .haiku => 65,
     .netbsd, .freebsd => 32,
-    .macos => darwin.NSIG,
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => darwin.NSIG,
     .illumos => 75,
     // https://github.com/SerenityOS/serenity/blob/046c23f567a17758d762a33bdf04bacbfd088f9f/Kernel/API/POSIX/signal_numbers.h#L42
     .openbsd, .serenity => 33,
@@ -9701,7 +9705,7 @@ pub const NSIG = switch (native_os) {
 };
 
 pub const MINSIGSTKSZ = switch (native_os) {
-    .macos, .ios, .tvos, .watchos, .visionos => 32768,
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => 32768,
     .freebsd => switch (builtin.cpu.arch) {
         .powerpc64, .powerpc64le, .x86, .x86_64 => 2048,
         .arm, .aarch64, .riscv64 => 4096,
@@ -9715,7 +9719,7 @@ pub const MINSIGSTKSZ = switch (native_os) {
     else => {},
 };
 pub const SIGSTKSZ = switch (native_os) {
-    .macos, .ios, .tvos, .watchos, .visionos => 131072,
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => 131072,
     .netbsd, .freebsd => MINSIGSTKSZ + 32768,
     .illumos => 8192,
     .haiku => 16384,
@@ -9726,7 +9730,7 @@ pub const SIGSTKSZ = switch (native_os) {
 };
 pub const SS = switch (native_os) {
     .linux => linux.SS,
-    .openbsd, .macos, .ios, .tvos, .watchos, .visionos, .netbsd, .freebsd => struct {
+    .openbsd, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos, .netbsd, .freebsd => struct {
         pub const ONSTACK = 1;
         pub const DISABLE = 4;
     },
@@ -9739,7 +9743,7 @@ pub const SS = switch (native_os) {
 };
 
 pub const EV = switch (native_os) {
-    .macos, .ios, .tvos, .watchos, .visionos => struct {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => struct {
         /// add event to kq (implies enable)
         pub const ADD = 0x0001;
         /// delete event from kq
@@ -9879,7 +9883,7 @@ pub const EV = switch (native_os) {
 };
 
 pub const EVFILT = switch (native_os) {
-    .macos, .ios, .tvos, .watchos, .visionos => struct {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => struct {
         pub const READ = -1;
         pub const WRITE = -2;
         /// attached to aio requests
@@ -10002,7 +10006,7 @@ pub const EVFILT = switch (native_os) {
 };
 
 pub const NOTE = switch (native_os) {
-    .macos, .ios, .tvos, .watchos, .visionos => struct {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => struct {
         /// On input, TRIGGER causes the event to be triggered for output.
         pub const TRIGGER = 0x01000000;
         /// ignore input fflags
@@ -10293,7 +10297,7 @@ pub extern "c" fn sigwait(set: ?*sigset_t, sig: ?*c_int) c_int;
 pub extern "c" fn alarm(seconds: c_uint) c_uint;
 
 pub const close = switch (native_os) {
-    .macos, .ios, .tvos, .watchos, .visionos => darwin.@"close$NOCANCEL",
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => darwin.@"close$NOCANCEL",
     else => private.close,
 };
 
@@ -10308,7 +10312,7 @@ pub const clock_gettime = switch (native_os) {
 };
 
 pub const fstat = switch (native_os) {
-    .macos => switch (native_arch) {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => switch (native_arch) {
         .x86_64 => private.@"fstat$INODE64",
         else => private.fstat,
     },
@@ -10317,7 +10321,7 @@ pub const fstat = switch (native_os) {
 };
 
 pub const fstatat = switch (native_os) {
-    .macos => switch (native_arch) {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => switch (native_arch) {
         .x86_64 => private.@"fstatat$INODE64",
         else => private.fstatat,
     },
@@ -10351,7 +10355,7 @@ pub extern "c" fn setrlimit64(resource: rlimit_resource, rlim: *const rlimit) c_
 
 pub const arc4random_buf = switch (native_os) {
     .linux => if (builtin.abi.isAndroid()) private.arc4random_buf else {},
-    .dragonfly, .netbsd, .freebsd, .illumos, .openbsd, .serenity, .macos, .ios, .tvos, .watchos, .visionos => private.arc4random_buf,
+    .dragonfly, .netbsd, .freebsd, .illumos, .openbsd, .serenity, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => private.arc4random_buf,
     else => {},
 };
 pub const getentropy = switch (native_os) {
@@ -10404,7 +10408,7 @@ pub extern "c" fn ftruncate64(fd: c_int, length: off_t) c_int;
 pub extern "c" fn fallocate(fd: fd_t, mode: c_int, offset: off_t, len: off_t) c_int;
 pub const sendfile = switch (native_os) {
     .freebsd => freebsd.sendfile,
-    .macos, .ios, .tvos, .watchos, .visionos => darwin.sendfile,
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => darwin.sendfile,
     .linux => private.sendfile,
     else => {},
 };
@@ -10445,7 +10449,7 @@ pub extern "c" fn madvise(
 ) c_int;
 
 pub const getdirentries = switch (native_os) {
-    .macos, .ios, .tvos, .watchos, .visionos => private.__getdirentries64,
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => private.__getdirentries64,
     else => private.getdirentries,
 };
 
@@ -10500,7 +10504,7 @@ pub const nanosleep = switch (native_os) {
 };
 
 pub const readdir = switch (native_os) {
-    .macos => switch (native_arch) {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => switch (native_arch) {
         .x86_64 => private.@"readdir$INODE64",
         else => private.readdir,
     },
@@ -10509,7 +10513,7 @@ pub const readdir = switch (native_os) {
 };
 
 pub const realpath = switch (native_os) {
-    .macos, .ios, .tvos, .watchos, .visionos => private.@"realpath$DARWIN_EXTSN",
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => private.@"realpath$DARWIN_EXTSN",
     else => private.realpath,
 };
 
@@ -10573,7 +10577,7 @@ pub const socketpair = switch (native_os) {
 };
 
 pub const stat = switch (native_os) {
-    .macos => switch (native_arch) {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => switch (native_arch) {
         .x86_64 => private.@"stat$INODE64",
         else => private.stat,
     },
@@ -10585,7 +10589,7 @@ pub const _msize = switch (native_os) {
     else => {},
 };
 pub const malloc_size = switch (native_os) {
-    .macos, .ios, .tvos, .watchos, .visionos, .serenity => private.malloc_size,
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos, .serenity => private.malloc_size,
     else => {},
 };
 pub const malloc_usable_size = switch (native_os) {
@@ -10593,7 +10597,7 @@ pub const malloc_usable_size = switch (native_os) {
     else => {},
 };
 pub const posix_memalign = switch (native_os) {
-    .dragonfly, .netbsd, .freebsd, .illumos, .openbsd, .linux, .macos, .ios, .tvos, .watchos, .visionos, .serenity => private.posix_memalign,
+    .dragonfly, .netbsd, .freebsd, .illumos, .openbsd, .linux, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos, .serenity => private.posix_memalign,
     else => {},
 };
 pub const sysconf = switch (native_os) {
@@ -10602,7 +10606,7 @@ pub const sysconf = switch (native_os) {
 };
 
 pub const sf_hdtr = switch (native_os) {
-    .freebsd, .macos, .ios, .tvos, .watchos, .visionos => extern struct {
+    .freebsd, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => extern struct {
         headers: ?[*]const iovec_const,
         hdr_cnt: c_int,
         trailers: ?[*]const iovec_const,
@@ -10661,15 +10665,17 @@ pub extern "c" fn wait4(pid: pid_t, status: ?*c_int, options: c_int, ru: ?*rusag
 pub const fork = switch (native_os) {
     .dragonfly,
     .freebsd,
-    .ios,
     .linux,
+    .driverkit,
+    .ios,
+    .maccatalyst,
     .macos,
+    .tvos,
+    .visionos,
+    .watchos,
     .netbsd,
     .openbsd,
     .illumos,
-    .tvos,
-    .watchos,
-    .visionos,
     .haiku,
     .serenity,
     => private.fork,
@@ -10813,7 +10819,7 @@ pub extern "c" fn pthread_getspecific(key: pthread_key_t) ?*anyopaque;
 pub extern "c" fn pthread_setspecific(key: pthread_key_t, value: ?*anyopaque) c_int;
 pub extern "c" fn pthread_sigmask(how: c_int, set: *const sigset_t, oldset: *sigset_t) c_int;
 pub const pthread_setname_np = switch (native_os) {
-    .macos, .ios, .tvos, .watchos, .visionos => darwin.pthread_setname_np,
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => darwin.pthread_setname_np,
     .illumos => illumos.pthread_setname_np,
     .netbsd => netbsd.pthread_setname_np,
     else => private.pthread_setname_np,
@@ -10823,7 +10829,7 @@ pub extern "c" fn pthread_getname_np(thread: pthread_t, name: [*:0]u8, len: usiz
 pub extern "c" fn pthread_kill(pthread_t, signal: SIG) c_int;
 
 pub const pthread_threadid_np = switch (native_os) {
-    .macos, .ios, .tvos, .watchos, .visionos => private.pthread_threadid_np,
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => private.pthread_threadid_np,
     else => {},
 };
 
@@ -10831,7 +10837,7 @@ pub const caddr_t = ?[*]u8;
 
 pub const ptrace = switch (native_os) {
     .linux, .serenity => private.ptrace,
-    .macos, .ios, .tvos, .watchos, .visionos => darwin.ptrace,
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => darwin.ptrace,
     .dragonfly => dragonfly.ptrace,
     .freebsd => freebsd.ptrace,
     .netbsd => netbsd.ptrace,
@@ -10850,7 +10856,7 @@ pub extern "c" fn sem_timedwait(sem: *sem_t, abs_timeout: *const timespec) c_int
 pub extern "c" fn sem_getvalue(sem: *sem_t, sval: *c_int) c_int;
 
 pub const shm_open = switch (native_os) {
-    .driverkit, .macos, .ios, .tvos, .watchos, .visionos => darwin.shm_open,
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => darwin.shm_open,
     else => private.shm_open,
 };
 pub extern "c" fn shm_unlink(name: [*:0]const u8) c_int;
lib/std/debug.zig
@@ -1392,6 +1392,7 @@ pub const have_segfault_handling_support = switch (native_os) {
 
     .driverkit,
     .ios,
+    .maccatalyst,
     .macos,
     .tvos,
     .visionos,
@@ -1487,6 +1488,7 @@ fn handleSegfaultPosix(sig: posix.SIG, info: *const posix.siginfo_t, ctx_ptr: ?*
             .freebsd,
             .driverkit,
             .ios,
+            .maccatalyst,
             .macos,
             .tvos,
             .visionos,
lib/std/dynamic_library.zig
@@ -16,7 +16,7 @@ pub const DynLib = struct {
         else
             DlDynLib,
         .windows => WindowsDynLib,
-        .macos, .tvos, .watchos, .ios, .visionos, .freebsd, .netbsd, .openbsd, .dragonfly, .illumos => DlDynLib,
+        .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos, .freebsd, .netbsd, .openbsd, .dragonfly, .illumos => DlDynLib,
         else => struct {
             const open = @compileError("unsupported platform");
             const openZ = @compileError("unsupported platform");
@@ -675,7 +675,7 @@ test "dynamic_library" {
     const libname = switch (native_os) {
         .linux, .freebsd, .openbsd, .illumos => "invalid_so.so",
         .windows => "invalid_dll.dll",
-        .macos, .tvos, .watchos, .ios, .visionos => "invalid_dylib.dylib",
+        .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => "invalid_dylib.dylib",
         else => return error.SkipZigTest,
     };
 
lib/std/fs.zig
@@ -52,7 +52,7 @@ pub const GetAppDataDirError = @import("fs/get_app_data_dir.zig").GetAppDataDirE
 /// * On other platforms, `[]u8` file paths are opaque sequences of bytes with
 ///   no particular encoding.
 pub const max_path_bytes = switch (native_os) {
-    .linux, .macos, .ios, .freebsd, .openbsd, .netbsd, .dragonfly, .haiku, .illumos, .plan9, .emscripten, .wasi, .serenity => posix.PATH_MAX,
+    .linux, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos, .freebsd, .openbsd, .netbsd, .dragonfly, .haiku, .illumos, .plan9, .emscripten, .wasi, .serenity => posix.PATH_MAX,
     // Each WTF-16LE code unit may be expanded to 3 WTF-8 bytes.
     // If it would require 4 WTF-8 bytes, then there would be a surrogate
     // pair in the WTF-16LE, and we (over)account 3 bytes for it that way.
@@ -73,7 +73,7 @@ pub const max_path_bytes = switch (native_os) {
 /// On WASI, file name components are encoded as valid UTF-8.
 /// On other platforms, `[]u8` components are an opaque sequence of bytes with no particular encoding.
 pub const max_name_bytes = switch (native_os) {
-    .linux, .macos, .ios, .freebsd, .openbsd, .netbsd, .dragonfly, .illumos, .serenity => posix.NAME_MAX,
+    .linux, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos, .freebsd, .openbsd, .netbsd, .dragonfly, .illumos, .serenity => posix.NAME_MAX,
     // Haiku's NAME_MAX includes the null terminator, so subtract one.
     .haiku => posix.NAME_MAX - 1,
     // Each WTF-16LE character may be expanded to 3 WTF-8 bytes.
lib/std/heap.zig
@@ -83,7 +83,7 @@ pub fn defaultQueryPageSize() usize {
             @max(std.c.sysconf(@intFromEnum(std.c._SC.PAGESIZE)), 0)
         else
             std.os.linux.getauxval(std.elf.AT_PAGESZ),
-        .driverkit, .ios, .macos, .tvos, .visionos, .watchos => {
+        .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => {
             const task_port = std.c.mach_task_self();
             // mach_task_self may fail "if there are any resource failures or other errors".
             if (task_port == std.c.TASK.NULL) break :size 0;
@@ -155,7 +155,7 @@ const CAllocator = struct {
     else {};
 
     pub const supports_posix_memalign = switch (builtin.os.tag) {
-        .dragonfly, .netbsd, .freebsd, .illumos, .openbsd, .linux, .macos, .ios, .tvos, .watchos, .visionos, .serenity => true,
+        .dragonfly, .netbsd, .freebsd, .illumos, .openbsd, .linux, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos, .serenity => true,
         else => false,
     };
 
@@ -703,7 +703,7 @@ pub fn testAllocatorAlignedShrink(base_allocator: mem.Allocator) !void {
 }
 
 const page_size_min_default: ?usize = switch (builtin.os.tag) {
-    .driverkit, .ios, .macos, .tvos, .visionos, .watchos => switch (builtin.cpu.arch) {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => switch (builtin.cpu.arch) {
         .x86_64 => 4 << 10,
         .aarch64 => 16 << 10,
         else => null,
@@ -862,7 +862,7 @@ const page_size_min_default: ?usize = switch (builtin.os.tag) {
 };
 
 const page_size_max_default: ?usize = switch (builtin.os.tag) {
-    .driverkit, .ios, .macos, .tvos, .visionos, .watchos => switch (builtin.cpu.arch) {
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => switch (builtin.cpu.arch) {
         .x86_64 => 4 << 10,
         .aarch64 => 16 << 10,
         else => null,
lib/std/Io.zig
@@ -564,7 +564,7 @@ pub const Evented = switch (builtin.os.tag) {
         .x86_64, .aarch64 => @import("Io/IoUring.zig"),
         else => void, // context-switching code not implemented yet
     },
-    .dragonfly, .freebsd, .netbsd, .openbsd, .macos, .ios, .tvos, .visionos, .watchos => switch (builtin.cpu.arch) {
+    .dragonfly, .freebsd, .netbsd, .openbsd, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => switch (builtin.cpu.arch) {
         .x86_64, .aarch64 => @import("Io/Kqueue.zig"),
         else => void, // context-switching code not implemented yet
     },
lib/std/os.zig
@@ -74,11 +74,13 @@ pub fn accessW(path: [*:0]const u16) windows.GetFileAttributesError!void {
 pub fn isGetFdPathSupportedOnTarget(os: std.Target.Os) bool {
     return switch (os.tag) {
         .windows,
-        .macos,
+        .driverkit,
         .ios,
-        .watchos,
+        .maccatalyst,
+        .macos,
         .tvos,
         .visionos,
+        .watchos,
         .linux,
         .illumos,
         .freebsd,
@@ -113,7 +115,7 @@ pub fn getFdPath(fd: std.posix.fd_t, out_buffer: *[max_path_bytes]u8) std.posix.
             const end_index = std.unicode.wtf16LeToWtf8(out_buffer, wide_slice);
             return out_buffer[0..end_index];
         },
-        .macos, .ios, .watchos, .tvos, .visionos => {
+        .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => {
             // On macOS, we can use F.GETPATH fcntl command to query the OS for
             // the path to the file descriptor.
             @memset(out_buffer[0..max_path_bytes], 0);
lib/std/posix.zig
@@ -861,7 +861,7 @@ pub fn read(fd: fd_t, buf: []u8) ReadError!usize {
     // Prevents EINVAL.
     const max_count = switch (native_os) {
         .linux => 0x7ffff000,
-        .macos, .ios, .watchos, .tvos, .visionos => maxInt(i32),
+        .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => maxInt(i32),
         else => maxInt(isize),
     };
     while (true) {
@@ -1002,7 +1002,7 @@ pub fn pread(fd: fd_t, buf: []u8, offset: u64) PReadError!usize {
     // Prevent EINVAL.
     const max_count = switch (native_os) {
         .linux => 0x7ffff000,
-        .macos, .ios, .watchos, .tvos, .visionos => maxInt(i32),
+        .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => maxInt(i32),
         else => maxInt(isize),
     };
 
@@ -1115,7 +1115,7 @@ pub fn ftruncate(fd: fd_t, length: u64) TruncateError!void {
 /// On these systems, the read races with concurrent writes to the same file descriptor.
 pub fn preadv(fd: fd_t, iov: []const iovec, offset: u64) PReadError!usize {
     const have_pread_but_not_preadv = switch (native_os) {
-        .windows, .macos, .ios, .watchos, .tvos, .visionos, .haiku => true,
+        .windows, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos, .haiku => true,
         else => false,
     };
     if (have_pread_but_not_preadv) {
@@ -1269,7 +1269,7 @@ pub fn write(fd: fd_t, bytes: []const u8) WriteError!usize {
 
     const max_count = switch (native_os) {
         .linux => 0x7ffff000,
-        .macos, .ios, .watchos, .tvos, .visionos => maxInt(i32),
+        .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => maxInt(i32),
         else => maxInt(isize),
     };
     while (true) {
@@ -1433,7 +1433,7 @@ pub fn pwrite(fd: fd_t, bytes: []const u8, offset: u64) PWriteError!usize {
     // Prevent EINVAL.
     const max_count = switch (native_os) {
         .linux => 0x7ffff000,
-        .macos, .ios, .watchos, .tvos, .visionos => maxInt(i32),
+        .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => maxInt(i32),
         else => maxInt(isize),
     };
 
@@ -1487,7 +1487,7 @@ pub fn pwrite(fd: fd_t, bytes: []const u8, offset: u64) PWriteError!usize {
 /// If `iov.len` is larger than `IOV_MAX`, a partial write will occur.
 pub fn pwritev(fd: fd_t, iov: []const iovec_const, offset: u64) PWriteError!usize {
     const have_pwrite_but_not_pwritev = switch (native_os) {
-        .windows, .macos, .ios, .watchos, .tvos, .visionos, .haiku => true,
+        .windows, .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos, .haiku => true,
         else => false,
     };
 
@@ -1747,7 +1747,7 @@ pub fn execveZ(
         .NOTDIR => return error.NotDir,
         .TXTBSY => return error.FileBusy,
         else => |err| switch (native_os) {
-            .macos, .ios, .tvos, .watchos, .visionos => switch (err) {
+            .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => switch (err) {
                 .BADEXEC => return error.InvalidExe,
                 .BADARCH => return error.InvalidExe,
                 else => return unexpectedErrno(err),
@@ -6570,7 +6570,7 @@ pub fn ptrace(request: u32, pid: pid_t, addr: usize, data: usize) PtraceError!vo
             else => |err| return unexpectedErrno(err),
         },
 
-        .macos, .ios, .tvos, .watchos, .visionos => switch (errno(std.c.ptrace(
+        .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => switch (errno(std.c.ptrace(
             @enumFromInt(request),
             pid,
             @ptrFromInt(addr),
lib/std/process.zig
@@ -1530,11 +1530,13 @@ pub const UserInfo = struct {
 pub fn getUserInfo(name: []const u8) !UserInfo {
     return switch (native_os) {
         .linux,
+        .driverkit,
+        .ios,
+        .maccatalyst,
         .macos,
-        .watchos,
-        .visionos,
         .tvos,
-        .ios,
+        .visionos,
+        .watchos,
         .freebsd,
         .netbsd,
         .openbsd,
@@ -1666,7 +1668,7 @@ pub fn getBaseAddress() usize {
                 else => {},
             } else unreachable;
         },
-        .driverkit, .ios, .macos, .tvos, .visionos, .watchos => {
+        .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => {
             return @intFromPtr(&std.c._mh_execute_header);
         },
         .windows => return @intFromPtr(windows.kernel32.GetModuleHandleW(null)),
@@ -1682,7 +1684,7 @@ pub const can_execv = switch (native_os) {
 
 /// Tells whether spawning child processes is supported (e.g. via Child)
 pub const can_spawn = switch (native_os) {
-    .wasi, .watchos, .tvos, .visionos => false,
+    .wasi, .ios, .tvos, .visionos, .watchos => false,
     else => true,
 };
 
@@ -1770,7 +1772,7 @@ pub fn totalSystemMemory() TotalSystemMemoryError!u64 {
             return @as(u64, @intCast(physmem));
         },
         // whole Darwin family
-        .driverkit, .ios, .macos, .tvos, .visionos, .watchos => {
+        .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => {
             // "hw.memsize" returns uint64_t
             var physmem: u64 = undefined;
             var len: usize = @sizeOf(u64);
lib/std/Progress.zig
@@ -1549,11 +1549,13 @@ const have_sigwinch = switch (builtin.os.tag) {
     .netbsd,
     .openbsd,
     .haiku,
-    .macos,
+    .driverkit,
     .ios,
-    .watchos,
+    .maccatalyst,
+    .macos,
     .tvos,
     .visionos,
+    .watchos,
     .dragonfly,
     .freebsd,
     .serenity,
lib/std/Target.zig
@@ -39,6 +39,7 @@ pub const Os = struct {
 
         driverkit,
         ios,
+        maccatalyst,
         macos,
         tvos,
         visionos,
@@ -78,6 +79,7 @@ pub const Os = struct {
             return switch (tag) {
                 .driverkit,
                 .ios,
+                .maccatalyst,
                 .macos,
                 .tvos,
                 .visionos,
@@ -121,6 +123,7 @@ pub const Os = struct {
                 .windows, .uefi => ".dll",
                 .driverkit,
                 .ios,
+                .maccatalyst,
                 .macos,
                 .tvos,
                 .visionos,
@@ -180,8 +183,9 @@ pub const Os = struct {
                 .openbsd,
 
                 .driverkit,
-                .macos,
                 .ios,
+                .maccatalyst,
+                .macos,
                 .tvos,
                 .visionos,
                 .watchos,
@@ -546,7 +550,7 @@ pub const Os = struct {
                         .max = .{ .major = 15, .minor = 6, .patch = 0 },
                     },
                 },
-                .ios => .{
+                .ios, .maccatalyst => .{
                     .semver = .{
                         .min = .{ .major = 15, .minor = 0, .patch = 0 },
                         .max = .{ .major = 18, .minor = 6, .patch = 0 },
@@ -759,7 +763,6 @@ pub const Abi = enum {
     msvc,
     itanium,
     simulator,
-    macabi,
     ohos,
     ohoseabi,
 
@@ -885,8 +888,6 @@ pub const Abi = enum {
                 => .eabihf,
                 else => .none,
             },
-            .ios => if (arch == .x86_64) .macabi else .none,
-            .tvos, .visionos, .watchos => if (arch == .x86_64) .simulator else .none,
             .windows => .gnu,
             .uefi => .msvc,
             .@"3ds" => .eabihf,
@@ -902,7 +903,12 @@ pub const Abi = enum {
             .serenity,
             .dragonfly,
             .driverkit,
+            .ios,
+            .maccatalyst,
             .macos,
+            .tvos,
+            .visionos,
+            .watchos,
             .ps3,
             .ps4,
             .ps5,
@@ -1018,7 +1024,7 @@ pub const ObjectFormat = enum {
 
     pub fn default(os_tag: Os.Tag, arch: Cpu.Arch) ObjectFormat {
         return switch (os_tag) {
-            .driverkit, .ios, .macos, .tvos, .visionos, .watchos => .macho,
+            .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => .macho,
             .plan9 => .plan9,
             .uefi, .windows => .coff,
             else => switch (arch) {
@@ -1988,7 +1994,7 @@ pub const Cpu = struct {
                 },
                 .armeb, .thumbeb => &arm.cpu.baseline,
                 .aarch64 => switch (os.tag) {
-                    .driverkit, .macos => &aarch64.cpu.apple_m1,
+                    .driverkit, .maccatalyst, .macos => &aarch64.cpu.apple_m1,
                     .ios, .tvos => &aarch64.cpu.apple_a7,
                     .visionos => &aarch64.cpu.apple_m2,
                     .watchos => &aarch64.cpu.apple_s4,
@@ -2014,8 +2020,8 @@ pub const Cpu = struct {
                 .sparc => &sparc.cpu.v9, // glibc does not work with 'plain' v8.
                 .x86 => &x86.cpu.pentium4,
                 .x86_64 => switch (os.tag) {
-                    .driverkit => &x86.cpu.nehalem,
-                    .ios, .macos, .tvos, .visionos, .watchos => &x86.cpu.core2,
+                    .driverkit, .maccatalyst => &x86.cpu.nehalem,
+                    .macos => &x86.cpu.core2,
                     .ps4 => &x86.cpu.btver2,
                     .ps5 => &x86.cpu.znver2,
                     else => generic(arch),
@@ -2112,7 +2118,7 @@ pub inline fn isMuslLibC(target: *const Target) bool {
 
 pub inline fn isDarwinLibC(target: *const Target) bool {
     return switch (target.abi) {
-        .none, .macabi, .simulator => target.os.tag.isDarwin(),
+        .none, .simulator => target.os.tag.isDarwin(),
         else => false,
     };
 }
@@ -2141,8 +2147,9 @@ pub fn requiresLibC(target: *const Target) bool {
     return switch (target.os.tag) {
         .illumos,
         .driverkit,
-        .macos,
         .ios,
+        .maccatalyst,
+        .macos,
         .tvos,
         .watchos,
         .visionos,
@@ -2307,6 +2314,7 @@ pub const DynamicLinker = struct {
 
             .driverkit,
             .ios,
+            .maccatalyst,
             .macos,
             .tvos,
             .visionos,
@@ -2722,6 +2730,7 @@ pub const DynamicLinker = struct {
 
             .driverkit,
             .ios,
+            .maccatalyst,
             .macos,
             .tvos,
             .visionos,
@@ -3234,6 +3243,7 @@ pub fn cTypeBitSize(target: *const Target, c_type: CType) u16 {
 
         .driverkit,
         .ios,
+        .maccatalyst,
         .macos,
         .tvos,
         .visionos,
lib/std/Thread.zig
@@ -156,7 +156,7 @@ impl: Impl,
 pub const max_name_len = switch (native_os) {
     .linux => 15,
     .windows => 31,
-    .macos, .ios, .watchos, .tvos, .visionos => 63,
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => 63,
     .netbsd => 31,
     .freebsd => 15,
     .openbsd => 23,
@@ -234,7 +234,7 @@ pub fn setName(self: Thread, name: []const u8) SetNameError!void {
                 else => |err| return windows.unexpectedStatus(err),
             }
         },
-        .macos, .ios, .watchos, .tvos, .visionos => if (use_pthreads) {
+        .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => if (use_pthreads) {
             // There doesn't seem to be a way to set the name for an arbitrary thread, only the current one.
             if (self.getHandle() != std.c.pthread_self()) return error.Unsupported;
 
@@ -351,7 +351,7 @@ pub fn getName(self: Thread, buffer_ptr: *[max_name_len:0]u8) GetNameError!?[]co
                 else => |err| return windows.unexpectedStatus(err),
             }
         },
-        .macos, .ios, .watchos, .tvos, .visionos => if (use_pthreads) {
+        .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => if (use_pthreads) {
             const err = std.c.pthread_getname_np(self.getHandle(), buffer.ptr, max_name_len + 1);
             switch (@as(posix.E, @enumFromInt(err))) {
                 .SUCCESS => return std.mem.sliceTo(buffer, 0),
@@ -411,7 +411,7 @@ pub const Id = switch (native_os) {
     .wasi,
     .serenity,
     => u32,
-    .macos, .ios, .watchos, .tvos, .visionos => u64,
+    .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => u64,
     .windows => windows.DWORD,
     else => usize,
 };
@@ -741,7 +741,7 @@ const PosixThreadImpl = struct {
             .linux => {
                 return LinuxThreadImpl.getCurrentId();
             },
-            .macos, .ios, .watchos, .tvos, .visionos => {
+            .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => {
                 var thread_id: u64 = undefined;
                 // Pass thread=null to get the current thread ID.
                 assert(c.pthread_threadid_np(null, &thread_id) == 0);
@@ -1734,7 +1734,7 @@ test "setName, getName" {
     context.test_done_event.wait();
 
     switch (native_os) {
-        .macos, .ios, .watchos, .tvos, .visionos => {
+        .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => {
             const res = thread.setName("foobar");
             try std.testing.expectError(error.Unsupported, res);
         },
lib/std/time.zig
@@ -76,7 +76,7 @@ pub const Instant = struct {
             },
             // On darwin, use UPTIME_RAW instead of MONOTONIC as it ticks while
             // suspended.
-            .macos, .ios, .tvos, .watchos, .visionos => posix.CLOCK.UPTIME_RAW,
+            .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => posix.CLOCK.UPTIME_RAW,
             // On freebsd derivatives, use MONOTONIC_FAST as currently there's
             // no precision tradeoff.
             .freebsd, .dragonfly => posix.CLOCK.MONOTONIC_FAST,
src/codegen/llvm.zig
@@ -183,6 +183,7 @@ pub fn targetTriple(allocator: Allocator, target: *const std.Target) ![]const u8
     try llvm_triple.appendSlice(switch (target.os.tag) {
         .driverkit,
         .ios,
+        .maccatalyst,
         .macos,
         .tvos,
         .visionos,
@@ -204,7 +205,6 @@ pub fn targetTriple(allocator: Allocator, target: *const std.Target) ![]const u8
     try llvm_triple.append('-');
 
     const llvm_os = switch (target.os.tag) {
-        .freestanding => "unknown",
         .dragonfly => "dragonfly",
         .freebsd => "freebsd",
         .fuchsia => "fuchsia",
@@ -218,11 +218,9 @@ pub fn targetTriple(allocator: Allocator, target: *const std.Target) ![]const u8
         .cuda => "cuda",
         .nvcl => "nvcl",
         .amdhsa => "amdhsa",
-        .opencl => "unknown", // https://llvm.org/docs/SPIRVUsage.html#target-triples
         .ps3 => "lv2",
         .ps4 => "ps4",
         .ps5 => "ps5",
-        .vita => "unknown", // LLVM doesn't know about this target
         .mesa3d => "mesa3d",
         .amdpal => "amdpal",
         .hermit => "hermit",
@@ -230,7 +228,7 @@ pub fn targetTriple(allocator: Allocator, target: *const std.Target) ![]const u8
         .wasi => "wasi",
         .emscripten => "emscripten",
         .macos => "macosx",
-        .ios => "ios",
+        .ios, .maccatalyst => "ios",
         .tvos => "tvos",
         .watchos => "watchos",
         .driverkit => "driverkit",
@@ -240,10 +238,13 @@ pub fn targetTriple(allocator: Allocator, target: *const std.Target) ![]const u8
         .managarm => "managarm",
 
         .@"3ds",
-        .opengl,
-        .plan9,
         .contiki,
+        .freestanding,
+        .opencl, // https://llvm.org/docs/SPIRVUsage.html#target-triples
+        .opengl,
         .other,
+        .plan9,
+        .vita,
         => "unknown",
     };
     try llvm_triple.appendSlice(llvm_os);
@@ -266,7 +267,7 @@ pub fn targetTriple(allocator: Allocator, target: *const std.Target) ![]const u8
     try llvm_triple.append('-');
 
     const llvm_abi = switch (target.abi) {
-        .none, .ilp32 => "unknown",
+        .none => if (target.os.tag == .maccatalyst) "macabi" else "unknown",
         .gnu => "gnu",
         .gnuabin32 => "gnuabin32",
         .gnuabi64 => "gnuabi64",
@@ -275,6 +276,7 @@ pub fn targetTriple(allocator: Allocator, target: *const std.Target) ![]const u8
         .gnuf32 => "gnuf32",
         .gnusf => "gnusf",
         .gnux32 => "gnux32",
+        .ilp32 => "unknown",
         .code16 => "code16",
         .eabi => "eabi",
         .eabihf => "eabihf",
@@ -296,7 +298,6 @@ pub fn targetTriple(allocator: Allocator, target: *const std.Target) ![]const u8
         .msvc => "msvc",
         .itanium => "itanium",
         .simulator => "simulator",
-        .macabi => "macabi",
         .ohos, .ohoseabi => "ohos",
     };
     try llvm_triple.appendSlice(llvm_abi);
@@ -12595,7 +12596,7 @@ fn ccAbiPromoteInt(cc: std.builtin.CallingConvention, zcu: *Zcu, ty: Type) ?std.
         else => return null,
     };
     return switch (target.os.tag) {
-        .macos, .ios, .watchos, .tvos, .visionos => switch (int_info.bits) {
+        .driverkit, .ios, .maccatalyst, .macos, .watchos, .tvos, .visionos => switch (int_info.bits) {
             0...16 => int_info.signedness,
             else => null,
         },
src/Compilation/Config.zig
@@ -369,7 +369,7 @@ pub fn resolve(options: Options) ResolveError!Config {
 
         // load_dynamic_library standalone test not passing on this combination
         // https://github.com/ziglang/zig/issues/24080
-        if (target.os.tag == .macos and is_dyn_lib) break :b true;
+        if (target.os.tag.isDarwin() and is_dyn_lib) break :b true;
 
         // At this point we would prefer to use our own self-hosted backend,
         // because the compilation speed is better than LLVM. But only do it if
src/libs/libtsan.zig
@@ -30,7 +30,7 @@ pub fn buildTsan(comp: *Compilation, prog_node: std.Progress.Node) BuildError!vo
     const root_name = switch (target.os.tag) {
         // On Apple platforms, we use the same name as LLVM because the
         // TSAN library implementation hard-codes a check for these names.
-        .driverkit, .macos => "clang_rt.tsan_osx_dynamic",
+        .driverkit, .maccatalyst, .macos => "clang_rt.tsan_osx_dynamic",
         .ios => if (target.abi == .simulator) "clang_rt.tsan_iossim_dynamic" else "clang_rt.tsan_ios_dynamic",
         .tvos => if (target.abi == .simulator) "clang_rt.tsan_tvossim_dynamic" else "clang_rt.tsan_tvos_dynamic",
         .visionos => if (target.abi == .simulator) "clang_rt.tsan_xrossim_dynamic" else "clang_rt.tsan_xros_dynamic",
@@ -134,7 +134,7 @@ pub fn buildTsan(comp: *Compilation, prog_node: std.Progress.Node) BuildError!vo
     }
 
     const platform_tsan_sources = switch (target.os.tag) {
-        .ios, .macos, .watchos, .tvos, .visionos => &darwin_tsan_sources,
+        .driverkit, .ios, .maccatalyst, .macos, .watchos, .tvos, .visionos => &darwin_tsan_sources,
         .windows => &windows_tsan_sources,
         else => &unix_tsan_sources,
     };
src/link/MachO/load_commands.zig
@@ -281,7 +281,7 @@ pub fn writeRpathLC(rpath: []const u8, writer: *Writer) !void {
 pub fn writeVersionMinLC(platform: MachO.Platform, sdk_version: ?std.SemanticVersion, writer: *Writer) !void {
     const cmd: macho.LC = switch (platform.os_tag) {
         .macos => .VERSION_MIN_MACOSX,
-        .ios => .VERSION_MIN_IPHONEOS,
+        .ios, .maccatalyst => .VERSION_MIN_IPHONEOS,
         .tvos => .VERSION_MIN_TVOS,
         .watchos => .VERSION_MIN_WATCHOS,
         else => unreachable,
src/link/MachO.zig
@@ -3596,7 +3596,7 @@ pub fn requiresCodeSig(self: MachO) bool {
     const target = self.getTarget();
     return switch (target.cpu.arch) {
         .aarch64 => switch (target.os.tag) {
-            .driverkit, .macos => true,
+            .driverkit, .maccatalyst, .macos => true,
             .ios, .tvos, .visionos, .watchos => target.abi == .simulator,
             else => false,
         },
@@ -4032,7 +4032,7 @@ fn formatSectType(tt: u8, w: *Writer) Writer.Error!void {
 }
 
 const is_hot_update_compatible = switch (builtin.target.os.tag) {
-    .macos => true,
+    .maccatalyst, .macos => true,
     else => false,
 };
 
@@ -4174,7 +4174,7 @@ pub const Platform = struct {
                     .os_tag = switch (cmd.platform) {
                         .DRIVERKIT => .driverkit,
                         .IOS, .IOSSIMULATOR => .ios,
-                        .MACCATALYST => .ios,
+                        .MACCATALYST => .maccatalyst,
                         .MACOS => .macos,
                         .TVOS, .TVOSSIMULATOR => .tvos,
                         .VISIONOS, .VISIONOSSIMULATOR => .visionos,
@@ -4182,7 +4182,6 @@ pub const Platform = struct {
                         else => @panic("TODO"),
                     },
                     .abi = switch (cmd.platform) {
-                        .MACCATALYST => .macabi,
                         .IOSSIMULATOR,
                         .TVOSSIMULATOR,
                         .VISIONOSSIMULATOR,
@@ -4198,6 +4197,7 @@ pub const Platform = struct {
             .VERSION_MIN_TVOS,
             .VERSION_MIN_WATCHOS,
             => {
+                // We can't distinguish Mac Catalyst here, but this is legacy stuff anyway.
                 const cmd = lc.cast(macho.version_min_command).?;
                 return .{
                     .os_tag = switch (lc.cmd()) {
@@ -4230,11 +4230,8 @@ pub const Platform = struct {
     pub fn toApplePlatform(plat: Platform) macho.PLATFORM {
         return switch (plat.os_tag) {
             .driverkit => .DRIVERKIT,
-            .ios => switch (plat.abi) {
-                .macabi => .MACCATALYST,
-                .simulator => .IOSSIMULATOR,
-                else => .IOS,
-            },
+            .ios => if (plat.abi == .simulator) .IOSSIMULATOR else .IOS,
+            .maccatalyst => .MACCATALYST,
             .macos => .MACOS,
             .tvos => if (plat.abi == .simulator) .TVOSSIMULATOR else .TVOS,
             .visionos => if (plat.abi == .simulator) .VISIONOSSIMULATOR else .VISIONOS,
@@ -4300,17 +4297,17 @@ const SupportedPlatforms = struct {
 // Source: https://github.com/apple-oss-distributions/ld64/blob/59a99ab60399c5e6c49e6945a9e1049c42b71135/src/ld/PlatformSupport.cpp#L52
 // zig fmt: off
 const supported_platforms = [_]SupportedPlatforms{
-    .{ .driverkit, .none,      0x130000, 0x130000 },
-    .{ .ios,       .none,      0x0C0000, 0x070000 },
-    .{ .ios,       .macabi,    0x0D0000, 0x0D0000 },
-    .{ .ios,       .simulator, 0x0D0000, 0x080000 },
-    .{ .macos,     .none,      0x0A0E00, 0x0A0800 },
-    .{ .tvos,      .none,      0x0C0000, 0x070000 },
-    .{ .tvos,      .simulator, 0x0D0000, 0x080000 },
-    .{ .visionos,  .none,      0x010000, 0x010000 },
-    .{ .visionos,  .simulator, 0x010000, 0x010000 },
-    .{ .watchos,   .none,      0x050000, 0x020000 },
-    .{ .watchos,   .simulator, 0x060000, 0x020000 },
+    .{ .driverkit,   .none,      0x130000, 0x130000 },
+    .{ .ios,         .none,      0x0C0000, 0x070000 },
+    .{ .ios,         .simulator, 0x0D0000, 0x080000 },
+    .{ .maccatalyst, .none,      0x0D0000, 0x0D0000 },
+    .{ .macos,       .none,      0x0A0E00, 0x0A0800 },
+    .{ .tvos,        .none,      0x0C0000, 0x070000 },
+    .{ .tvos,        .simulator, 0x0D0000, 0x080000 },
+    .{ .visionos,    .none,      0x010000, 0x010000 },
+    .{ .visionos,    .simulator, 0x010000, 0x010000 },
+    .{ .watchos,     .none,      0x050000, 0x020000 },
+    .{ .watchos,     .simulator, 0x060000, 0x020000 },
 };
 // zig fmt: on
 
src/Zcu/PerThread.zig
@@ -189,7 +189,7 @@ pub fn updateFile(
                 // disambiguates by returning EEXIST, indicating original
                 // failure was a race, or ENOENT, indicating deletion of the
                 // directory of our open handle.
-                if (builtin.os.tag != .macos) {
+                if (!builtin.os.tag.isDarwin()) {
                     std.process.fatal("cache directory '{f}' unexpectedly removed during compiler execution", .{
                         cache_directory,
                     });
src/Compilation.zig
@@ -6761,12 +6761,15 @@ fn addCommonCCArgs(
     }
 
     switch (target.os.tag) {
-        .ios, .macos, .tvos, .watchos => |os| if (is_clang) {
+        .ios, .maccatalyst, .macos, .tvos, .watchos => |os| if (is_clang) {
             try argv.ensureUnusedCapacity(2);
             // Pass the proper -m<os>-version-min argument for darwin.
             const ver = target.os.version_range.semver.min;
             argv.appendAssumeCapacity(try std.fmt.allocPrint(arena, "-m{s}{s}-version-min={d}.{d}.{d}", .{
-                @tagName(os),
+                switch (os) {
+                    .maccatalyst => "ios",
+                    else => @tagName(os),
+                },
                 switch (target.abi) {
                     .simulator => "-simulator",
                     else => "",
src/link.zig
@@ -620,7 +620,7 @@ pub const File = struct {
                             .linux => std.posix.ptrace(std.os.linux.PTRACE.ATTACH, pid, 0, 0) catch |err| {
                                 log.warn("ptrace failure: {s}", .{@errorName(err)});
                             },
-                            .macos => {
+                            .maccatalyst, .macos => {
                                 const macho_file = base.cast(.macho).?;
                                 macho_file.ptraceAttach(pid) catch |err| {
                                     log.warn("attaching failed with error: {s}", .{@errorName(err)});
@@ -700,7 +700,7 @@ pub const File = struct {
 
                 if (base.child_pid) |pid| {
                     switch (builtin.os.tag) {
-                        .macos => {
+                        .maccatalyst, .macos => {
                             const macho_file = base.cast(.macho).?;
                             macho_file.ptraceDetach(pid) catch |err| {
                                 log.warn("detaching failed with error: {s}", .{@errorName(err)});
src/main.zig
@@ -4487,7 +4487,7 @@ fn runOrTestHotSwap(
     }
 
     switch (builtin.target.os.tag) {
-        .macos, .ios, .tvos, .watchos, .visionos => {
+        .macos => {
             const PosixSpawn = @import("DarwinPosixSpawn.zig");
 
             var attr = try PosixSpawn.Attr.init();
src/target.zig
@@ -29,6 +29,7 @@ pub fn libCNeedsLibUnwind(target: *const std.Target, link_mode: std.builtin.Link
 
 pub fn libCxxNeedsLibUnwind(target: *const std.Target) bool {
     return switch (target.os.tag) {
+        .maccatalyst,
         .macos,
         .ios,
         .watchos,
test/behavior/basic.zig
@@ -1398,7 +1398,7 @@ test "allocation and looping over 3-byte integer" {
     if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
     if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
 
-    if (builtin.zig_backend == .stage2_llvm and builtin.os.tag == .macos) {
+    if (builtin.zig_backend == .stage2_llvm and builtin.os.tag.isDarwin()) {
         return error.SkipZigTest; // TODO
     }
     if (builtin.cpu.arch == .s390x and builtin.zig_backend == .stage2_llvm) return error.SkipZigTest; // TODO
test/behavior/threadlocal.zig
@@ -9,7 +9,7 @@ test "thread local variable" {
     if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
     if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; // TODO
 
-    if (builtin.zig_backend == .stage2_x86_64 and builtin.os.tag == .macos) {
+    if (builtin.zig_backend == .stage2_x86_64 and builtin.os.tag.isDarwin()) {
         // Fails due to register hazards.
         return error.SkipZigTest;
     }
test/behavior/var_args.zig
@@ -97,7 +97,7 @@ test "simple variadic function" {
     if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
     if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
     if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
-    if (builtin.zig_backend == .stage2_llvm and builtin.os.tag != .macos and builtin.cpu.arch.isAARCH64()) {
+    if (builtin.zig_backend == .stage2_llvm and !builtin.os.tag.isDarwin() and builtin.cpu.arch.isAARCH64()) {
         // https://github.com/ziglang/zig/issues/14096
         return error.SkipZigTest;
     }
@@ -159,7 +159,7 @@ test "coerce reference to var arg" {
     if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
     if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
     if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
-    if (builtin.zig_backend == .stage2_llvm and builtin.os.tag != .macos and builtin.cpu.arch.isAARCH64()) {
+    if (builtin.zig_backend == .stage2_llvm and !builtin.os.tag.isDarwin() and builtin.cpu.arch.isAARCH64()) {
         // https://github.com/ziglang/zig/issues/14096
         return error.SkipZigTest;
     }
@@ -191,7 +191,7 @@ test "variadic functions" {
     if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
     if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
     if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
-    if (builtin.zig_backend == .stage2_llvm and builtin.os.tag != .macos and builtin.cpu.arch.isAARCH64()) {
+    if (builtin.zig_backend == .stage2_llvm and !builtin.os.tag.isDarwin() and builtin.cpu.arch.isAARCH64()) {
         // https://github.com/ziglang/zig/issues/14096
         return error.SkipZigTest;
     }
@@ -244,7 +244,7 @@ test "copy VaList" {
     if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
     if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
     if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
-    if (builtin.zig_backend == .stage2_llvm and builtin.os.tag != .macos and builtin.cpu.arch.isAARCH64()) {
+    if (builtin.zig_backend == .stage2_llvm and !builtin.os.tag.isDarwin() and builtin.cpu.arch.isAARCH64()) {
         // https://github.com/ziglang/zig/issues/14096
         return error.SkipZigTest;
     }
@@ -279,7 +279,7 @@ test "unused VaList arg" {
     if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
     if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
     if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
-    if (builtin.zig_backend == .stage2_llvm and builtin.os.tag != .macos and builtin.cpu.arch.isAARCH64()) {
+    if (builtin.zig_backend == .stage2_llvm and !builtin.os.tag.isDarwin() and builtin.cpu.arch.isAARCH64()) {
         // https://github.com/ziglang/zig/issues/14096
         return error.SkipZigTest;
     }
test/c_abi/main.zig
@@ -1157,7 +1157,7 @@ test "big simd vector" {
     if (builtin.cpu.arch.isMIPS64() and builtin.mode != .Debug) return error.SkipZigTest;
     if (builtin.cpu.arch.isPowerPC64()) return error.SkipZigTest;
     if (builtin.cpu.arch.isLoongArch()) return error.SkipZigTest;
-    if (builtin.zig_backend == .stage2_llvm and builtin.cpu.arch == .x86_64 and builtin.os.tag == .macos and builtin.mode != .Debug) return error.SkipZigTest;
+    if (builtin.zig_backend == .stage2_llvm and builtin.cpu.arch == .x86_64 and builtin.os.tag.isDarwin() and builtin.mode != .Debug) return error.SkipZigTest;
 
     c_big_vec(.{ 1, 2, 3, 4, 5, 6, 7, 8 });
 
test/llvm_targets.zig
@@ -9,7 +9,6 @@ const targets = [_]std.Target.Query{
     .{ .cpu_arch = .aarch64, .os_tag = .haiku, .abi = .none },
     .{ .cpu_arch = .aarch64, .os_tag = .hermit, .abi = .none },
     .{ .cpu_arch = .aarch64, .os_tag = .hurd, .abi = .gnu },
-    .{ .cpu_arch = .aarch64, .os_tag = .ios, .abi = .macabi },
     .{ .cpu_arch = .aarch64, .os_tag = .ios, .abi = .none },
     .{ .cpu_arch = .aarch64, .os_tag = .ios, .abi = .simulator },
     .{ .cpu_arch = .aarch64, .os_tag = .linux, .abi = .android },
@@ -17,6 +16,7 @@ const targets = [_]std.Target.Query{
     .{ .cpu_arch = .aarch64, .os_tag = .linux, .abi = .musl },
     .{ .cpu_arch = .aarch64, .os_tag = .linux, .abi = .none },
     .{ .cpu_arch = .aarch64, .os_tag = .linux, .abi = .ohos },
+    .{ .cpu_arch = .aarch64, .os_tag = .maccatalyst, .abi = .none },
     .{ .cpu_arch = .aarch64, .os_tag = .macos, .abi = .none },
     .{ .cpu_arch = .aarch64, .os_tag = .netbsd, .abi = .none },
     .{ .cpu_arch = .aarch64, .os_tag = .openbsd, .abi = .none },
@@ -326,6 +326,7 @@ const targets = [_]std.Target.Query{
     .{ .cpu_arch = .x86_64, .os_tag = .linux, .abi = .muslx32 },
     .{ .cpu_arch = .x86_64, .os_tag = .linux, .abi = .none },
     .{ .cpu_arch = .x86_64, .os_tag = .linux, .abi = .ohos },
+    .{ .cpu_arch = .x86_64, .os_tag = .maccatalyst, .abi = .none },
     .{ .cpu_arch = .x86_64, .os_tag = .macos, .abi = .none },
     .{ .cpu_arch = .x86_64, .os_tag = .netbsd, .abi = .none },
     .{ .cpu_arch = .x86_64, .os_tag = .openbsd, .abi = .none },