Commit 4b72b0560d

Veikka Tuominen <git@vexu.eu>
2021-06-11 10:50:48
make remaining enums in build.zig snake_case
1 parent 1c1ea2b
lib/std/build/CheckFileStep.zig
@@ -13,6 +13,8 @@ const warn = std.debug.warn;
 
 const CheckFileStep = @This();
 
+pub const base_id = .check_file;
+
 step: Step,
 builder: *Builder,
 expected_matches: []const []const u8,
@@ -27,7 +29,7 @@ pub fn create(
     const self = builder.allocator.create(CheckFileStep) catch unreachable;
     self.* = CheckFileStep{
         .builder = builder,
-        .step = Step.init(.CheckFile, "CheckFile", builder.allocator, make),
+        .step = Step.init(.check_file, "CheckFile", builder.allocator, make),
         .source = source.dupe(builder),
         .expected_matches = builder.dupeStrings(expected_matches),
     };
lib/std/build/FmtStep.zig
@@ -12,6 +12,8 @@ const mem = std.mem;
 
 const FmtStep = @This();
 
+pub const base_id = .fmt;
+
 step: Step,
 builder: *Builder,
 argv: [][]const u8,
@@ -20,7 +22,7 @@ pub fn create(builder: *Builder, paths: []const []const u8) *FmtStep {
     const self = builder.allocator.create(FmtStep) catch unreachable;
     const name = "zig fmt";
     self.* = FmtStep{
-        .step = Step.init(.Fmt, name, builder.allocator, make),
+        .step = Step.init(.fmt, name, builder.allocator, make),
         .builder = builder,
         .argv = builder.allocator.alloc([]u8, paths.len + 2) catch unreachable,
     };
lib/std/build/InstallRawStep.zig
@@ -179,6 +179,8 @@ fn emitRaw(allocator: *Allocator, elf_path: []const u8, raw_path: []const u8) !v
 
 const InstallRawStep = @This();
 
+pub const base_id = .install_raw;
+
 step: Step,
 builder: *Builder,
 artifact: *LibExeObjStep,
@@ -188,14 +190,14 @@ dest_filename: []const u8,
 pub fn create(builder: *Builder, artifact: *LibExeObjStep, dest_filename: []const u8) *InstallRawStep {
     const self = builder.allocator.create(InstallRawStep) catch unreachable;
     self.* = InstallRawStep{
-        .step = Step.init(.InstallRaw, builder.fmt("install raw binary {s}", .{artifact.step.name}), builder.allocator, make),
+        .step = Step.init(.install_raw, builder.fmt("install raw binary {s}", .{artifact.step.name}), builder.allocator, make),
         .builder = builder,
         .artifact = artifact,
         .dest_dir = switch (artifact.kind) {
-            .Obj => unreachable,
-            .Test => unreachable,
-            .Exe => .Bin,
-            .Lib => unreachable,
+            .obj => unreachable,
+            .@"test" => unreachable,
+            .exe => .bin,
+            .lib => unreachable,
         },
         .dest_filename = dest_filename,
     };
lib/std/build/RunStep.zig
@@ -21,6 +21,8 @@ const max_stdout_size = 1 * 1024 * 1024; // 1 MiB
 
 const RunStep = @This();
 
+pub const base_id = .run;
+
 step: Step,
 builder: *Builder,
 
@@ -57,7 +59,7 @@ pub fn create(builder: *Builder, name: []const u8) *RunStep {
     const self = builder.allocator.create(RunStep) catch unreachable;
     self.* = RunStep{
         .builder = builder,
-        .step = Step.init(.Run, name, builder.allocator, make),
+        .step = Step.init(.run, name, builder.allocator, make),
         .argv = ArrayList(Arg).init(builder.allocator),
         .cwd = null,
         .env_map = null,
lib/std/build/TranslateCStep.zig
@@ -15,6 +15,8 @@ const CrossTarget = std.zig.CrossTarget;
 
 const TranslateCStep = @This();
 
+pub const base_id = .translate_c;
+
 step: Step,
 builder: *Builder,
 source: build.FileSource,
@@ -27,7 +29,7 @@ output_file: build.GeneratedFile,
 pub fn create(builder: *Builder, source: build.FileSource) *TranslateCStep {
     const self = builder.allocator.create(TranslateCStep) catch unreachable;
     self.* = TranslateCStep{
-        .step = Step.init(.TranslateC, "translate-c", builder.allocator, make),
+        .step = Step.init(.translate_c, "translate-c", builder.allocator, make),
         .builder = builder,
         .source = source,
         .include_dirs = std.ArrayList([]const u8).init(builder.allocator),
lib/std/build/WriteFileStep.zig
@@ -13,6 +13,8 @@ const ArrayList = std.ArrayList;
 
 const WriteFileStep = @This();
 
+pub const base_id = .write_file;
+
 step: Step,
 builder: *Builder,
 output_dir: []const u8,
@@ -27,7 +29,7 @@ pub const File = struct {
 pub fn init(builder: *Builder) WriteFileStep {
     return WriteFileStep{
         .builder = builder,
-        .step = Step.init(.WriteFile, "writefile", builder.allocator, make),
+        .step = Step.init(.write_file, "writefile", builder.allocator, make),
         .files = .{},
         .output_dir = undefined,
     };
lib/std/special/build_runner.zig
@@ -202,7 +202,7 @@ fn usage(builder: *Builder, already_ran_build: bool, out_stream: anytype) !void
         for (builder.available_options_list.items) |option| {
             const name = try fmt.allocPrint(allocator, "  -D{s}=[{s}]", .{
                 option.name,
-                Builder.typeIdName(option.type_id),
+                @tagName(option.type_id),
             });
             defer allocator.free(name);
             try out_stream.print("{s:<29} {s}\n", .{ name, option.description });
lib/std/build.zig
@@ -103,21 +103,23 @@ pub const Builder = struct {
     };
 
     const UserValue = union(enum) {
-        Flag: void,
-        Scalar: []const u8,
-        List: ArrayList([]const u8),
+        flag: void,
+        scalar: []const u8,
+        list: ArrayList([]const u8),
     };
 
     const TypeId = enum {
-        Bool,
-        Int,
-        Float,
-        Enum,
-        String,
-        List,
+        bool,
+        int,
+        float,
+        @"enum",
+        string,
+        list,
     };
 
     const TopLevelStep = struct {
+        pub const base_id = .top_level;
+
         step: Step,
         description: []const u8,
     };
@@ -163,11 +165,11 @@ pub const Builder = struct {
             .dest_dir = env_map.get("DESTDIR"),
             .installed_files = ArrayList(InstalledFile).init(allocator),
             .install_tls = TopLevelStep{
-                .step = Step.initNoOp(.TopLevel, "install", allocator),
+                .step = Step.initNoOp(.top_level, "install", allocator),
                 .description = "Copy build artifacts to prefix path",
             },
             .uninstall_tls = TopLevelStep{
-                .step = Step.init(.TopLevel, "uninstall", allocator, makeUninstall),
+                .step = Step.init(.top_level, "uninstall", allocator, makeUninstall),
                 .description = "Remove build artifacts from prefix path",
             },
             .release_mode = null,
@@ -457,9 +459,9 @@ pub const Builder = struct {
         const option_ptr = self.user_input_options.getPtr(name) orelse return null;
         option_ptr.used = true;
         switch (type_id) {
-            .Bool => switch (option_ptr.value) {
-                .Flag => return true,
-                .Scalar => |s| {
+            .bool => switch (option_ptr.value) {
+                .flag => return true,
+                .scalar => |s| {
                     if (mem.eql(u8, s, "true")) {
                         return true;
                     } else if (mem.eql(u8, s, "false")) {
@@ -470,19 +472,19 @@ pub const Builder = struct {
                         return null;
                     }
                 },
-                .List => {
+                .list => {
                     warn("Expected -D{s} to be a boolean, but received a list.\n\n", .{name});
                     self.markInvalidUserInput();
                     return null;
                 },
             },
-            .Int => switch (option_ptr.value) {
-                .Flag => {
+            .int => switch (option_ptr.value) {
+                .flag => {
                     warn("Expected -D{s} to be an integer, but received a boolean.\n\n", .{name});
                     self.markInvalidUserInput();
                     return null;
                 },
-                .Scalar => |s| {
+                .scalar => |s| {
                     const n = std.fmt.parseInt(T, s, 10) catch |err| switch (err) {
                         error.Overflow => {
                             warn("-D{s} value {s} cannot fit into type {s}.\n\n", .{ name, s, @typeName(T) });
@@ -497,19 +499,19 @@ pub const Builder = struct {
                     };
                     return n;
                 },
-                .List => {
+                .list => {
                     warn("Expected -D{s} to be an integer, but received a list.\n\n", .{name});
                     self.markInvalidUserInput();
                     return null;
                 },
             },
-            .Float => switch (option_ptr.value) {
-                .Flag => {
+            .float => switch (option_ptr.value) {
+                .flag => {
                     warn("Expected -D{s} to be a float, but received a boolean.\n\n", .{name});
                     self.markInvalidUserInput();
                     return null;
                 },
-                .Scalar => |s| {
+                .scalar => |s| {
                     const n = std.fmt.parseFloat(T, s) catch |err| {
                         warn("Expected -D{s} to be a float of type {s}.\n\n", .{ name, @typeName(T) });
                         self.markInvalidUserInput();
@@ -517,19 +519,19 @@ pub const Builder = struct {
                     };
                     return n;
                 },
-                .List => {
+                .list => {
                     warn("Expected -D{s} to be a float, but received a list.\n\n", .{name});
                     self.markInvalidUserInput();
                     return null;
                 },
             },
-            .Enum => switch (option_ptr.value) {
-                .Flag => {
+            .@"enum" => switch (option_ptr.value) {
+                .flag => {
                     warn("Expected -D{s} to be a string, but received a boolean.\n\n", .{name});
                     self.markInvalidUserInput();
                     return null;
                 },
-                .Scalar => |s| {
+                .scalar => |s| {
                     if (std.meta.stringToEnum(T, s)) |enum_lit| {
                         return enum_lit;
                     } else {
@@ -538,35 +540,35 @@ pub const Builder = struct {
                         return null;
                     }
                 },
-                .List => {
+                .list => {
                     warn("Expected -D{s} to be a string, but received a list.\n\n", .{name});
                     self.markInvalidUserInput();
                     return null;
                 },
             },
-            .String => switch (option_ptr.value) {
-                .Flag => {
+            .string => switch (option_ptr.value) {
+                .flag => {
                     warn("Expected -D{s} to be a string, but received a boolean.\n\n", .{name});
                     self.markInvalidUserInput();
                     return null;
                 },
-                .List => {
+                .list => {
                     warn("Expected -D{s} to be a string, but received a list.\n\n", .{name});
                     self.markInvalidUserInput();
                     return null;
                 },
-                .Scalar => |s| return s,
+                .scalar => |s| return s,
             },
-            .List => switch (option_ptr.value) {
-                .Flag => {
+            .list => switch (option_ptr.value) {
+                .flag => {
                     warn("Expected -D{s} to be a list, but received a boolean.\n\n", .{name});
                     self.markInvalidUserInput();
                     return null;
                 },
-                .Scalar => |s| {
+                .scalar => |s| {
                     return self.allocator.dupe([]const u8, &[_][]const u8{s}) catch unreachable;
                 },
-                .List => |lst| return lst.items,
+                .list => |lst| return lst.items,
             },
         }
     }
@@ -574,7 +576,7 @@ pub const Builder = struct {
     pub fn step(self: *Builder, name: []const u8, description: []const u8) *Step {
         const step_info = self.allocator.create(TopLevelStep) catch unreachable;
         step_info.* = TopLevelStep{
-            .step = Step.initNoOp(.TopLevel, name, self.allocator),
+            .step = Step.initNoOp(.top_level, name, self.allocator),
             .description = self.dupe(description),
         };
         self.top_level_steps.append(step_info) catch unreachable;
@@ -721,7 +723,7 @@ pub const Builder = struct {
         if (!gop.found_existing) {
             gop.value_ptr.* = UserInputOption{
                 .name = name,
-                .value = UserValue{ .Scalar = value },
+                .value = .{ .scalar = value },
                 .used = false,
             };
             return false;
@@ -729,27 +731,27 @@ pub const Builder = struct {
 
         // option already exists
         switch (gop.value_ptr.value) {
-            UserValue.Scalar => |s| {
+            .scalar => |s| {
                 // turn it into a list
                 var list = ArrayList([]const u8).init(self.allocator);
                 list.append(s) catch unreachable;
                 list.append(value) catch unreachable;
-                self.user_input_options.put(name, UserInputOption{
+                self.user_input_options.put(name, .{
                     .name = name,
-                    .value = UserValue{ .List = list },
+                    .value = .{ .list = list },
                     .used = false,
                 }) catch unreachable;
             },
-            UserValue.List => |*list| {
+            .list => |*list| {
                 // append to the list
                 list.append(value) catch unreachable;
-                self.user_input_options.put(name, UserInputOption{
+                self.user_input_options.put(name, .{
                     .name = name,
-                    .value = UserValue{ .List = list.* },
+                    .value = .{ .list = list.* },
                     .used = false,
                 }) catch unreachable;
             },
-            UserValue.Flag => {
+            .flag => {
                 warn("Option '-D{s}={s}' conflicts with flag '-D{s}'.\n", .{ name, value, name });
                 return true;
             },
@@ -761,9 +763,9 @@ pub const Builder = struct {
         const name = self.dupe(name_raw);
         const gop = try self.user_input_options.getOrPut(name);
         if (!gop.found_existing) {
-            gop.value_ptr.* = UserInputOption{
+            gop.value_ptr.* = .{
                 .name = name,
-                .value = UserValue{ .Flag = {} },
+                .value = .{ .flag = {} },
                 .used = false,
             };
             return false;
@@ -771,28 +773,28 @@ pub const Builder = struct {
 
         // option already exists
         switch (gop.value_ptr.value) {
-            UserValue.Scalar => |s| {
+            .scalar => |s| {
                 warn("Flag '-D{s}' conflicts with option '-D{s}={s}'.\n", .{ name, name, s });
                 return true;
             },
-            UserValue.List => {
+            .list => {
                 warn("Flag '-D{s}' conflicts with multiple options of the same name.\n", .{name});
                 return true;
             },
-            UserValue.Flag => {},
+            .flag => {},
         }
         return false;
     }
 
     fn typeToEnum(comptime T: type) TypeId {
         return switch (@typeInfo(T)) {
-            .Int => .Int,
-            .Float => .Float,
-            .Bool => .Bool,
-            .Enum => .Enum,
+            .Int => .int,
+            .Float => .float,
+            .Bool => .bool,
+            .Enum => .@"enum",
             else => switch (T) {
-                []const u8 => .String,
-                []const []const u8 => .List,
+                []const u8 => .string,
+                []const []const u8 => .list,
                 else => @compileError("Unsupported type: " ++ @typeName(T)),
             },
         };
@@ -802,17 +804,6 @@ pub const Builder = struct {
         self.invalid_user_input = true;
     }
 
-    pub fn typeIdName(id: TypeId) []const u8 {
-        return switch (id) {
-            .Bool => "bool",
-            .Int => "int",
-            .Float => "float",
-            .Enum => "enum",
-            .String => "string",
-            .List => "list",
-        };
-    }
-
     pub fn validateUserInputDidItFail(self: *Builder) bool {
         // make sure all args are used
         var it = self.user_input_options.iterator();
@@ -888,7 +879,7 @@ pub const Builder = struct {
 
     ///`dest_rel_path` is relative to prefix path
     pub fn installFile(self: *Builder, src_path: []const u8, dest_rel_path: []const u8) void {
-        self.getInstallStep().dependOn(&self.addInstallFileWithDir(.{ .path = src_path }, .Prefix, dest_rel_path).step);
+        self.getInstallStep().dependOn(&self.addInstallFileWithDir(.{ .path = src_path }, .prefix, dest_rel_path).step);
     }
 
     pub fn installDirectory(self: *Builder, options: InstallDirectoryOptions) void {
@@ -897,12 +888,12 @@ pub const Builder = struct {
 
     ///`dest_rel_path` is relative to bin path
     pub fn installBinFile(self: *Builder, src_path: []const u8, dest_rel_path: []const u8) void {
-        self.getInstallStep().dependOn(&self.addInstallFileWithDir(.{ .path = src_path }, .Bin, dest_rel_path).step);
+        self.getInstallStep().dependOn(&self.addInstallFileWithDir(.{ .path = src_path }, .bin, dest_rel_path).step);
     }
 
     ///`dest_rel_path` is relative to lib path
     pub fn installLibFile(self: *Builder, src_path: []const u8, dest_rel_path: []const u8) void {
-        self.getInstallStep().dependOn(&self.addInstallFileWithDir(.{ .path = src_path }, .Lib, dest_rel_path).step);
+        self.getInstallStep().dependOn(&self.addInstallFileWithDir(.{ .path = src_path }, .lib, dest_rel_path).step);
     }
 
     pub fn installRaw(self: *Builder, artifact: *LibExeObjStep, dest_filename: []const u8) void {
@@ -911,17 +902,17 @@ pub const Builder = struct {
 
     ///`dest_rel_path` is relative to install prefix path
     pub fn addInstallFile(self: *Builder, source: FileSource, dest_rel_path: []const u8) *InstallFileStep {
-        return self.addInstallFileWithDir(source.dupe(self), .Prefix, dest_rel_path);
+        return self.addInstallFileWithDir(source.dupe(self), .prefix, dest_rel_path);
     }
 
     ///`dest_rel_path` is relative to bin path
     pub fn addInstallBinFile(self: *Builder, source: FileSource, dest_rel_path: []const u8) *InstallFileStep {
-        return self.addInstallFileWithDir(source.dupe(self), .Bin, dest_rel_path);
+        return self.addInstallFileWithDir(source.dupe(self), .bin, dest_rel_path);
     }
 
     ///`dest_rel_path` is relative to lib path
     pub fn addInstallLibFile(self: *Builder, source: FileSource, dest_rel_path: []const u8) *InstallFileStep {
-        return self.addInstallFileWithDir(source.dupe(self), .Lib, dest_rel_path);
+        return self.addInstallFileWithDir(source.dupe(self), .lib, dest_rel_path);
     }
 
     pub fn addInstallRaw(self: *Builder, artifact: *LibExeObjStep, dest_filename: []const u8) *InstallRawStep {
@@ -1119,11 +1110,11 @@ pub const Builder = struct {
     pub fn getInstallPath(self: *Builder, dir: InstallDir, dest_rel_path: []const u8) []const u8 {
         assert(!fs.path.isAbsolute(dest_rel_path)); // Install paths must be relative to the prefix
         const base_dir = switch (dir) {
-            .Prefix => self.install_path,
-            .Bin => self.exe_dir,
-            .Lib => self.lib_dir,
-            .Header => self.h_dir,
-            .Custom => |path| fs.path.join(self.allocator, &[_][]const u8{ self.install_path, path }) catch unreachable,
+            .prefix => self.install_path,
+            .bin => self.exe_dir,
+            .lib => self.lib_dir,
+            .header => self.h_dir,
+            .custom => |path| fs.path.join(self.allocator, &[_][]const u8{ self.install_path, path }) catch unreachable,
         };
         return fs.path.resolve(
             self.allocator,
@@ -1315,6 +1306,8 @@ const BuildOptionFileSourceArg = struct {
 };
 
 pub const LibExeObjStep = struct {
+    pub const base_id = .lib_exe_obj;
+
     step: Step,
     builder: *Builder,
     name: []const u8,
@@ -1451,10 +1444,10 @@ pub const LibExeObjStep = struct {
     };
 
     const Kind = enum {
-        Exe,
-        Lib,
-        Obj,
-        Test,
+        exe,
+        lib,
+        obj,
+        @"test",
     };
 
     const SharedLibKind = union(enum) {
@@ -1465,26 +1458,26 @@ pub const LibExeObjStep = struct {
     pub const Linkage = enum { dynamic, static };
 
     pub fn createSharedLibrary(builder: *Builder, name: []const u8, root_src: ?FileSource, kind: SharedLibKind) *LibExeObjStep {
-        return initExtraArgs(builder, name, root_src, Kind.Lib, .dynamic, switch (kind) {
+        return initExtraArgs(builder, name, root_src, .lib, .dynamic, switch (kind) {
             .versioned => |ver| ver,
             .unversioned => null,
         });
     }
 
     pub fn createStaticLibrary(builder: *Builder, name: []const u8, root_src: ?FileSource) *LibExeObjStep {
-        return initExtraArgs(builder, name, root_src, Kind.Lib, .static, null);
+        return initExtraArgs(builder, name, root_src, .lib, .static, null);
     }
 
     pub fn createObject(builder: *Builder, name: []const u8, root_src: ?FileSource) *LibExeObjStep {
-        return initExtraArgs(builder, name, root_src, Kind.Obj, .static, null);
+        return initExtraArgs(builder, name, root_src, .obj, .static, null);
     }
 
     pub fn createExecutable(builder: *Builder, name: []const u8, root_src: ?FileSource, linkage: Linkage) *LibExeObjStep {
-        return initExtraArgs(builder, name, root_src, Kind.Exe, linkage, null);
+        return initExtraArgs(builder, name, root_src, .exe, linkage, null);
     }
 
     pub fn createTest(builder: *Builder, name: []const u8, root_src: FileSource) *LibExeObjStep {
-        return initExtraArgs(builder, name, root_src, Kind.Test, .static, null);
+        return initExtraArgs(builder, name, root_src, .@"test", .static, null);
     }
 
     fn initExtraArgs(
@@ -1513,7 +1506,7 @@ pub const LibExeObjStep = struct {
             .root_src = root_src,
             .name = name,
             .frameworks = BufSet.init(builder.allocator),
-            .step = Step.init(.LibExeObj, name, builder.allocator, make),
+            .step = Step.init(base_id, name, builder.allocator, make),
             .version = ver,
             .out_filename = undefined,
             .out_h_filename = builder.fmt("{s}.h", .{name}),
@@ -1568,18 +1561,18 @@ pub const LibExeObjStep = struct {
             .root_name = self.name,
             .target = target,
             .output_mode = switch (self.kind) {
-                .Lib => .Lib,
-                .Obj => .Obj,
-                .Exe, .Test => .Exe,
+                .lib => .Lib,
+                .obj => .Obj,
+                .exe, .@"test" => .Exe,
             },
             .link_mode = switch (self.linkage) {
-                .dynamic => std.builtin.LinkMode.Dynamic,
-                .static => std.builtin.LinkMode.Static,
+                .dynamic => .Dynamic,
+                .static => .Static,
             },
             .version = self.version,
         }) catch unreachable;
 
-        if (self.kind == .Lib) {
+        if (self.kind == .lib) {
             if (self.linkage == .static) {
                 self.out_lib_filename = self.out_filename;
             } else if (self.version) |version| {
@@ -1636,7 +1629,7 @@ pub const LibExeObjStep = struct {
     /// Creates a `RunStep` with an executable built with `addExecutable`.
     /// Add command line arguments with `addArg`.
     pub fn run(exe: *LibExeObjStep) *RunStep {
-        assert(exe.kind == Kind.Exe);
+        assert(exe.kind == .exe);
 
         // It doesn't have to be native. We catch that if you actually try to run it.
         // Consider that this is declarative; the run step may not be run unless a user
@@ -1679,31 +1672,31 @@ pub const LibExeObjStep = struct {
     }
 
     pub fn linkLibrary(self: *LibExeObjStep, lib: *LibExeObjStep) void {
-        assert(lib.kind == Kind.Lib);
+        assert(lib.kind == .lib);
         self.linkLibraryOrObject(lib);
     }
 
     pub fn isDynamicLibrary(self: *LibExeObjStep) bool {
-        return self.kind == Kind.Lib and self.linkage == .dynamic;
+        return self.kind == .lib and self.linkage == .dynamic;
     }
 
     pub fn producesPdbFile(self: *LibExeObjStep) bool {
         if (!self.target.isWindows() and !self.target.isUefi()) return false;
         if (self.strip) return false;
-        return self.isDynamicLibrary() or self.kind == .Exe;
+        return self.isDynamicLibrary() or self.kind == .exe;
     }
 
     pub fn linkLibC(self: *LibExeObjStep) void {
         if (!self.is_linking_libc) {
             self.is_linking_libc = true;
-            self.link_objects.append(LinkObject{ .system_lib = "c" }) catch unreachable;
+            self.link_objects.append(.{ .system_lib = "c" }) catch unreachable;
         }
     }
 
     pub fn linkLibCpp(self: *LibExeObjStep) void {
         if (!self.is_linking_libcpp) {
             self.is_linking_libcpp = true;
-            self.link_objects.append(LinkObject{ .SystemLib = "c++" }) catch unreachable;
+            self.link_objects.append(.{ .system_lib = "c++" }) catch unreachable;
         }
     }
 
@@ -1715,7 +1708,7 @@ pub const LibExeObjStep = struct {
     /// This one has no integration with anything, it just puts -lname on the command line.
     /// Prefer to use `linkSystemLibrary` instead.
     pub fn linkSystemLibraryName(self: *LibExeObjStep, name: []const u8) void {
-        self.link_objects.append(LinkObject{ .system_lib = self.builder.dupe(name) }) catch unreachable;
+        self.link_objects.append(.{ .system_lib = self.builder.dupe(name) }) catch unreachable;
     }
 
     /// This links against a system library, exclusively using pkg-config to find the library.
@@ -1835,12 +1828,12 @@ pub const LibExeObjStep = struct {
     }
 
     pub fn setNamePrefix(self: *LibExeObjStep, text: []const u8) void {
-        assert(self.kind == Kind.Test);
+        assert(self.kind == .@"test");
         self.name_prefix = self.builder.dupe(text);
     }
 
     pub fn setFilter(self: *LibExeObjStep, text: ?[]const u8) void {
-        assert(self.kind == Kind.Test);
+        assert(self.kind == .@"test");
         self.filter = if (text) |t| self.builder.dupe(t) else null;
     }
 
@@ -1855,7 +1848,7 @@ pub const LibExeObjStep = struct {
             .files = files_copy,
             .flags = flags_copy,
         };
-        self.link_objects.append(LinkObject{ .c_source_files = c_source_files }) catch unreachable;
+        self.link_objects.append(.{ .c_source_files = c_source_files }) catch unreachable;
     }
 
     pub fn addCSourceFile(self: *LibExeObjStep, file: []const u8, flags: []const []const u8) void {
@@ -1868,7 +1861,7 @@ pub const LibExeObjStep = struct {
     pub fn addCSourceFileSource(self: *LibExeObjStep, source: CSourceFile) void {
         const c_source_file = self.builder.allocator.create(CSourceFile) catch unreachable;
         c_source_file.* = source.dupe(self.builder);
-        self.link_objects.append(LinkObject{ .c_source_file = c_source_file }) catch unreachable;
+        self.link_objects.append(.{ .c_source_file = c_source_file }) catch unreachable;
         source.source.addStepDependencies(&self.step);
     }
 
@@ -1904,14 +1897,14 @@ pub const LibExeObjStep = struct {
 
     /// Returns the generated import library. This function can only be called for libraries.
     pub fn getOutputLibSource(self: *LibExeObjStep) FileSource {
-        assert(self.kind == Kind.Lib);
+        assert(self.kind == .lib);
         return FileSource{ .generated = &self.output_lib_path_source };
     }
 
     /// Returns the generated header file.
     /// This function can only be called for libraries or object files which have `emit_h` set.
     pub fn getOutputHSource(self: *LibExeObjStep) FileSource {
-        assert(self.kind != Kind.Exe);
+        assert(self.kind != .exe);
         assert(self.emit_h);
         return FileSource{ .generated = &self.output_h_path_source };
     }
@@ -1924,14 +1917,14 @@ pub const LibExeObjStep = struct {
     }
 
     pub fn addAssemblyFile(self: *LibExeObjStep, path: []const u8) void {
-        self.link_objects.append(LinkObject{
+        self.link_objects.append(.{
             .assembly_file = .{ .path = self.builder.dupe(path) },
         }) catch unreachable;
     }
 
     pub fn addAssemblyFileSource(self: *LibExeObjStep, source: FileSource) void {
         const source_duped = source.dupe(self.builder);
-        self.link_objects.append(LinkObject{ .assembly_file = source_duped }) catch unreachable;
+        self.link_objects.append(.{ .assembly_file = source_duped }) catch unreachable;
         source_duped.addStepDependencies(&self.step);
     }
 
@@ -1940,12 +1933,12 @@ pub const LibExeObjStep = struct {
     }
 
     pub fn addObjectFileSource(self: *LibExeObjStep, source: FileSource) void {
-        self.link_objects.append(LinkObject{ .static_path = source.dupe(self.builder) }) catch unreachable;
+        self.link_objects.append(.{ .static_path = source.dupe(self.builder) }) catch unreachable;
         source.addStepDependencies(&self.step);
     }
 
     pub fn addObject(self: *LibExeObjStep, obj: *LibExeObjStep) void {
-        assert(obj.kind == Kind.Obj);
+        assert(obj.kind == .obj);
         self.linkLibraryOrObject(obj);
     }
 
@@ -2105,7 +2098,7 @@ pub const LibExeObjStep = struct {
 
     /// If Vcpkg was found on the system, it will be added to include and lib
     /// paths for the specified target.
-    pub fn addVcpkgPaths(self: *LibExeObjStep, linkage: VcpkgLinkage) !void {
+    pub fn addVcpkgPaths(self: *LibExeObjStep, linkage: LibExeObjStep.Linkage) !void {
         // Ideally in the Unattempted case we would call the function recursively
         // after findVcpkgRoot and have only one switch statement, but the compiler
         // cannot resolve the error set.
@@ -2125,7 +2118,7 @@ pub const LibExeObjStep = struct {
             .not_found => return error.VcpkgNotFound,
             .found => |root| {
                 const allocator = self.builder.allocator;
-                const triplet = try self.target.vcpkgTriplet(allocator, linkage);
+                const triplet = try self.target.vcpkgTriplet(allocator, if (linkage == .static) .Static else .Dynamic);
                 defer self.builder.allocator.free(triplet);
 
                 const include_path = try fs.path.join(allocator, &[_][]const u8{ root, "installed", triplet, "include" });
@@ -2141,7 +2134,7 @@ pub const LibExeObjStep = struct {
     }
 
     pub fn setExecCmd(self: *LibExeObjStep, args: []const ?[]const u8) void {
-        assert(self.kind == Kind.Test);
+        assert(self.kind == .@"test");
         const duped_args = self.builder.allocator.alloc(?[]u8, args.len) catch unreachable;
         for (args) |arg, i| {
             duped_args[i] = if (arg) |a| self.builder.dupe(a) else null;
@@ -2151,8 +2144,8 @@ pub const LibExeObjStep = struct {
 
     fn linkLibraryOrObject(self: *LibExeObjStep, other: *LibExeObjStep) void {
         self.step.dependOn(&other.step);
-        self.link_objects.append(LinkObject{ .other_step = other }) catch unreachable;
-        self.include_dirs.append(IncludeDir{ .other_step = other }) catch unreachable;
+        self.link_objects.append(.{ .other_step = other }) catch unreachable;
+        self.include_dirs.append(.{ .other_step = other }) catch unreachable;
 
         // BUG: The following code introduces a order-of-call dependency:
         // var lib = addSharedLibrary(...);
@@ -2208,10 +2201,10 @@ pub const LibExeObjStep = struct {
         zig_args.append(builder.zig_exe) catch unreachable;
 
         const cmd = switch (self.kind) {
-            .Lib => "build-lib",
-            .Exe => "build-exe",
-            .Obj => "build-obj",
-            .Test => "test",
+            .lib => "build-lib",
+            .exe => "build-exe",
+            .obj => "build-obj",
+            .@"test" => "test",
         };
         zig_args.append(cmd) catch unreachable;
 
@@ -2233,12 +2226,12 @@ pub const LibExeObjStep = struct {
                 .static_path => |static_path| try zig_args.append(static_path.getPath(builder)),
 
                 .other_step => |other| switch (other.kind) {
-                    .Exe => unreachable,
-                    .Test => unreachable,
-                    .Obj => {
+                    .exe => unreachable,
+                    .@"test" => unreachable,
+                    .obj => {
                         try zig_args.append(other.getOutputSource().getPath(builder));
                     },
-                    .Lib => {
+                    .lib => {
                         const full_path_lib = other.getOutputLibSource().getPath(builder);
                         try zig_args.append(full_path_lib);
 
@@ -2408,7 +2401,7 @@ pub const LibExeObjStep = struct {
         zig_args.append("--name") catch unreachable;
         zig_args.append(self.name) catch unreachable;
 
-        if (self.kind == Kind.Lib and self.linkage == .dynamic) {
+        if (self.kind == .lib and self.linkage == .dynamic) {
             if (self.version) |version| {
                 zig_args.append("--version") catch unreachable;
                 zig_args.append(builder.fmt("{}", .{version})) catch unreachable;
@@ -2682,7 +2675,7 @@ pub const LibExeObjStep = struct {
             });
         }
 
-        if (self.kind == Kind.Test) {
+        if (self.kind == .@"test") {
             try builder.spawnChild(zig_args.items);
         } else {
             try zig_args.append("--enable-cache");
@@ -2745,13 +2738,15 @@ pub const LibExeObjStep = struct {
             }
         }
 
-        if (self.kind == .Lib and self.linkage == .dynamic and self.version != null and self.target.wantSharedLibSymLinks()) {
+        if (self.kind == .lib and self.linkage == .dynamic and self.version != null and self.target.wantSharedLibSymLinks()) {
             try doAtomicSymLinks(builder.allocator, self.getOutputSource().getPath(builder), self.major_only_filename.?, self.name_only_filename.?);
         }
     }
 };
 
 pub const InstallArtifactStep = struct {
+    pub const base_id = .install_artifact;
+
     step: Step,
     builder: *Builder,
     artifact: *LibExeObjStep,
@@ -2767,22 +2762,22 @@ pub const InstallArtifactStep = struct {
         const self = builder.allocator.create(Self) catch unreachable;
         self.* = Self{
             .builder = builder,
-            .step = Step.init(.InstallArtifact, builder.fmt("install {s}", .{artifact.step.name}), builder.allocator, make),
+            .step = Step.init(.install_artifact, builder.fmt("install {s}", .{artifact.step.name}), builder.allocator, make),
             .artifact = artifact,
             .dest_dir = artifact.override_dest_dir orelse switch (artifact.kind) {
-                .Obj => unreachable,
-                .Test => unreachable,
-                .Exe => InstallDir{ .Bin = {} },
-                .Lib => InstallDir{ .Lib = {} },
+                .obj => unreachable,
+                .@"test" => unreachable,
+                .exe => InstallDir{ .bin = {} },
+                .lib => InstallDir{ .lib = {} },
             },
             .pdb_dir = if (artifact.producesPdbFile()) blk: {
-                if (artifact.kind == .Exe) {
-                    break :blk InstallDir{ .Bin = {} };
+                if (artifact.kind == .exe) {
+                    break :blk InstallDir{ .bin = {} };
                 } else {
-                    break :blk InstallDir{ .Lib = {} };
+                    break :blk InstallDir{ .lib = {} };
                 }
             } else null,
-            .h_dir = if (artifact.kind == .Lib and artifact.emit_h) .Header else null,
+            .h_dir = if (artifact.kind == .lib and artifact.emit_h) .header else null,
         };
         self.step.dependOn(&artifact.step);
         artifact.install_step = self;
@@ -2790,13 +2785,13 @@ pub const InstallArtifactStep = struct {
         builder.pushInstalledFile(self.dest_dir, artifact.out_filename);
         if (self.artifact.isDynamicLibrary()) {
             if (artifact.major_only_filename) |name| {
-                builder.pushInstalledFile(.Lib, name);
+                builder.pushInstalledFile(.lib, name);
             }
             if (artifact.name_only_filename) |name| {
-                builder.pushInstalledFile(.Lib, name);
+                builder.pushInstalledFile(.lib, name);
             }
             if (self.artifact.target.isWindows()) {
-                builder.pushInstalledFile(.Lib, artifact.out_lib_filename);
+                builder.pushInstalledFile(.lib, artifact.out_lib_filename);
             }
         }
         if (self.pdb_dir) |pdb_dir| {
@@ -2830,6 +2825,8 @@ pub const InstallArtifactStep = struct {
 };
 
 pub const InstallFileStep = struct {
+    pub const base_id = .install_file;
+
     step: Step,
     builder: *Builder,
     source: FileSource,
@@ -2845,7 +2842,7 @@ pub const InstallFileStep = struct {
         builder.pushInstalledFile(dir, dest_rel_path);
         return InstallFileStep{
             .builder = builder,
-            .step = Step.init(.InstallFile, builder.fmt("install {s} to {s}", .{ source.getDisplayName(), dest_rel_path }), builder.allocator, make),
+            .step = Step.init(.install_file, builder.fmt("install {s} to {s}", .{ source.getDisplayName(), dest_rel_path }), builder.allocator, make),
             .source = source.dupe(builder),
             .dir = dir.dupe(builder),
             .dest_rel_path = builder.dupePath(dest_rel_path),
@@ -2886,6 +2883,8 @@ pub const InstallDirectoryOptions = struct {
 };
 
 pub const InstallDirStep = struct {
+    pub const base_id = .install_dir;
+
     step: Step,
     builder: *Builder,
     options: InstallDirectoryOptions,
@@ -2897,7 +2896,7 @@ pub const InstallDirStep = struct {
         builder.pushInstalledFile(options.install_dir, options.install_subdir);
         return InstallDirStep{
             .builder = builder,
-            .step = Step.init(.InstallDir, builder.fmt("install {s}/", .{options.source_dir}), builder.allocator, make),
+            .step = Step.init(.install_dir, builder.fmt("install {s}/", .{options.source_dir}), builder.allocator, make),
             .options = options.dupe(builder),
         };
     }
@@ -2938,6 +2937,8 @@ pub const InstallDirStep = struct {
 };
 
 pub const LogStep = struct {
+    pub const base_id = .log;
+
     step: Step,
     builder: *Builder,
     data: []const u8,
@@ -2945,7 +2946,7 @@ pub const LogStep = struct {
     pub fn init(builder: *Builder, data: []const u8) LogStep {
         return LogStep{
             .builder = builder,
-            .step = Step.init(.Log, builder.fmt("log {s}", .{data}), builder.allocator, make),
+            .step = Step.init(.log, builder.fmt("log {s}", .{data}), builder.allocator, make),
             .data = builder.dupe(data),
         };
     }
@@ -2957,6 +2958,8 @@ pub const LogStep = struct {
 };
 
 pub const RemoveDirStep = struct {
+    pub const base_id = .remove_dir;
+
     step: Step,
     builder: *Builder,
     dir_path: []const u8,
@@ -2964,7 +2967,7 @@ pub const RemoveDirStep = struct {
     pub fn init(builder: *Builder, dir_path: []const u8) RemoveDirStep {
         return RemoveDirStep{
             .builder = builder,
-            .step = Step.init(.RemoveDir, builder.fmt("RemoveDir {s}", .{dir_path}), builder.allocator, make),
+            .step = Step.init(.remove_dir, builder.fmt("RemoveDir {s}", .{dir_path}), builder.allocator, make),
             .dir_path = builder.dupePath(dir_path),
         };
     }
@@ -2990,20 +2993,20 @@ pub const Step = struct {
     done_flag: bool,
 
     pub const Id = enum {
-        TopLevel,
-        LibExeObj,
-        InstallArtifact,
-        InstallFile,
-        InstallDir,
-        Log,
-        RemoveDir,
-        Fmt,
-        TranslateC,
-        WriteFile,
-        Run,
-        CheckFile,
-        InstallRaw,
-        Custom,
+        top_level,
+        lib_exe_obj,
+        install_artifact,
+        install_file,
+        install_dir,
+        log,
+        remove_dir,
+        fmt,
+        translate_c,
+        write_file,
+        run,
+        check_file,
+        install_raw,
+        custom,
     };
 
     pub fn init(id: Id, name: []const u8, allocator: *Allocator, makeFn: fn (*Step) anyerror!void) Step {
@@ -3034,23 +3037,11 @@ pub const Step = struct {
     fn makeNoOp(self: *Step) anyerror!void {}
 
     pub fn cast(step: *Step, comptime T: type) ?*T {
-        if (step.id == comptime typeToId(T)) {
+        if (step.id == T.base_id) {
             return @fieldParentPtr(T, "step", step);
         }
         return null;
     }
-
-    fn typeToId(comptime T: type) Id {
-        inline for (@typeInfo(Id).Enum.fields) |f| {
-            if (std.mem.eql(u8, f.name, "TopLevel") or
-                std.mem.eql(u8, f.name, "Custom")) continue;
-
-            if (T == @field(ThisModule, f.name ++ "Step")) {
-                return @field(Id, f.name);
-            }
-        }
-        unreachable;
-    }
 };
 
 fn doAtomicSymLinks(allocator: *Allocator, output_path: []const u8, filename_major_only: []const u8, filename_name_only: []const u8) !void {
@@ -3107,21 +3098,19 @@ const VcpkgRootStatus = enum {
     found,
 };
 
-pub const VcpkgLinkage = std.builtin.LinkMode;
-
 pub const InstallDir = union(enum) {
-    Prefix: void,
-    Lib: void,
-    Bin: void,
-    Header: void,
+    prefix: void,
+    lib: void,
+    bin: void,
+    header: void,
     /// A path relative to the prefix
-    Custom: []const u8,
+    custom: []const u8,
 
     fn dupe(self: InstallDir, builder: *Builder) InstallDir {
-        if (self == .Custom) {
+        if (self == .custom) {
             // Written with this temporary to avoid RLS problems
-            const duped_path = builder.dupe(self.Custom);
-            return .{ .Custom = duped_path };
+            const duped_path = builder.dupe(self.custom);
+            return .{ .custom = duped_path };
         } else {
             return self;
         }
test/src/compare_output.zig
@@ -126,7 +126,7 @@ pub const CompareOutputContext = struct {
                     }
 
                     const basename = case.sources.items[0].filename;
-                    const exe = b.addExecutableSource("test", write_src.getFileSource(basename).?, false);
+                    const exe = b.addExecutableSource("test", write_src.getFileSource(basename).?, .static);
                     exe.setBuildMode(mode);
                     if (case.link_libc) {
                         exe.linkSystemLibrary("c");
@@ -147,7 +147,7 @@ pub const CompareOutputContext = struct {
                 }
 
                 const basename = case.sources.items[0].filename;
-                const exe = b.addExecutableSource("test", write_src.getFileSource(basename).?, false);
+                const exe = b.addExecutableSource("test", write_src.getFileSource(basename).?, .static);
                 if (case.link_libc) {
                     exe.linkSystemLibrary("c");
                 }
test/tests.zig
@@ -656,7 +656,7 @@ pub const StackTracesContext = struct {
         const b = self.b;
         const src_basename = "source.zig";
         const write_src = b.addWriteFile(src_basename, source);
-            const exe = b.addExecutableSource("test", write_src.getFileSource(src_basename).?, false);
+            const exe = b.addExecutableSource("test", write_src.getFileSource(src_basename).?, .static);
         exe.setBuildMode(mode);
 
         const run_and_compare = RunAndCompareStep.create(
@@ -672,6 +672,8 @@ pub const StackTracesContext = struct {
 
 
     const RunAndCompareStep = struct {
+        pub const base_id = .custom;
+
         step: build.Step,
         context: *StackTracesContext,
         exe: *LibExeObjStep,
@@ -690,7 +692,7 @@ pub const StackTracesContext = struct {
             const allocator = context.b.allocator;
             const ptr = allocator.create(RunAndCompareStep) catch unreachable;
             ptr.* = RunAndCompareStep{
-                .step = build.Step.init(.Custom, "StackTraceCompareOutputStep", allocator, make),
+                .step = build.Step.init(.custom, "StackTraceCompareOutputStep", allocator, make),
                 .context = context,
                 .exe = exe,
                 .name = name,
@@ -875,6 +877,8 @@ pub const CompileErrorContext = struct {
     };
 
     const CompileCmpOutputStep = struct {
+        pub const base_id = .custom;
+
         step: build.Step,
         context: *CompileErrorContext,
         name: []const u8,
@@ -911,7 +915,7 @@ pub const CompileErrorContext = struct {
             const allocator = context.b.allocator;
             const ptr = allocator.create(CompileCmpOutputStep) catch unreachable;
             ptr.* = CompileCmpOutputStep{
-                .step = build.Step.init(.Custom, "CompileCmpOutput", allocator, make),
+                .step = build.Step.init(.custom, "CompileCmpOutput", allocator, make),
                 .context = context,
                 .name = name,
                 .test_index = context.test_index,
build.zig
@@ -66,7 +66,7 @@ pub fn build(b: *Builder) !void {
     if (!skip_install_lib_files) {
         b.installDirectory(InstallDirectoryOptions{
             .source_dir = "lib",
-            .install_dir = .Lib,
+            .install_dir = .lib,
             .install_subdir = "zig",
             .exclude_extensions = &[_][]const u8{
                 "README.md",