diff --git a/lib/std/os.zig b/lib/std/os.zig index 49e88bf9c7..24d78bec9a 100644 --- a/lib/std/os.zig +++ b/lib/std/os.zig @@ -2764,6 +2764,7 @@ pub const SysCtlError = error{ PermissionDenied, SystemResources, NameTooLong, + UnknownName, } || UnexpectedError; pub fn sysctl( @@ -2779,6 +2780,7 @@ pub fn sysctl( EFAULT => unreachable, EPERM => return error.PermissionDenied, ENOMEM => return error.SystemResources, + ENOENT => return error.UnknownName, else => |err| return unexpectedErrno(err), } } @@ -2795,6 +2797,7 @@ pub fn sysctlbynameC( EFAULT => unreachable, EPERM => return error.PermissionDenied, ENOMEM => return error.SystemResources, + ENOENT => return error.UnknownName, else => |err| return unexpectedErrno(err), } } diff --git a/lib/std/zig/system.zig b/lib/std/zig/system.zig index aa8def32a9..234c1a6550 100644 --- a/lib/std/zig/system.zig +++ b/lib/std/zig/system.zig @@ -224,7 +224,31 @@ pub const NativeTargetInfo = struct { // TODO Detect native operating system version. }, .macosx => { - // TODO Detect native operating system version. + var product_version: [32]u8 = undefined; + var size: usize = @sizeOf(@TypeOf(product_version)); + + // The osproductversion sysctl was introduced first with + // High Sierra, thankfully that's also the baseline that Zig + // supports + std.os.sysctlbynameC( + "kern.osproductversion", + &product_version[0], + &size, + null, + 0, + ) catch |err| switch (err) { + error.UnknownName => unreachable, + else => unreachable, + }; + + if (std.builtin.Version.parse(product_version[0..size])) |ver| { + os.version_range.semver.min = ver; + os.version_range.semver.max = ver; + } else |err| switch (err) { + error.Overflow => {}, + error.InvalidCharacter => {}, + error.InvalidVersion => {}, + } }, .freebsd => { // TODO Detect native operating system version.