diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e954a1b..e856e29 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -27,7 +27,7 @@ jobs: with: ref: ${{ inputs.release_tag }} - uses: Ledger-Donjon/absolution/.github/actions/setup-zig@main - - run: zig build -Doptimize=${{ matrix.optimize }} -Dstrip=true + - run: zig build -Doptimize=${{ matrix.optimize }} -Dstrip=true -Dversion="${RELEASE_TAG}" - name: Upload tarball uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f #v7.0.0 with: diff --git a/build.zig b/build.zig index 3683422..44c50d6 100644 --- a/build.zig +++ b/build.zig @@ -4,6 +4,14 @@ pub fn build(b: *std.Build) void { const target = b.standardTargetOptions(.{}); const optimize = b.standardOptimizeOption(.{}); const strip = b.option(bool, "strip", "Strip debug info from the binary"); + const version_str = b.option( + []const u8, + "version", + "Version string embedded in the binary (shown in --help)", + ) orelse "dev"; + + const build_options = b.addOptions(); + build_options.addOption([]const u8, "version", version_str); const aro_dep = b.dependency("aro", .{ .target = target, @@ -36,6 +44,7 @@ pub fn build(b: *std.Build) void { }, }), }); + exe.root_module.addOptions("build_options", build_options); b.installArtifact(exe); install_zig_cc_sysroot_headers(b); diff --git a/src/main.zig b/src/main.zig index 55a5098..31261b1 100644 --- a/src/main.zig +++ b/src/main.zig @@ -6,6 +6,7 @@ const builtin = @import("builtin"); const std = @import("std"); const clap = @import("clap"); +const build_options = @import("build_options"); const absolution = @import("absolution"); const Invariant = absolution.Invariant; const Global = absolution.Parser.Global; @@ -107,10 +108,18 @@ const help_opts: clap.HelpOptions = .{ }; fn printHelpAndFail(stream: std.fs.File) !Options { - try clap.helpToFile(stream, clap.Help, &cli, help_opts); + try printHelp(stream); return error.InvalidArgs; } +fn printHelp(stream: std.fs.File) !void { + var banner_buf: [256]u8 = undefined; + var w = stream.writer(&banner_buf); + try w.interface.print("absolution @{s}\n\n", .{build_options.version}); + try w.interface.flush(); + try clap.helpToFile(stream, clap.Help, &cli, help_opts); +} + fn parseArgs(allocator: std.mem.Allocator) !Options { var diag = clap.Diagnostic{}; var res = clap.parse(clap.Help, &cli, clap.parsers.default, .{