const std = @import("std"); pub fn build(b: *std.Build) void { const target = b.standardTargetOptions(.{}); const optimize = b.standardOptimizeOption(.{}); const root_source_file = b.path("src/tmz.zig"); _ = b.addModule("tmz", .{ .root_source_file = root_source_file }); const tests = b.addTest(.{ .root_source_file = root_source_file, .target = target, .optimize = optimize, }); const test_step = b.step("test", "Run unit tests"); test_step.dependOn(&b.addRunArtifact(tests).step); const coverage = b.option(bool, "cover", "Generate test coverage") orelse false; if (coverage) { const coverage_output_dir = b.makeTempPath(); const args = &[_]std.Build.Step.Run.Arg{ .{ .bytes = b.dupe("kcov") }, .{ .bytes = b.dupe("--collect-only") }, .{ .bytes = b.dupe("--include-pattern=src/") }, .{ .bytes = b.dupe("--exclude-pattern=_test") }, .{ .bytes = b.dupe(coverage_output_dir) }, }; const tests_run = b.addRunArtifact(tests); tests_run.has_side_effects = true; tests_run.argv.insertSlice(0, args) catch @panic("OOM"); const merge_step = std.Build.Step.Run.create(b, "merge kcov"); merge_step.has_side_effects = true; merge_step.addArgs(&.{ "kcov", "--merge", b.pathJoin(&.{ coverage_output_dir, "output" }), b.pathJoin(&.{ coverage_output_dir, "test" }), }); merge_step.step.dependOn(&tests_run.step); const install_coverage = b.addInstallDirectory(.{ .source_dir = .{ .cwd_relative = b.pathJoin(&.{ coverage_output_dir, "output" }) }, .install_dir = .{ .custom = "coverage" }, .install_subdir = "", }); install_coverage.step.dependOn(&merge_step.step); test_step.dependOn(&install_coverage.step); } }