authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-02-29 20:39:29-05:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2020-02-29 20:39:29-05:00
logc903b760106ff9db5b3de74fa0c4034eddbd9cbf
tree17a0db9969c843926d7541bdbdfa73fd35c7f978
parent3c7f030a60b038045334788837f40bee0226109c
parent845af5c55208753dc355fad734a8c4893338f8f6
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #4589 from LemonBoy/fix-4583

target: Implement OS version detection for OSX

3 files changed, 29 insertions(+), 2 deletions(-)

lib/std/os.zig+3
...@@ -2764,6 +2764,7 @@ pub const SysCtlError = error{...@@ -2764,6 +2764,7 @@ pub const SysCtlError = error{
2764 PermissionDenied,2764 PermissionDenied,
2765 SystemResources,2765 SystemResources,
2766 NameTooLong,2766 NameTooLong,
2767 UnknownName,
2767} || UnexpectedError;2768} || UnexpectedError;
27682769
2769pub fn sysctl(2770pub fn sysctl(
...@@ -2779,6 +2780,7 @@ pub fn sysctl(...@@ -2779,6 +2780,7 @@ pub fn sysctl(
2779 EFAULT => unreachable,2780 EFAULT => unreachable,
2780 EPERM => return error.PermissionDenied,2781 EPERM => return error.PermissionDenied,
2781 ENOMEM => return error.SystemResources,2782 ENOMEM => return error.SystemResources,
2783 ENOENT => return error.UnknownName,
2782 else => |err| return unexpectedErrno(err),2784 else => |err| return unexpectedErrno(err),
2783 }2785 }
2784}2786}
...@@ -2795,6 +2797,7 @@ pub fn sysctlbynameC(...@@ -2795,6 +2797,7 @@ pub fn sysctlbynameC(
2795 EFAULT => unreachable,2797 EFAULT => unreachable,
2796 EPERM => return error.PermissionDenied,2798 EPERM => return error.PermissionDenied,
2797 ENOMEM => return error.SystemResources,2799 ENOMEM => return error.SystemResources,
2800 ENOENT => return error.UnknownName,
2798 else => |err| return unexpectedErrno(err),2801 else => |err| return unexpectedErrno(err),
2799 }2802 }
2800}2803}
lib/std/thread.zig+1-1
...@@ -382,7 +382,7 @@ pub const Thread = struct {...@@ -382,7 +382,7 @@ pub const Thread = struct {
382 var count_len: usize = @sizeOf(c_int);382 var count_len: usize = @sizeOf(c_int);
383 const name = if (comptime std.Target.current.isDarwin()) "hw.logicalcpu" else "hw.ncpu";383 const name = if (comptime std.Target.current.isDarwin()) "hw.logicalcpu" else "hw.ncpu";
384 os.sysctlbynameC(name, &count, &count_len, null, 0) catch |err| switch (err) {384 os.sysctlbynameC(name, &count, &count_len, null, 0) catch |err| switch (err) {
385 error.NameTooLong => unreachable,385 error.NameTooLong, error.UnknownName => unreachable,
386 else => |e| return e,386 else => |e| return e,
387 };387 };
388 return @intCast(usize, count);388 return @intCast(usize, count);
lib/std/zig/system.zig+25-1
...@@ -224,7 +224,31 @@ pub const NativeTargetInfo = struct {...@@ -224,7 +224,31 @@ pub const NativeTargetInfo = struct {
224 // TODO Detect native operating system version.224 // TODO Detect native operating system version.
225 },225 },
226 .macosx => {226 .macosx => {
227 // TODO Detect native operating system version.227 var product_version: [32]u8 = undefined;
228 var size: usize = product_version.len;
229
230 // The osproductversion sysctl was introduced first with
231 // High Sierra, thankfully that's also the baseline that Zig
232 // supports
233 std.os.sysctlbynameC(
234 "kern.osproductversion",
235 &product_version[0],
236 &size,
237 null,
238 0,
239 ) catch |err| switch (err) {
240 error.UnknownName => unreachable,
241 else => unreachable,
242 };
243
244 if (std.builtin.Version.parse(product_version[0..size])) |ver| {
245 os.version_range.semver.min = ver;
246 os.version_range.semver.max = ver;
247 } else |err| switch (err) {
248 error.Overflow => {},
249 error.InvalidCharacter => {},
250 error.InvalidVersion => {},
251 }
228 },252 },
229 .freebsd => {253 .freebsd => {
230 // TODO Detect native operating system version.254 // TODO Detect native operating system version.