authorgravatar for carl@astholm.seCarl Åstholm <carl@astholm.se> 2025-03-24 00:14:25+01:00
committergravatar for carl@astholm.seCarl Åstholm <carl@astholm.se> 2025-07-20 18:28:36+02:00
log2c1a349fb9bc9965e309257262665564cff64a79
tree6278a5e5d733b4b1339f1c64e2a3072625b56a51
parentfd5eba9358ebf2f498b7c35bae34267f06d070d2

Support passing enum slices to `b.dependency()`


2 files changed, 27 insertions(+), 17 deletions(-)

lib/std/Build.zig+23-12
......@@ -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+4-5
......@@ -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