const builtin = @import("builtin"); const std = @import("std"); const zelda = @import("libs/zelda/build.zig"); const Builder = std.build.Builder; const SemanticVersion = std.SemanticVersion; pub fn build(b: *Builder) !void { const target = b.standardTargetOptions(.{}); const mode = b.standardReleaseOptions(); const config = b.addOptions(); config.addOption(SemanticVersion, "version", getVersion(b)); const exe = b.addExecutable("zup", "src/main.zig"); exe.setTarget(target); exe.setBuildMode(mode); exe.addOptions("zup-config", config); // TODO[https://github.com/ziglang/zig/issues/13551]: Remove this exe.linkSystemLibraryPkgConfigOnly("libcrypto"); try zelda.link(b, exe, target, mode, true); exe.addPackagePath("clap", "libs/clap/clap.zig"); exe.addPackagePath("libarchive", "libs/libarchive/libarchive.zig"); exe.addPackagePath("xdg", "libs/xdg/xdg.zig"); exe.addPackagePath("zup", "src/main.zig"); exe.linkLibC(); // TODO[https://github.com/ziglang/zig/issues/13551]: // Replace this with linkSystemLibrary("archive") exe.linkSystemLibraryPkgConfigOnly("libarchive"); exe.install(); const run_cmd = exe.run(); run_cmd.step.dependOn(b.getInstallStep()); if (b.args) |args| { run_cmd.addArgs(args); } const run_step = b.step("run", "Run the app"); run_step.dependOn(&run_cmd.step); const exe_tests = b.addTest("src/main.zig"); exe_tests.setTarget(target); exe_tests.setBuildMode(mode); const test_step = b.step("test", "Run unit tests"); test_step.dependOn(&exe_tests.step); } const default_version = SemanticVersion.parse("0.1.0") catch unreachable; fn getVersion(b: *Builder) SemanticVersion { var out_code: u8 = undefined; const untrimmed = b.execAllowFail( &.{ "git", "-C", b.build_root, "describe", "--tags" }, &out_code, .Ignore, ) catch return default_version; const git_desc = std.mem.trim(u8, untrimmed, &std.ascii.spaces); // Turn something like 0.0.1-1-g85f815d into 0.0.1-1+g85f815d const ver_str = switch (std.mem.count(u8, git_desc, "-")) { 0 => git_desc, 2 => blk: { var it = std.mem.split(u8, git_desc, "-"); const tag = it.next() orelse unreachable; const height = it.next() orelse unreachable; const hash = it.next() orelse unreachable; break :blk b.fmt("{s}-{s}+{s}", .{ tag, height, hash }); }, else => { std.log.err("Unexpected `git describe` output: {s}", .{git_desc}); return default_version; }, }; return SemanticVersion.parse(ver_str) catch default_version; }