summaryrefslogtreecommitdiff
path: root/build.zig
diff options
context:
space:
mode:
Diffstat (limited to 'build.zig')
-rw-r--r--build.zig85
1 files changed, 85 insertions, 0 deletions
diff --git a/build.zig b/build.zig
new file mode 100644
index 0000000..41a8efb
--- /dev/null
+++ b/build.zig
@@ -0,0 +1,85 @@
1const builtin = @import("builtin");
2const std = @import("std");
3
4const Builder = std.build.Builder;
5const SemanticVersion = std.SemanticVersion;
6
7pub fn build(b: *Builder) void {
8 const target = b.standardTargetOptions(.{});
9 const mode = b.standardReleaseOptions();
10
11 const config = b.addOptions();
12 config.addOption(SemanticVersion, "version", getVersion(b));
13
14 const exe = b.addExecutable("zup", "src/main.zig");
15 exe.setTarget(target);
16 exe.setBuildMode(mode);
17 exe.addOptions("zup-config", config);
18 exe.addPackagePath("clap", "libs/clap/clap.zig");
19 exe.addPackagePath("curl", "libs/curl/curl.zig");
20 exe.addPackagePath("libarchive", "libs/libarchive/libarchive.zig");
21 exe.addPackagePath("xdg", "libs/xdg/xdg.zig");
22 exe.addPackagePath("zup", "src/main.zig");
23 exe.linkLibC();
24 exe.linkSystemLibrary("libarchive");
25 exe.linkSystemLibrary("libcurl");
26 if (builtin.target.os.tag == .macos) {
27 // TODO: zig-bug https://github.com/ziglang/zig/issues/11151
28 // libarchive
29 exe.linkSystemLibrary("expat");
30 exe.linkSystemLibrary("iconv");
31 exe.linkSystemLibrary("liblzma");
32 exe.linkSystemLibrary("libzstd");
33 exe.linkSystemLibrary("liblz4");
34 exe.linkSystemLibrary("libb2");
35 exe.linkSystemLibrary("bz2");
36 exe.linkSystemLibrary("z");
37 }
38 exe.install();
39
40 const run_cmd = exe.run();
41 run_cmd.step.dependOn(b.getInstallStep());
42 if (b.args) |args| {
43 run_cmd.addArgs(args);
44 }
45
46 const run_step = b.step("run", "Run the app");
47 run_step.dependOn(&run_cmd.step);
48
49 const exe_tests = b.addTest("src/main.zig");
50 exe_tests.setTarget(target);
51 exe_tests.setBuildMode(mode);
52
53 const test_step = b.step("test", "Run unit tests");
54 test_step.dependOn(&exe_tests.step);
55}
56
57const default_version = SemanticVersion.parse("0.1.0") catch unreachable;
58
59fn getVersion(b: *Builder) SemanticVersion {
60 var out_code: u8 = undefined;
61 const untrimmed = b.execAllowFail(
62 &.{ "git", "-C", b.build_root, "describe", "--tags" },
63 &out_code,
64 .Ignore,
65 ) catch return default_version;
66
67 const git_desc = std.mem.trim(u8, untrimmed, &std.ascii.spaces);
68 // Turn something like 0.0.1-1-g85f815d into 0.0.1-1+g85f815d
69 const ver_str = switch (std.mem.count(u8, git_desc, "-")) {
70 0 => git_desc,
71 2 => blk: {
72 var it = std.mem.split(u8, git_desc, "-");
73 const tag = it.next() orelse unreachable;
74 const height = it.next() orelse unreachable;
75 const hash = it.next() orelse unreachable;
76 break :blk b.fmt("{s}-{s}+{s}", .{ tag, height, hash });
77 },
78 else => {
79 std.log.err("Unexpected `git describe` output: {s}", .{git_desc});
80 return default_version;
81 },
82 };
83
84 return SemanticVersion.parse(ver_str) catch default_version;
85}