From 48ef95c24e9ac3d11200b61af617a01b10b507d1 Mon Sep 17 00:00:00 2001 From: Richard Qin Date: Fri, 10 Jul 2026 23:20:03 +0800 Subject: build: introduce declarative non-recursive build graph --- scripts/build/run-if-changed.sh | 45 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100755 scripts/build/run-if-changed.sh (limited to 'scripts/build/run-if-changed.sh') 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 + -- cgit v1.2.3