Commit 84549b3955

LemonBoy <thatlemon@gmail.com>
2020-02-29 21:46:07
target: Implement OS version detection for OSX
Closes #4583
1 parent 3c7f030
Changed files (2)
lib
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.
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),
     }
 }