const std = @import("std"); pub fn build(b: *std.Build) !void { 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(.{}); const exe = b.addExecutable(.{ .name = "zx", // 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 = .{ .path = "src/main.zig" }, .target = target, .optimize = optimize, }); // 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(exe); const run_cmd = b.addRunArtifact(exe); // 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()); // 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); } // 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); // Creates a step for unit testing. This only builds the test executable // but does not run it. const main_tests = b.addTest(.{ .root_source_file = .{ .path = "src/main.zig" }, .target = target, .optimize = optimize, }); const run_main_tests = b.addRunArtifact(main_tests); // This creates a build step. It will be visible in the `zig build --help` menu, // and can be selected like this: `zig build test` // This will evaluate the `test` step rather than the default, which is "install". const test_step = b.step("test", "Run library tests"); test_step.dependOn(&run_main_tests.step); // Setup comptime parsing for /lib files var markup_files = std.ArrayList([]const u8).init(b.allocator); var zig_files = std.ArrayList([]const u8).init(b.allocator); defer markup_files.deinit(); defer zig_files.deinit(); var options = b.addOptions(); // Add all files names in the src folder to `files` var dir = try std.fs.cwd().openIterableDir("lib", .{}); var lib_walker = try dir.walk(b.allocator); var walking = true; while (walking) blk: { var file = lib_walker.next() catch { walking = false; break :blk; }; if (file == null) { walking = false; break :blk; } if (file.?.kind == .file) { const path = file.?.path; var split_iter = std.mem.splitBackwardsAny(u8, path, "."); var extension = split_iter.first(); if (std.mem.eql(u8, extension, "zig")) { std.debug.print("Adding zig file {s}...\n", .{path}); try zig_files.append(b.dupe(path)); } else if (std.mem.eql(u8, extension, "html")) { std.debug.print("Adding markup file {s}...\n", .{path}); try markup_files.append(b.dupe(path)); } else { std.debug.print("Unrecognized file extension {s}\t{s}\n", .{extension, path}); } } // std.debug.print("Got entry in `versions:` base: {s}, path: {s}, kind: {any}\n", .{ ver.?.basename, ver.?.path, ver.?.kind }); } // Add the file names as an option to the exe, making it available // as a string array at comptime in main.zig options.addOption([]const []const u8, "zig_files", zig_files.items); options.addOption([]const []const u8, "markup_files", markup_files.items); exe.addOptions("options", options); }