1const std = @import("std");
2
3pub fn build(b: *std.Build) void {
4 const target = b.standardTargetOptions(.{});
5
6 const test_step = b.step("test", "Test it");
7 b.default_step = test_step;
8
9 const touch_src = b.path("touch.zig");
10
11 const touch = b.addExecutable(.{
12 .name = "touch",
13 .root_module = b.createModule(.{
14 .root_source_file = touch_src,
15 .optimize = .debug,
16 .target = target,
17 }),
18 });
19 const generated = b.addRunArtifact(touch).addOutputFileArg("subdir" ++ std.fs.path.sep_str ++ "generated.txt");
20
21 const exists_in = b.addExecutable(.{
22 .name = "exists_in",
23 .root_module = b.createModule(.{
24 .root_source_file = b.path("exists_in.zig"),
25 .optimize = .debug,
26 .target = target,
27 }),
28 });
29
30 addTestRun(test_step, exists_in, "run exists_in (known path)", touch_src.dirname(), &.{"touch.zig"});
31 addTestRun(test_step, exists_in, "run exists_in (generated file)", generated.dirname(), &.{"generated.txt"});
32 addTestRun(test_step, exists_in, "run exists_in (generated file multi level)", generated.dirname().dirname(), &.{
33 "subdir" ++ std.fs.path.sep_str ++ "generated.txt",
34 });
35
36 const write_files = b.addWriteFiles();
37 _ = write_files.add("foo.txt", "");
38 const abs_path = write_files.getDirectory();
39 addTestRun(test_step, exists_in, "run exists_in (absolute path)", abs_path, &.{"foo.txt"});
40}
41
42// Runs exe with the parameters [dirname, args...].
43// Expects the exit code to be 0.
44fn addTestRun(
45 test_step: *std.Build.Step,
46 exe: *std.Build.Step.Compile,
47 step_name: []const u8,
48 dirname: std.Build.LazyPath,
49 args: []const []const u8,
50) void {
51 const run = test_step.owner.addRunArtifact(exe);
52 run.setName(step_name);
53 run.addDirectoryArg(dirname);
54 run.addArgs(args);
55 run.expectExitCode(0);
56 test_step.dependOn(&run.step);
57}