From f5a1dca0b18f0f67e967dbe61016f403bf9c8e45 Mon Sep 17 00:00:00 2001 From: Nathan Anderson Date: Thu, 26 Oct 2023 18:54:59 -0600 Subject: [PATCH] initial commit --- .gitignore | 0 build.zig | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.zig | 12 ++++++ 3 files changed, 117 insertions(+) create mode 100644 .gitignore create mode 100644 build.zig create mode 100644 src/main.zig diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/build.zig b/build.zig new file mode 100644 index 0000000..b80f909 --- /dev/null +++ b/build.zig @@ -0,0 +1,105 @@ +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); +} diff --git a/src/main.zig b/src/main.zig new file mode 100644 index 0000000..8255398 --- /dev/null +++ b/src/main.zig @@ -0,0 +1,12 @@ +const std = @import("std"); +const options = @import("options"); + +pub fn main() void { + std.debug.print("Ello there\n", .{}); + comptime { + const route = @import(options.zig_files[0]); + route.get(); + // @compileLog("Got option zig file " ++ options.zig_files[0] ++ "\n"); + } + return; +}