target: Implement OS version detection for OSX

Closes #4583
master
LemonBoy 2020-02-29 21:46:07 +01:00
parent 3c7f030a60
commit 84549b3955
2 changed files with 28 additions and 1 deletions

View File

@ -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),
}
}

View File

@ -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.