| ... | @@ -292,8 +292,27 @@ pub const NativeTargetInfo = struct { | ... | @@ -292,8 +292,27 @@ pub const NativeTargetInfo = struct { |
| 292 | } | 292 | } |
| 293 | }, | 293 | }, |
| 294 | .freebsd => { | 294 | .freebsd => { |
| 295 | // Unimplemented, fall back to default. | 295 | var osreldate: u32 = undefined; |
| 296 | // https://github.com/ziglang/zig/issues/4582 | 296 | var len: usize = undefined; |
| | 297 | |
| | 298 | std.os.sysctlbynameZ("kern.osreldate", &osreldate, &len, null, 0) catch |err| switch (err) { |
| | 299 | error.NameTooLong => unreachable, // constant, known good value |
| | 300 | error.PermissionDenied => unreachable, // only when setting values, |
| | 301 | error.SystemResources => unreachable, // memory already on the stack |
| | 302 | error.UnknownName => unreachable, // constant, known good value |
| | 303 | error.Unexpected => unreachable, // EFAULT: stack should be safe, EISDIR/ENOTDIR: constant, known good value |
| | 304 | }; |
| | 305 | |
| | 306 | // https://www.freebsd.org/doc/en_US.ISO8859-1/books/porters-handbook/versions.html |
| | 307 | // Major * 100,000 has been convention since FreeBSD 2.2 (1997) |
| | 308 | // Minor * 1(0),000 summed has been convention since FreeBSD 2.2 (1997) |
| | 309 | // e.g. 492101 = 4.11-STABLE = 4.(9+2) |
| | 310 | const major = osreldate / 100_000; |
| | 311 | const minor1 = osreldate % 100_000 / 10_000; // usually 0 since 5.1 |
| | 312 | const minor2 = osreldate % 10_000 / 1_000; // 0 before 5.1, minor version since |
| | 313 | const patch = osreldate % 1_000; |
| | 314 | os.version_range.semver.min = .{ .major = major, .minor = minor1 + minor2, .patch = patch }; |
| | 315 | os.version_range.semver.max = .{ .major = major, .minor = minor1 + minor2, .patch = patch }; |
| 297 | }, | 316 | }, |
| 298 | else => { | 317 | else => { |
| 299 | // Unimplemented, fall back to default version range. | 318 | // Unimplemented, fall back to default version range. |