summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsteven-na <noreply.github@stvnc.dev>2026-08-01 23:31:27 -0700
committersteven-na <noreply.github@stvnc.dev>2026-08-01 23:31:27 -0700
commit484b4eb7ec20d01230f22e159c33b7225af34ab9 (patch)
treef545b98b722451af18383f5db7925c97087e5e64
parentf7bda3da4fb6d6cd1fd449e865885a50618c78e4 (diff)
Automatic build versioning
-rw-r--r--.gitignore1
-rw-r--r--Justfile15
-rwxr-xr-xscripts/gen-version.sh40
-rw-r--r--src/version.c19
-rw-r--r--src/version.h15
5 files changed, 84 insertions, 6 deletions
diff --git a/.gitignore b/.gitignore
index 9d149d8..00d254b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,3 +5,4 @@ build/
*.out
compile_commands.json
.cache/
+src/version_gen.h
diff --git a/Justfile b/Justfile
index 2edea1e..d1f2d94 100644
--- a/Justfile
+++ b/Justfile
@@ -13,23 +13,26 @@ default:
build: build-static build-shared
-build-static:
+gen-version type="release":
+ ./scripts/gen-version.sh {{type}}
+
+build-static: (gen-version "release")
mkdir -p {{build_dir}}
cd {{build_dir}} && {{cc}} {{cflags}} {{extra_cflags}} -c ../{{src_dir}}/*.c
ar rcs {{build_dir}}/lib{{lib}}.a {{build_dir}}/*.o
-build-shared:
+build-shared: (gen-version "release")
mkdir -p {{build_dir}}
cd {{build_dir}} && {{cc}} {{cflags}} {{extra_cflags}} -c ../{{src_dir}}/*.c
{{cc}} -shared -o {{build_dir}}/lib{{lib}}.so {{build_dir}}/*.o {{lflags}}
-build-release:
+build-release: (gen-version "release")
mkdir -p {{build_dir}}
cd {{build_dir}} && {{cc}} {{cflags}} {{extra_cflags}} -O3 -DNDEBUG -c ../{{src_dir}}/*.c
ar rcs {{build_dir}}/lib{{lib}}-release.a {{build_dir}}/*.o
{{cc}} -shared -o {{build_dir}}/lib{{lib}}-release.so {{build_dir}}/*.o {{lflags}}
-build-debug:
+build-debug: (gen-version "debug")
mkdir -p {{build_dir}}
cd {{build_dir}} && {{cc}} {{cflags}} {{extra_cflags}} -g -O0 -fsanitize=address,undefined -fno-omit-frame-pointer -c ../{{src_dir}}/*.c
ar rcs {{build_dir}}/lib{{lib}}-debug.a {{build_dir}}/*.o
@@ -76,12 +79,12 @@ install-vendor dir: build
uninstall-vendor dir:
rm -rf {{dir}}/vendor/{{lib}}
-test-all:
+test-all: (gen-version "debug")
mkdir -p {{build_dir}}
{{cc}} {{cflags}} {{extra_cflags}} {{test_dir}}/*.c {{src_dir}}/*.c -o {{build_dir}}/test -lcriterion {{lflags}}
./{{build_dir}}/test
-coverage:
+coverage: (gen-version "debug")
mkdir -p {{build_dir}}/cov-src {{build_dir}}/cov-tests
cd {{build_dir}}/cov-src && {{cc}} {{cflags}} --coverage -c ../../{{src_dir}}/*.c
cd {{build_dir}}/cov-tests && {{cc}} {{cflags}} --coverage -c ../../{{test_dir}}/*.c
diff --git a/scripts/gen-version.sh b/scripts/gen-version.sh
new file mode 100755
index 0000000..ffe7f43
--- /dev/null
+++ b/scripts/gen-version.sh
@@ -0,0 +1,40 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+cd "$(dirname "$0")/.."
+
+build_type="${1:-release}"
+out="src/version_gen.h"
+tmp="$(mktemp)"
+
+tag=$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0")
+version="${tag#v}"
+major="${version%%.*}"
+rest="${version#*.}"
+minor="${rest%%.*}"
+patch="${rest#*.}"
+patch="${patch%%-*}"
+
+commit=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown")
+if ! git diff --quiet 2>/dev/null || ! git diff --cached --quiet 2>/dev/null; then
+ commit="${commit}-dirty"
+fi
+
+cat > "$tmp" <<EOF
+#pragma once
+
+#define STEEZ_VERSION_MAJOR $major
+#define STEEZ_VERSION_MINOR $minor
+#define STEEZ_VERSION_PATCH $patch
+#define STEEZ_VERSION_STRING "$version"
+#define STEEZ_GIT_COMMIT "$commit"
+#define STEEZ_BUILD_DATE "$(date +%Y-%m-%d)"
+#define STEEZ_BUILD_TIME "$(date +%H:%M:%S)"
+#define STEEZ_BUILD_TYPE "$build_type"
+EOF
+
+if ! cmp -s "$tmp" "$out" 2>/dev/null; then
+ mv "$tmp" "$out"
+else
+ rm "$tmp"
+fi
diff --git a/src/version.c b/src/version.c
new file mode 100644
index 0000000..df10b08
--- /dev/null
+++ b/src/version.c
@@ -0,0 +1,19 @@
+#include "version.h"
+#include "version_gen.h"
+
+char const *steez_version_string(void) {
+ return STEEZ_VERSION_STRING;
+}
+
+steez_build_info_t steez_build_info(void) {
+ return (steez_build_info_t){
+ .major = STEEZ_VERSION_MAJOR,
+ .minor = STEEZ_VERSION_MINOR,
+ .patch = STEEZ_VERSION_PATCH,
+ .string = STEEZ_VERSION_STRING,
+ .git_commit = STEEZ_GIT_COMMIT,
+ .build_date = STEEZ_BUILD_DATE,
+ .build_time = STEEZ_BUILD_TIME,
+ .build_type = STEEZ_BUILD_TYPE,
+ };
+}
diff --git a/src/version.h b/src/version.h
new file mode 100644
index 0000000..6042d27
--- /dev/null
+++ b/src/version.h
@@ -0,0 +1,15 @@
+#pragma once
+
+#include "common.h"
+
+typedef struct {
+ i32 major, minor, patch;
+ char const *string;
+ char const *git_commit;
+ char const *build_date;
+ char const *build_time;
+ char const *build_type;
+} steez_build_info_t;
+
+char const *steez_version_string(void);
+steez_build_info_t steez_build_info(void);