Commit 2c1a349fb9

Carl Åstholm <carl@astholm.se>
2025-03-24 00:14:25
Support passing enum slices to `b.dependency()`
1 parent fd5eba9
Changed files (2)
lib
test
standalone
dependency_options
lib/std/Build.zig
@@ -530,18 +530,29 @@ fn addUserInputOptionFromArg(
                     },
                     else => {},
                 },
-                .slice => {
-                    comptime var slice_info = ptr_info;
-                    slice_info.is_const = true;
-                    slice_info.sentinel_ptr = null;
-                    addUserInputOptionFromArg(
-                        arena,
-                        map,
-                        field,
-                        @Type(.{ .pointer = slice_info }),
-                        maybe_value orelse null,
-                    );
-                    return;
+                .slice => switch (@typeInfo(ptr_info.child)) {
+                    .@"enum" => return if (maybe_value) |v| {
+                        var list = ArrayList([]const u8).initCapacity(arena, v.len) catch @panic("OOM");
+                        for (v) |tag| list.appendAssumeCapacity(@tagName(tag));
+                        map.put(field.name, .{
+                            .name = field.name,
+                            .value = .{ .list = list },
+                            .used = false,
+                        }) catch @panic("OOM");
+                    },
+                    else => {
+                        comptime var slice_info = ptr_info;
+                        slice_info.is_const = true;
+                        slice_info.sentinel_ptr = null;
+                        addUserInputOptionFromArg(
+                            arena,
+                            map,
+                            field,
+                            @Type(.{ .pointer = slice_info }),
+                            maybe_value orelse null,
+                        );
+                        return;
+                    },
                 },
                 else => {},
             },
test/standalone/dependency_options/build.zig
@@ -50,7 +50,7 @@ pub fn build(b: *std.Build) !void {
             .{ .cwd_relative = "c.txt" },
         }),
         .@"enum" = @as(Enum, .alfa),
-        //.enum_list = @as([]const Enum, &.{ .alfa, .bravo, .charlie }),
+        .enum_list = @as([]const Enum, &.{ .alfa, .bravo, .charlie }),
         //.build_id = @as(std.zig.BuildId, .uuid),
     });
 
@@ -75,7 +75,7 @@ pub fn build(b: *std.Build) !void {
             .{ .cwd_relative = "c.txt" },
         }),
         .@"enum" = @as(?Enum, .alfa),
-        //.enum_list = @as(?[]const Enum, &.{ .alfa, .bravo, .charlie }),
+        .enum_list = @as(?[]const Enum, &.{ .alfa, .bravo, .charlie }),
         //.build_id = @as(?std.zig.BuildId, .uuid),
     });
 
@@ -96,7 +96,7 @@ pub fn build(b: *std.Build) !void {
             .{ .cwd_relative = "c.txt" },
         },
         .@"enum" = .alfa,
-        //.enum_list = &[_]Enum{ .alfa, .bravo, .charlie },
+        .enum_list = &[_]Enum{ .alfa, .bravo, .charlie },
         //.build_id = @as(std.zig.BuildId, .uuid),
     });
 
@@ -114,7 +114,6 @@ pub fn build(b: *std.Build) !void {
     const mut_lazy_path_list: []std.Build.LazyPath = &mut_lazy_path_list_buf;
     var mut_enum_list_buf = [_]Enum{ .alfa, .bravo, .charlie };
     const mut_enum_list: []Enum = &mut_enum_list_buf;
-    _ = mut_enum_list;
 
     // Most supported option types are serialized to a string representation,
     // so alternative representations of the same option value should resolve
@@ -130,7 +129,7 @@ pub fn build(b: *std.Build) !void {
         .lazy_path = @as(std.Build.LazyPath, .{ .cwd_relative = "abc.txt" }),
         .lazy_path_list = mut_lazy_path_list,
         .@"enum" = "alfa",
-        //.enum_list = mut_enum_list,
+        .enum_list = mut_enum_list,
         //.build_id = @as(std.zig.BuildId, .uuid),
     });