summaryrefslogtreecommitdiff
path: root/build.zig
diff options
context:
space:
mode:
Diffstat (limited to 'build.zig')
-rw-r--r--build.zig70
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 @@
1const std = @import("std");
2
3const Build = std.Build;
4const SemanticVersion = std.SemanticVersion;
5
6pub 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
42const default_version = SemanticVersion.parse("0.0.1") catch unreachable;
43
44fn 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}