Skip to content

Instantly share code, notes, and snippets.

@tritao

tritao/zig.patch Secret

Created April 21, 2020 20:10
Show Gist options
  • Save tritao/c7824d2c06640f0bf1092d7db988b0e2 to your computer and use it in GitHub Desktop.
Save tritao/c7824d2c06640f0bf1092d7db988b0e2 to your computer and use it in GitHub Desktop.
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