zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit c903b760106ff9db5b3de74fa0c4034eddbd9cbf (tree)
parent 3c7f030a60b038045334788837f40bee0226109c
Author: Andrew Kelley <andrew@ziglang.org>
Date:   Sat, 29 Feb 2020 20:39:29 -0500

Merge pull request #4589 from LemonBoy/fix-4583

target: Implement OS version detection for OSX
Diffstat:
Mlib/std/os.zig | 3+++
Mlib/std/thread.zig | 2+-
Mlib/std/zig/system.zig | 26+++++++++++++++++++++++++-
3 files changed, 29 insertions(+), 2 deletions(-)

diff --git 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/thread.zig b/lib/std/thread.zig @@ -382,7 +382,7 @@ pub const Thread = struct { var count_len: usize = @sizeOf(c_int); const name = if (comptime std.Target.current.isDarwin()) "hw.logicalcpu" else "hw.ncpu"; os.sysctlbynameC(name, &count, &count_len, null, 0) catch |err| switch (err) { - error.NameTooLong => unreachable, + error.NameTooLong, error.UnknownName => unreachable, else => |e| return e, }; return @intCast(usize, count); diff --git 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 = product_version.len; + + // 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.