-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathbuild.zig
More file actions
101 lines (81 loc) · 3.42 KB
/
build.zig
File metadata and controls
101 lines (81 loc) · 3.42 KB
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
const std = @import("std");
pub fn build(b: *std.Build) void {
const exe_name = b.option([]const u8, "exe_name", "Name of the executable") orelse "httpspec";
const dependencies = [_][]const u8{
"clap",
"regex",
"curl",
};
const target = b.standardTargetOptions(.{});
const optimize = b.standardOptimizeOption(.{});
const exe_mod = b.createModule(.{
.root_source_file = b.path("src/main.zig"),
.target = target,
.optimize = optimize,
});
const exe = b.addExecutable(.{
.name = exe_name,
.root_module = exe_mod,
});
for (dependencies) |dependency| {
const dep = b.dependency(dependency, .{ .target = target, .optimize = optimize });
exe.root_module.addImport(dependency, dep.module(dependency));
}
exe.linkLibC();
b.installArtifact(exe);
const run_cmd = b.addRunArtifact(exe);
run_cmd.step.dependOn(b.getInstallStep());
if (b.args) |args| {
run_cmd.addArgs(args);
}
const run_step = b.step("run", "Run the app");
run_step.dependOn(&run_cmd.step);
const exe_unit_tests = b.addTest(.{
.root_module = exe_mod,
});
const run_exe_unit_tests = b.addRunArtifact(exe_unit_tests);
// Automatically find all Zig files in src/ and subdirectories and add test steps for each
var zig_files: std.ArrayList([]const u8) = .empty;
defer zig_files.deinit(b.allocator);
findZigFiles(b, &zig_files, "src") catch unreachable;
var test_run_steps: std.ArrayList(*std.Build.Step) = .empty;
defer test_run_steps.deinit(b.allocator);
for (zig_files.items) |zig_file| {
// Skip main.zig since it's already covered by exe_unit_tests
if (std.mem.endsWith(u8, zig_file, "/main.zig")) continue;
const test_artifact = b.addTest(.{
.root_module = b.createModule(.{
.root_source_file = b.path(zig_file),
.target = target,
.optimize = optimize,
}),
});
// Add dependencies to individual test artifacts
for (dependencies) |dependency| {
const dep = b.dependency(dependency, .{ .target = target, .optimize = optimize });
test_artifact.root_module.addImport(dependency, dep.module(dependency));
}
const run_test = b.addRunArtifact(test_artifact);
test_run_steps.append(b.allocator, &run_test.step) catch unreachable;
}
const test_step = b.step("test", "Run unit tests");
test_step.dependOn(&run_exe_unit_tests.step);
for (test_run_steps.items) |step| {
test_step.dependOn(step);
}
}
fn findZigFiles(b: *std.Build, files: *std.ArrayList([]const u8), dir_path: []const u8) !void {
var dir = try std.fs.cwd().openDir(dir_path, .{ .iterate = true });
defer dir.close();
var it = dir.iterate();
while (try it.next()) |entry| {
if (entry.kind == .file and std.mem.endsWith(u8, entry.name, ".zig")) {
const full_path = try std.fs.path.join(b.allocator, &[_][]const u8{ dir_path, entry.name });
try files.append(b.allocator, full_path);
} else if (entry.kind == .directory and !std.mem.eql(u8, entry.name, ".") and !std.mem.eql(u8, entry.name, "..")) {
const subdir = try std.fs.path.join(b.allocator, &[_][]const u8{ dir_path, entry.name });
defer b.allocator.free(subdir);
try findZigFiles(b, files, subdir);
}
}
}