summaryrefslogtreecommitdiff
path: root/scripts/build/run-if-changed.sh
diff options
context:
space:
mode:
authorRichard Qin <richard.qin.x@gmail.com>2026-07-10 23:20:03 +0800
committerRichard Qin <richard.qin.x@gmail.com>2026-07-10 23:20:03 +0800
commit48ef95c24e9ac3d11200b61af617a01b10b507d1 (patch)
tree57f0e26ab98e795b19839b6eece98ca58a4b702d /scripts/build/run-if-changed.sh
parentb9ff206e6bd3f4d67851263a6f2acb5f575cf3b0 (diff)
downloadlume-48ef95c24e9ac3d11200b61af617a01b10b507d1.tar.gz
lume-48ef95c24e9ac3d11200b61af617a01b10b507d1.tar.xz
build: introduce declarative non-recursive build graph
Diffstat (limited to 'scripts/build/run-if-changed.sh')
-rwxr-xr-xscripts/build/run-if-changed.sh45
1 files changed, 45 insertions, 0 deletions
diff --git a/scripts/build/run-if-changed.sh b/scripts/build/run-if-changed.sh
new file mode 100755
index 0000000..6cdc7c4
--- /dev/null
+++ b/scripts/build/run-if-changed.sh
@@ -0,0 +1,45 @@
+#!/bin/sh
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+set -eu
+
+cmdfile=$1
+output=$2
+description=$3
+shift 3
+
+rebuild=false
+if [ ! -e "$output" ] || [ ! -e "$cmdfile" ]; then
+ rebuild=true
+fi
+
+while [ "$#" -gt 0 ] && [ "$1" != "--" ]; do
+ prerequisite=$1
+ shift
+ if [ "$prerequisite" != FORCE ] && [ -e "$prerequisite" ] && \
+ [ "$prerequisite" -nt "$output" ]; then
+ rebuild=true
+ fi
+done
+
+[ "$#" -gt 0 ] || { echo "run-if-changed: missing --" >&2; exit 2; }
+shift
+
+signature=$(printf '%s\0' "$@" | cksum)
+old_signature=
+if [ -e "$cmdfile" ]; then
+ old_signature=$(cat "$cmdfile")
+fi
+if [ "$signature" != "$old_signature" ]; then
+ rebuild=true
+fi
+
+if [ "$rebuild" = true ]; then
+ printf ' %s\n' "$description"
+ mkdir -p "$(dirname "$output")" "$(dirname "$cmdfile")"
+ "$@"
+ tmp="$cmdfile.tmp.$$"
+ printf '%s\n' "$signature" > "$tmp"
+ mv -f "$tmp" "$cmdfile"
+fi
+