diff options
Diffstat (limited to 'build.zig')
| -rw-r--r-- | build.zig | 85 |
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 @@ | |||
| 1 | const builtin = @import("builtin"); | ||
| 2 | const std = @import("std"); | ||
| 3 | |||
| 4 | const Builder = std.build.Builder; | ||
| 5 | const SemanticVersion = std.SemanticVersion; | ||
| 6 | |||
| 7 | pub 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 | |||
| 57 | const default_version = SemanticVersion.parse("0.1.0") catch unreachable; | ||
| 58 | |||
| 59 | fn 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 | } | ||