authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-07-28 14:02:54+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-07-28 21:13:56+02:00
log20f4216af5dc4d5cb547529a132d8682ce7b7536
tree6a22401366beea1eddd1a84f489b25e858af58bc
parent6548331ec9fc0889ff456bd8610340499386e027

macos: fix parsing of SDK version string into std.SemanticVersion


1 files changed, 38 insertions(+), 1 deletions(-)

lib/std/zig/system/darwin.zig+38-1
......@@ -66,7 +66,7 @@ pub fn getDarwinSDK(allocator: Allocator, target: Target) ?DarwinSDK {
6666 return null;
6767 }
6868 const raw_version = mem.trimRight(u8, result.stdout, "\r\n");
69 const version = Version.parse(raw_version) catch Version{
69 const version = parseSdkVersion(raw_version) orelse Version{
7070 .major = 0,
7171 .minor = 0,
7272 .patch = 0,
......@@ -79,6 +79,23 @@ pub fn getDarwinSDK(allocator: Allocator, target: Target) ?DarwinSDK {
7979 };
8080}
8181
82// Versions reported by Apple aren't exactly semantically valid as they usually omit
83// the patch component. Hence, we do a simple check for the number of components and
84// add the missing patch value if needed.
85fn parseSdkVersion(raw: []const u8) ?Version {
86 var buffer: [128]u8 = undefined;
87 if (raw.len > buffer.len) return null;
88 @memcpy(buffer[0..raw.len], raw);
89 const dots_count = mem.count(u8, raw, ".");
90 if (dots_count < 1) return null;
91 const len = if (dots_count < 2) blk: {
92 const patch_suffix = ".0";
93 buffer[raw.len..][0..patch_suffix.len].* = patch_suffix.*;
94 break :blk raw.len + patch_suffix.len;
95 } else raw.len;
96 return Version.parse(buffer[0..len]) catch null;
97}
98
8299pub const DarwinSDK = struct {
83100 path: []const u8,
84101 version: Version,
......@@ -91,3 +108,23 @@ pub const DarwinSDK = struct {
91108test {
92109 _ = macos;
93110}
111
112const expect = std.testing.expect;
113const expectEqual = std.testing.expectEqual;
114
115fn testParseSdkVersionSuccess(exp: Version, raw: []const u8) !void {
116 const maybe_ver = parseSdkVersion(raw);
117 try expect(maybe_ver != null);
118 const ver = maybe_ver.?;
119 try expectEqual(exp.major, ver.major);
120 try expectEqual(exp.minor, ver.minor);
121 try expectEqual(exp.patch, ver.patch);
122}
123
124test "parseSdkVersion" {
125 try testParseSdkVersionSuccess(.{ .major = 13, .minor = 4, .patch = 0 }, "13.4");
126 try testParseSdkVersionSuccess(.{ .major = 13, .minor = 4, .patch = 1 }, "13.4.1");
127 try testParseSdkVersionSuccess(.{ .major = 11, .minor = 15, .patch = 0 }, "11.15");
128
129 try expect(parseSdkVersion("11") == null);
130}