-
-
Save tritao/c7824d2c06640f0bf1092d7db988b0e2 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/lib/std/zig/system.zig b/lib/std/zig/system.zig | |
index f6a45860b..d2155cb1e 100644 | |
--- a/lib/std/zig/system.zig | |
+++ b/lib/std/zig/system.zig | |
@@ -259,16 +259,17 @@ pub const NativeTargetInfo = struct { | |
os.version_range.windows.min = @intToEnum(Target.Os.WindowsVersion, version); | |
}, | |
.macosx => { | |
- var product_version: [32]u8 = undefined; | |
- var size: usize = product_version.len; | |
+ var os_release: [32]u8 = undefined; | |
+ var os_release_size: usize = os_release.len; | |
+ | |
+ // Check for High Sierra versions lower than 13.6.0. | |
+ // These cannot use the osproductversion code path below since | |
+ // that property is not supported in those versions. | |
- // The osproductversion sysctl was introduced first with | |
- // High Sierra, thankfully that's also the baseline that Zig | |
- // supports | |
std.os.sysctlbynameZ( | |
- "kern.osproductversion", | |
- &product_version, | |
- &size, | |
+ "kern.osrelease", | |
+ &os_release, | |
+ &os_release_size, | |
null, | |
0, | |
) catch |err| switch (err) { | |
@@ -276,15 +277,47 @@ pub const NativeTargetInfo = struct { | |
else => unreachable, | |
}; | |
- const string_version = product_version[0 .. size - 1 :0]; | |
- if (std.builtin.Version.parse(string_version)) |ver| { | |
- os.version_range.semver.min = ver; | |
- os.version_range.semver.max = ver; | |
+ const string_release_version = os_release[0 .. os_release_size - 1 :0]; | |
+ var os_version: std.builtin.Version = undefined; | |
+ if (std.builtin.Version.parse(string_release_version)) |ver| { | |
+ // Map from the kernel version to OS version, i.e. kernel version 17.x | |
+ // is equivalent to OS version 13.x, this holds for all macOS versions. | |
+ os_version = std.builtin.Version {.major = ver.major - 4, .minor = ver.minor }; | |
+ os.version_range.semver.min = os_version; | |
+ os.version_range.semver.max = os_version; | |
} else |err| switch (err) { | |
error.Overflow => {}, | |
error.InvalidCharacter => {}, | |
error.InvalidVersion => {}, | |
} | |
+ | |
+ if (os_version.major > 13 or (os_version.major >= 13 and os_version.minor >= 6)) { | |
+ // The osproductversion sysctl was introduced first with High Sierra. | |
+ | |
+ var product_version: [32]u8 = undefined; | |
+ var size: usize = product_version.len; | |
+ | |
+ std.os.sysctlbynameZ( | |
+ "kern.osproductversion", | |
+ &product_version, | |
+ &size, | |
+ null, | |
+ 0, | |
+ ) catch |err| switch (err) { | |
+ error.UnknownName => unreachable, | |
+ else => unreachable, | |
+ }; | |
+ | |
+ const string_version = product_version[0 .. size - 1 :0]; | |
+ if (std.builtin.Version.parse(string_version)) |ver| { | |
+ os.version_range.semver.min = ver; | |
+ os.version_range.semver.max = ver; | |
+ } else |err| switch (err) { | |
+ error.Overflow => {}, | |
+ error.InvalidCharacter => {}, | |
+ error.InvalidVersion => {}, | |
+ } | |
+ } | |
}, | |
.freebsd => { | |
// Unimplemented, fall back to default. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment