From 84549b39550014ca85d34c93381cadbd93080a0e Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Sat, 29 Feb 2020 21:46:07 +0100 Subject: target: Implement OS version detection for OSX Closes #4583 --- lib/std/os.zig | 3 +++ lib/std/zig/system.zig | 26 +++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) (limited to 'lib') 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. -- cgit v1.2.3 From 3b29a72b3b59803307e9040a6832e579901211f3 Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Sat, 29 Feb 2020 23:08:57 +0100 Subject: Use .len instead of @sizeOf --- lib/std/zig/system.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/std/zig/system.zig b/lib/std/zig/system.zig index 234c1a6550..7e23410fa8 100644 --- a/lib/std/zig/system.zig +++ b/lib/std/zig/system.zig @@ -225,7 +225,7 @@ pub const NativeTargetInfo = struct { }, .macosx => { var product_version: [32]u8 = undefined; - var size: usize = @sizeOf(@TypeOf(product_version)); + var size: usize = product_version.len; // The osproductversion sysctl was introduced first with // High Sierra, thankfully that's also the baseline that Zig -- cgit v1.2.3 From 845af5c55208753dc355fad734a8c4893338f8f6 Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Sat, 29 Feb 2020 23:11:36 +0100 Subject: Handle one more error --- lib/std/thread.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/std/thread.zig b/lib/std/thread.zig index 55db9d1733..de9d580af7 100644 --- 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); -- cgit v1.2.3