Skip to content

Commit c903b76

Browse files
authored
Merge pull request #4589 from LemonBoy/fix-4583
target: Implement OS version detection for OSX
2 parents 3c7f030 + 845af5c commit c903b76

File tree

3 files changed

+29
-2
lines changed

3 files changed

+29
-2
lines changed

lib/std/os.zig

+3
Original file line numberDiff line numberDiff line change
@@ -2764,6 +2764,7 @@ pub const SysCtlError = error{
27642764
PermissionDenied,
27652765
SystemResources,
27662766
NameTooLong,
2767+
UnknownName,
27672768
} || UnexpectedError;
27682769

27692770
pub 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/thread.zig

+1-1
Original file line numberDiff line numberDiff line change
@@ -382,7 +382,7 @@ pub const Thread = struct {
382382
var count_len: usize = @sizeOf(c_int);
383383
const name = if (comptime std.Target.current.isDarwin()) "hw.logicalcpu" else "hw.ncpu";
384384
os.sysctlbynameC(name, &count, &count_len, null, 0) catch |err| switch (err) {
385-
error.NameTooLong => unreachable,
385+
error.NameTooLong, error.UnknownName => unreachable,
386386
else => |e| return e,
387387
};
388388
return @intCast(usize, count);

lib/std/zig/system.zig

+25-1
Original file line numberDiff line numberDiff line change
@@ -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 = product_version.len;
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.

0 commit comments

Comments
 (0)