Skip to content

Commit 2c1a349

Browse files
committed
Support passing enum slices to b.dependency()
1 parent fd5eba9 commit 2c1a349

File tree

2 files changed

+27
-17
lines changed

2 files changed

+27
-17
lines changed

lib/std/Build.zig

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -530,18 +530,29 @@ fn addUserInputOptionFromArg(
530530
},
531531
else => {},
532532
},
533-
.slice => {
534-
comptime var slice_info = ptr_info;
535-
slice_info.is_const = true;
536-
slice_info.sentinel_ptr = null;
537-
addUserInputOptionFromArg(
538-
arena,
539-
map,
540-
field,
541-
@Type(.{ .pointer = slice_info }),
542-
maybe_value orelse null,
543-
);
544-
return;
533+
.slice => switch (@typeInfo(ptr_info.child)) {
534+
.@"enum" => return if (maybe_value) |v| {
535+
var list = ArrayList([]const u8).initCapacity(arena, v.len) catch @panic("OOM");
536+
for (v) |tag| list.appendAssumeCapacity(@tagName(tag));
537+
map.put(field.name, .{
538+
.name = field.name,
539+
.value = .{ .list = list },
540+
.used = false,
541+
}) catch @panic("OOM");
542+
},
543+
else => {
544+
comptime var slice_info = ptr_info;
545+
slice_info.is_const = true;
546+
slice_info.sentinel_ptr = null;
547+
addUserInputOptionFromArg(
548+
arena,
549+
map,
550+
field,
551+
@Type(.{ .pointer = slice_info }),
552+
maybe_value orelse null,
553+
);
554+
return;
555+
},
545556
},
546557
else => {},
547558
},

test/standalone/dependency_options/build.zig

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ pub fn build(b: *std.Build) !void {
5050
.{ .cwd_relative = "c.txt" },
5151
}),
5252
.@"enum" = @as(Enum, .alfa),
53-
//.enum_list = @as([]const Enum, &.{ .alfa, .bravo, .charlie }),
53+
.enum_list = @as([]const Enum, &.{ .alfa, .bravo, .charlie }),
5454
//.build_id = @as(std.zig.BuildId, .uuid),
5555
});
5656

@@ -75,7 +75,7 @@ pub fn build(b: *std.Build) !void {
7575
.{ .cwd_relative = "c.txt" },
7676
}),
7777
.@"enum" = @as(?Enum, .alfa),
78-
//.enum_list = @as(?[]const Enum, &.{ .alfa, .bravo, .charlie }),
78+
.enum_list = @as(?[]const Enum, &.{ .alfa, .bravo, .charlie }),
7979
//.build_id = @as(?std.zig.BuildId, .uuid),
8080
});
8181

@@ -96,7 +96,7 @@ pub fn build(b: *std.Build) !void {
9696
.{ .cwd_relative = "c.txt" },
9797
},
9898
.@"enum" = .alfa,
99-
//.enum_list = &[_]Enum{ .alfa, .bravo, .charlie },
99+
.enum_list = &[_]Enum{ .alfa, .bravo, .charlie },
100100
//.build_id = @as(std.zig.BuildId, .uuid),
101101
});
102102

@@ -114,7 +114,6 @@ pub fn build(b: *std.Build) !void {
114114
const mut_lazy_path_list: []std.Build.LazyPath = &mut_lazy_path_list_buf;
115115
var mut_enum_list_buf = [_]Enum{ .alfa, .bravo, .charlie };
116116
const mut_enum_list: []Enum = &mut_enum_list_buf;
117-
_ = mut_enum_list;
118117

119118
// Most supported option types are serialized to a string representation,
120119
// so alternative representations of the same option value should resolve
@@ -130,7 +129,7 @@ pub fn build(b: *std.Build) !void {
130129
.lazy_path = @as(std.Build.LazyPath, .{ .cwd_relative = "abc.txt" }),
131130
.lazy_path_list = mut_lazy_path_list,
132131
.@"enum" = "alfa",
133-
//.enum_list = mut_enum_list,
132+
.enum_list = mut_enum_list,
134133
//.build_id = @as(std.zig.BuildId, .uuid),
135134
});
136135

0 commit comments

Comments
 (0)