commit c0f799930ce32c93c19540c1700867d0760e0245
parent 57fed9820d5ee620c5fb929526fe68901c6ee74e
Author: Christian Ermann <christianermann@gmail.com>
Date: Sun, 1 Mar 2026 17:46:04 -0800
Build generated code
Diffstat:
| M | build.zig | | | 114 | ++++++++++++++----------------------------------------------------------------- |
| M | src/main.zig | | | 11 | +++++++++-- |
2 files changed, 29 insertions(+), 96 deletions(-)
diff --git a/build.zig b/build.zig
@@ -1,116 +1,42 @@
const std = @import("std");
-// Although this function looks imperative, note that its job is to
-// declaratively construct a build graph that will be executed by an external
-// runner.
pub fn build(b: *std.Build) void {
- // Standard target options allows the person running `zig build` to choose
- // what target to build for. Here we do not override the defaults, which
- // means any target is allowed, and the default is native. Other options
- // for restricting supported target set are available.
const target = b.standardTargetOptions(.{});
-
- // Standard optimization options allow the person running `zig build` to select
- // between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall. Here we do not
- // set a preferred release mode, allowing the user to decide how to optimize.
const optimize = b.standardOptimizeOption(.{});
-
- // This creates a "module", which represents a collection of source files alongside
- // some compilation options, such as optimization mode and linked system libraries.
- // Every executable or library we compile will be based on one or more modules.
- const lib_mod = b.createModule(.{
- // `root_source_file` is the Zig "entry point" of the module. If a module
- // only contains e.g. external object files, you can make this `null`.
- // In this case the main source file is merely a path, however, in more
- // complicated build scripts, this could be a generated file.
- .root_source_file = b.path("src/root.zig"),
- .target = target,
- .optimize = optimize,
- });
-
- // We will also create a module for our other entry point, 'main.zig'.
const exe_mod = b.createModule(.{
- // `root_source_file` is the Zig "entry point" of the module. If a module
- // only contains e.g. external object files, you can make this `null`.
- // In this case the main source file is merely a path, however, in more
- // complicated build scripts, this could be a generated file.
.root_source_file = b.path("src/main.zig"),
.target = target,
.optimize = optimize,
});
-
- // Modules can depend on one another using the `std.Build.Module.addImport` function.
- // This is what allows Zig source code to use `@import("foo")` where 'foo' is not a
- // file path. In this case, we set up `exe_mod` to import `lib_mod`.
- exe_mod.addImport("wgpu_gen_zig_lib", lib_mod);
-
- // Now, we will create a static library based on the module we created above.
- // This creates a `std.Build.Step.Compile`, which is the build step responsible
- // for actually invoking the compiler.
- const lib = b.addLibrary(.{
- .linkage = .static,
- .name = "wgpu_gen_zig",
- .root_module = lib_mod,
- });
-
- // This declares intent for the library to be installed into the standard
- // location when the user invokes the "install" step (the default step when
- // running `zig build`).
- b.installArtifact(lib);
-
- // This creates another `std.Build.Step.Compile`, but this one builds an executable
- // rather than a static library.
const exe = b.addExecutable(.{
- .name = "wgpu_gen_zig",
+ .name = "webgpu-gen",
.root_module = exe_mod,
});
-
- // This declares intent for the executable to be installed into the
- // standard location when the user invokes the "install" step (the default
- // step when running `zig build`).
- b.installArtifact(exe);
-
- // This *creates* a Run step in the build graph, to be executed when another
- // step is evaluated that depends on it. The next line below will establish
- // such a dependency.
const run_cmd = b.addRunArtifact(exe);
+ const gen_file = run_cmd.addOutputFileArg("webgpu.zig");
- // By making the run step depend on the install step, it will be run from the
- // installation directory rather than directly from within the cache directory.
- // This is not necessary, however, if the application depends on other installed
- // files, this ensures they will be present and in the expected location.
- run_cmd.step.dependOn(b.getInstallStep());
+ const install_raw = b.addInstallFile(gen_file, "webgpu-raw.zig");
+ install_raw.step.dependOn(&run_cmd.step);
+ b.getInstallStep().dependOn(&install_raw.step);
- // This allows the user to pass arguments to the application in the build
- // command itself, like this: `zig build run -- arg1 arg2 etc`
- if (b.args) |args| {
- run_cmd.addArgs(args);
- }
+ const fmt_cmd = b.addSystemCommand(&.{ b.graph.zig_exe, "fmt" });
+ fmt_cmd.addFileArg(gen_file);
- // This creates a build step. It will be visible in the `zig build --help` menu,
- // and can be selected like this: `zig build run`
- // This will evaluate the `run` step rather than the default, which is "install".
- const run_step = b.step("run", "Run the app");
- run_step.dependOn(&run_cmd.step);
+ const install_fmt = b.addInstallFile(gen_file, "webgpu.zig");
+ install_fmt.step.dependOn(&fmt_cmd.step);
+ b.getInstallStep().dependOn(&install_fmt.step);
- // Creates a step for unit testing. This only builds the test executable
- // but does not run it.
- const lib_unit_tests = b.addTest(.{
- .root_module = lib_mod,
+ const lib_mod = b.createModule(.{
+ .root_source_file = gen_file,
+ .target = target,
+ .optimize = optimize,
});
-
- const run_lib_unit_tests = b.addRunArtifact(lib_unit_tests);
-
- const exe_unit_tests = b.addTest(.{
- .root_module = exe_mod,
+ const lib = b.addLibrary(.{
+ .linkage = .static,
+ .name = "webgpu",
+ .root_module = lib_mod,
});
+ lib.step.dependOn(&fmt_cmd.step);
- const run_exe_unit_tests = b.addRunArtifact(exe_unit_tests);
-
- // Similar to creating the run step earlier, this exposes a `test` step to
- // the `zig build --help` menu, providing a way for the user to request
- // running the unit tests.
- const test_step = b.step("test", "Run unit tests");
- test_step.dependOn(&run_lib_unit_tests.step);
- test_step.dependOn(&run_exe_unit_tests.step);
+ b.installArtifact(lib);
}
diff --git a/src/main.zig b/src/main.zig
@@ -487,7 +487,9 @@ const EnumEntry = struct {
_ = value;
return error.Unimplemented;
}
+ try writer.writeAll("@\"");
try toLowercase(self.name, writer);
+ try writer.writeAll("\"");
}
};
@@ -537,7 +539,7 @@ const BitFlag = struct {
try writer.print(".{s} = true,\n", .{ value });
}
try renderIndent(indent + 2, writer);
- try writer.writeAll("}\n");
+ try writer.writeAll("};\n");
try renderIndent(indent + 1, writer);
try writer.writeAll("}\n");
}
@@ -760,6 +762,11 @@ pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
const allocator = gpa.allocator();
+ const args = try std.process.argsAlloc(allocator);
+ const out_path = args[1];
+ const out_file = try std.fs.cwd().createFile(out_path, .{});
+ defer out_file.close();
+
const file = try std.fs.cwd().openFile("webgpu.json", .{});
defer file.close();
@@ -776,7 +783,7 @@ pub fn main() !void {
);
defer parsed.deinit();
- const stdout = std.io.getStdOut().writer();
+ const stdout = out_file.writer();
try renderHeader(stdout);
try stdout.writeAll("// constants\n");