1const std = @import("std");
2const zzdoc = @import("zzdoc");
3
4/// Must be kept in sync with git tags
5const version: std.SemanticVersion = .{ .major = 0, .minor = 2, .patch = 0 };
6
7pub fn build(b: *std.Build) void {
8 const target = b.standardTargetOptions(.{});
9 const optimize = b.standardOptimizeOption(.{});
10
11 // manpages
12 {
13 var man_step = zzdoc.addManpageStep(b, .{
14 .root_doc_dir = b.path("docs/"),
15 });
16
17 const install_step = man_step.addInstallStep(.{});
18 b.default_step.dependOn(&install_step.step);
19 }
20
21 const exe_mod = b.createModule(.{
22 .root_source_file = b.path("src/main.zig"),
23 .target = target,
24 .optimize = optimize,
25 });
26
27 const io_dep = b.dependency("ourio", .{ .optimize = optimize, .target = target });
28 const io_mod = io_dep.module("ourio");
29 exe_mod.addImport("ourio", io_mod);
30
31 const zeit_dep = b.dependency("zeit", .{ .optimize = optimize, .target = target });
32 const zeit_mod = zeit_dep.module("zeit");
33 exe_mod.addImport("zeit", zeit_mod);
34
35 const opts = b.addOptions();
36 const version_string = genVersion(b) catch |err| {
37 std.debug.print("{}", .{err});
38 @compileError("couldn't get version");
39 };
40 opts.addOption([]const u8, "version", version_string);
41
42 exe_mod.addOptions("build_options", opts);
43
44 const exe = b.addExecutable(.{
45 .name = "lsr",
46 .root_module = exe_mod,
47 });
48
49 b.installArtifact(exe);
50
51 const run_cmd = b.addRunArtifact(exe);
52
53 run_cmd.step.dependOn(b.getInstallStep());
54
55 if (b.args) |args| {
56 run_cmd.addArgs(args);
57 }
58
59 const run_step = b.step("run", "Run the app");
60 run_step.dependOn(&run_cmd.step);
61
62 const exe_unit_tests = b.addTest(.{
63 .root_module = exe_mod,
64 });
65
66 const run_exe_unit_tests = b.addRunArtifact(exe_unit_tests);
67
68 const test_step = b.step("test", "Run unit tests");
69 test_step.dependOn(&run_exe_unit_tests.step);
70}
71
72fn genVersion(b: *std.Build) ![]const u8 {
73 if (!std.process.can_spawn) {
74 std.debug.print("error: version info cannot be retrieved from git. Zig version must be provided using -Dversion-string\n", .{});
75 std.process.exit(1);
76 }
77 const version_string = b.fmt("v{d}.{d}.{d}", .{ version.major, version.minor, version.patch });
78
79 var code: u8 = undefined;
80 const git_describe_untrimmed = b.runAllowFail(&[_][]const u8{
81 "git",
82 "-C",
83 b.build_root.path orelse ".",
84 "describe",
85 "--match",
86 "*.*.*",
87 "--tags",
88 "--abbrev=9",
89 }, &code, .Ignore) catch {
90 return version_string;
91 };
92 if (!std.mem.startsWith(u8, git_describe_untrimmed, version_string)) {
93 std.debug.print("error: tagged version does not match internal version\n", .{});
94 std.process.exit(1);
95 }
96 return std.mem.trim(u8, git_describe_untrimmed, " \n\r");
97}