authorgravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2020-02-29 21:46:07+01:00
committergravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2020-02-29 21:46:07+01:00
log84549b39550014ca85d34c93381cadbd93080a0e
tree356959e9352720386fd1948ce1f7f0609a44399d
parent3c7f030a60b038045334788837f40bee0226109c

target: Implement OS version detection for OSX

Closes #4583

2 files changed, 28 insertions(+), 1 deletions(-)

lib/std/os.zig+3
......@@ -2764,6 +2764,7 @@ pub const SysCtlError = error{
27642764 PermissionDenied,
27652765 SystemResources,
27662766 NameTooLong,
2767 UnknownName,
27672768} || UnexpectedError;
27682769
27692770pub fn sysctl(
......@@ -2779,6 +2780,7 @@ pub fn sysctl(
27792780 EFAULT => unreachable,
27802781 EPERM => return error.PermissionDenied,
27812782 ENOMEM => return error.SystemResources,
2783 ENOENT => return error.UnknownName,
27822784 else => |err| return unexpectedErrno(err),
27832785 }
27842786}
......@@ -2795,6 +2797,7 @@ pub fn sysctlbynameC(
27952797 EFAULT => unreachable,
27962798 EPERM => return error.PermissionDenied,
27972799 ENOMEM => return error.SystemResources,
2800 ENOENT => return error.UnknownName,
27982801 else => |err| return unexpectedErrno(err),
27992802 }
28002803}
lib/std/zig/system.zig+25-1
......@@ -224,7 +224,31 @@ pub const NativeTargetInfo = struct {
224224 // TODO Detect native operating system version.
225225 },
226226 .macosx => {
227 // TODO Detect native operating system version.
227 var product_version: [32]u8 = undefined;
228 var size: usize = @sizeOf(@TypeOf(product_version));
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 }
228252 },
229253 .freebsd => {
230254 // TODO Detect native operating system version.