-
Notifications
You must be signed in to change notification settings - Fork 0
/
build.zig
41 lines (36 loc) · 1.77 KB
/
build.zig
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
const std = @import("std");
const basename = std.fs.path.basename;
pub fn build(b: *std.Build) !void {
// compile and install
const exe = b.addExecutable(.{
.name = "zigbox",
.root_source_file = b.path("src/zigbox.zig"),
.target = b.standardTargetOptions(.{}),
.optimize = .ReleaseSmall, //b.standardOptimizeOption(.{}),
.strip = true,
});
// generate zig code that imports src/commands/*.zig
var cmd_dir = try std.fs.cwd().openDir("src/commands", .{ .iterate = true });
defer cmd_dir.close();
var walker = try cmd_dir.walk(b.allocator);
defer walker.deinit();
var code = std.ArrayList(u8).init(b.allocator); // will contain the zig code
defer code.deinit();
// loop through the zig files
try code.writer().print("// This file is generated by build.zig\n", .{});
try code.writer().print("const std = @import(\"std\");\n\n", .{});
try code.writer().print("pub const cmds = std.StaticStringMap(*const fn (args: [][]const u8) u8).initComptime(.{{\n", .{});
while (try walker.next()) |entry| {
if (entry.kind == .file and std.mem.endsWith(u8, entry.basename, ".zig") and !std.mem.containsAtLeast(u8, entry.path, 1, "/")) {
try code.writer().print(" .{{ \"{s}\", @import(\"commands/{s}\").entry }},\n", .{ entry.path[0 .. entry.path.len - 4], entry.path });
}
}
try code.writer().print("}});\n", .{});
// save zig code
var file = try std.fs.cwd().createFile("src/commands.zig", .{ .truncate = true });
defer file.close();
_ = try file.writeAll(code.items);
// allow zigbox to @import("commands").cmds;
exe.root_module.addAnonymousImport("commands", .{ .root_source_file = .{ .cwd_relative = "src/commands.zig" } });
b.installArtifact(exe);
}