master
1const std = @import("std");
2const builtin = @import("builtin");
3
4pub fn build(b: *std.Build) void {
5 const step = b.step("test", "Run simple standalone test cases");
6 b.default_step = step;
7
8 const skip_debug = b.option(bool, "skip_debug", "Skip debug builds") orelse false;
9 const skip_release_safe = b.option(bool, "skip_release_safe", "Skip release-safe builds") orelse false;
10 const skip_release_fast = b.option(bool, "skip_release_fast", "Skip release-fast builds") orelse false;
11 const skip_release_small = b.option(bool, "skip_release_small", "Skip release-small builds") orelse false;
12
13 var optimize_modes_buf: [4]std.builtin.OptimizeMode = undefined;
14 var optimize_modes_len: usize = 0;
15 if (!skip_debug) {
16 optimize_modes_buf[optimize_modes_len] = .Debug;
17 optimize_modes_len += 1;
18 }
19 if (!skip_release_safe) {
20 optimize_modes_buf[optimize_modes_len] = .ReleaseSafe;
21 optimize_modes_len += 1;
22 }
23 if (!skip_release_fast) {
24 optimize_modes_buf[optimize_modes_len] = .ReleaseFast;
25 optimize_modes_len += 1;
26 }
27 if (!skip_release_small) {
28 optimize_modes_buf[optimize_modes_len] = .ReleaseSmall;
29 optimize_modes_len += 1;
30 }
31 const optimize_modes = optimize_modes_buf[0..optimize_modes_len];
32
33 for (cases) |case| {
34 for (optimize_modes) |optimize| {
35 if (!case.all_modes and optimize != .Debug) continue;
36 if (case.os_filter) |os_tag| {
37 if (os_tag != builtin.os.tag) continue;
38 }
39
40 const resolved_target = b.resolveTargetQuery(case.target);
41
42 if (case.is_exe) {
43 const exe = b.addExecutable(.{
44 .name = std.fs.path.stem(case.src_path),
45 .root_module = b.createModule(.{
46 .root_source_file = b.path(case.src_path),
47 .optimize = optimize,
48 .target = resolved_target,
49 }),
50 });
51 if (case.link_libc) exe.root_module.link_libc = true;
52
53 _ = exe.getEmittedBin();
54
55 step.dependOn(&exe.step);
56 }
57
58 if (case.is_test) {
59 const exe = b.addTest(.{
60 .name = std.fs.path.stem(case.src_path),
61 .root_module = b.createModule(.{
62 .root_source_file = b.path(case.src_path),
63 .optimize = optimize,
64 .target = resolved_target,
65 }),
66 });
67 if (case.link_libc) exe.root_module.link_libc = true;
68
69 const run = b.addRunArtifact(exe);
70 step.dependOn(&run.step);
71 }
72 }
73 }
74}
75
76const Case = struct {
77 src_path: []const u8,
78 link_libc: bool = false,
79 all_modes: bool = false,
80 target: std.Target.Query = .{},
81 is_test: bool = false,
82 is_exe: bool = true,
83 /// Run only on this OS.
84 os_filter: ?std.Target.Os.Tag = null,
85};
86
87const cases = [_]Case{
88 .{
89 .src_path = "hello_world/hello.zig",
90 .all_modes = true,
91 },
92 .{
93 .src_path = "hello_world/hello_libc.zig",
94 .link_libc = true,
95 .all_modes = true,
96 },
97 .{
98 .src_path = "cat/main.zig",
99 },
100 // https://github.com/ziglang/zig/issues/6025
101 //.{
102 // .src_path = "issue_9693/main.zig",
103 //},
104 .{
105 .src_path = "issue_7030.zig",
106 .target = .{
107 .cpu_arch = .wasm32,
108 .os_tag = .freestanding,
109 },
110 },
111 .{ .src_path = "issue_12471/main.zig" },
112 .{ .src_path = "guess_number/main.zig" },
113 .{ .src_path = "main_return_error/error_u8.zig" },
114 .{ .src_path = "main_return_error/error_u8_non_zero.zig" },
115 .{ .src_path = "noreturn_call/inline.zig" },
116 .{ .src_path = "noreturn_call/as_arg.zig" },
117 .{ .src_path = "std_enums_big_enums.zig" },
118 .{
119 .src_path = "issue_9402/main.zig",
120 .os_filter = .windows,
121 .link_libc = true,
122 },
123};