zig-webgpu-gen

git clone git://git.electrosoup.com/zig-webgpu-gen
Log | Files | Refs

commit c0f799930ce32c93c19540c1700867d0760e0245
parent 57fed9820d5ee620c5fb929526fe68901c6ee74e
Author: Christian Ermann <christianermann@gmail.com>
Date:   Sun,  1 Mar 2026 17:46:04 -0800

Build generated code

Diffstat:
Mbuild.zig | 114++++++++++++++-----------------------------------------------------------------
Msrc/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");