diff options
Diffstat (limited to 'build.zig')
| -rw-r--r-- | build.zig | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/build.zig b/build.zig new file mode 100644 index 0000000..caf84f5 --- /dev/null +++ b/build.zig | |||
| @@ -0,0 +1,70 @@ | |||
| 1 | const std = @import("std"); | ||
| 2 | |||
| 3 | const Build = std.Build; | ||
| 4 | const SemanticVersion = std.SemanticVersion; | ||
| 5 | |||
| 6 | pub fn build(b: *Build) void { | ||
| 7 | const target = b.standardTargetOptions(.{}); | ||
| 8 | const optimize = b.standardOptimizeOption(.{}); | ||
| 9 | |||
| 10 | const sqlite = b.dependency("sqlite", .{ | ||
| 11 | .target = target, | ||
| 12 | .optimize = optimize, | ||
| 13 | }); | ||
| 14 | |||
| 15 | const version = getVersion(b); | ||
| 16 | |||
| 17 | const config = b.addOptions(); | ||
| 18 | config.addOption(SemanticVersion, "version", version); | ||
| 19 | |||
| 20 | const exe = b.addExecutable(.{ | ||
| 21 | .name = "ukkobot", | ||
| 22 | .version = version, | ||
| 23 | .root_source_file = b.path("src/main.zig"), | ||
| 24 | .target = target, | ||
| 25 | .optimize = optimize, | ||
| 26 | }); | ||
| 27 | exe.root_module.addOptions("ukkobot-config", config); | ||
| 28 | exe.root_module.addImport("sqlite", sqlite.module("sqlite")); | ||
| 29 | exe.linkLibrary(sqlite.artifact("sqlite")); | ||
| 30 | b.installArtifact(exe); | ||
| 31 | |||
| 32 | const run_cmd = b.addRunArtifact(exe); | ||
| 33 | run_cmd.step.dependOn(b.getInstallStep()); | ||
| 34 | if (b.args) |args| { | ||
| 35 | run_cmd.addArgs(args); | ||
| 36 | } | ||
| 37 | |||
| 38 | const run_step = b.step("run", "Run the app"); | ||
| 39 | run_step.dependOn(&run_cmd.step); | ||
| 40 | } | ||
| 41 | |||
| 42 | const default_version = SemanticVersion.parse("0.0.1") catch unreachable; | ||
| 43 | |||
| 44 | fn getVersion(b: *Build) SemanticVersion { | ||
| 45 | var out_code: u8 = undefined; | ||
| 46 | const untrimmed = b.runAllowFail( | ||
| 47 | &.{ "git", "-C", b.build_root.path.?, "describe", "--tags" }, | ||
| 48 | &out_code, | ||
| 49 | .Ignore, | ||
| 50 | ) catch return default_version; | ||
| 51 | |||
| 52 | const git_desc = std.mem.trim(u8, untrimmed, &std.ascii.whitespace); | ||
| 53 | // Turn something like 0.0.1-1-g85f815d into 0.0.1-1+g85f815d | ||
| 54 | const ver_str = switch (std.mem.count(u8, git_desc, "-")) { | ||
| 55 | 0 => git_desc, | ||
| 56 | 2 => blk: { | ||
| 57 | var it = std.mem.splitScalar(u8, git_desc, '-'); | ||
| 58 | const tag = it.next() orelse unreachable; | ||
| 59 | const height = it.next() orelse unreachable; | ||
| 60 | const hash = it.next() orelse unreachable; | ||
| 61 | break :blk b.fmt("{s}-{s}+{s}", .{ tag, height, hash }); | ||
| 62 | }, | ||
| 63 | else => { | ||
| 64 | std.log.err("Unexpected `git describe` output: {s}", .{git_desc}); | ||
| 65 | return default_version; | ||
| 66 | }, | ||
| 67 | }; | ||
| 68 | |||
| 69 | return SemanticVersion.parse(ver_str) catch default_version; | ||
| 70 | } | ||