aboutsummaryrefslogtreecommitdiff
path: root/lib.rc
diff options
context:
space:
mode:
Diffstat (limited to 'lib.rc')
-rw-r--r--lib.rc84
1 files changed, 84 insertions, 0 deletions
diff --git a/lib.rc b/lib.rc
new file mode 100644
index 0000000..4b03274
--- /dev/null
+++ b/lib.rc
@@ -0,0 +1,84 @@
+# Various helper functions for redo
+# URL: https://github.com/cemkeylan/redo-lib
+# LICENSE: CC0 (Public Domain)
+
+# 'basename' is not used by the functions here, but it doesn't mean that it
+# cannot be used at all.
+# shellcheck disable=2034
+target=$1 basename=$2 dest=$3
+
+# Add dependency to these files as well.
+redo-ifchange lib.rc config.rc
+
+setv() {
+ # Usage: setv [variable = [key...]]
+ #
+ # Variable setting function that somewhat imitates the Makefile syntax.
+ # - Using = sets the variable.
+ # - Using ?= sets the variable if it is unset.
+ # - Using += increments to a variable.
+ [ "$3" ] || {
+ printf '%s\n' "Faulty variable syntax" >&2
+ exit 1
+ }
+ var=$1 sym=$2; shift 2
+ case "$sym" in
+ ==) export "$var=$*" ;;
+ =) eval "[ \"\$$var\" ]" || export "$var=$*" ;;
+ +=) eval export "$var=\$$var $*"
+ esac
+}
+
+targcheck() {
+ # Usage: targcheck [target...]
+ #
+ # Check if current target is one of the given arguments of this function.
+ # Returns 0 if target is one of the arguments, returns 1 if not.
+ for arg; do
+ [ "$arg" = "$target" ] && return 0
+ done; return 1
+}
+
+PHONY() {
+ # Usage: PHONY [target...]
+ #
+ # Function that resembles the .PHONY: target on the classic 'make' system.
+ # You can either use it without an argument on a single target, or specify
+ # multiple targets.
+ if [ -z "$1" ] || targcheck "$@"; then
+ # There is no guarantee that the value of dest will not be modified
+ # during the operation, we want to evaluate the value of $dest as soon
+ # as possible
+ # shellcheck disable=2064
+ trap "rm -f $dest" EXIT INT
+ fi
+}
+
+expsuf() {
+ # Usage: expsuf [suffix [item...]]
+ #
+ # Expand suffix for the given list.
+ suffix=$1 buf=; shift
+ for i; do buf="$buf $i$suffix "; done; printf %s "$buf"
+}
+
+repsuf() {
+ # Usage: repsuf [old-suffix new-suffix [item...]]
+ #
+ # Replace old-suffix with new-suffix on list.
+ oldsuffix=$1 newsuffix=$2 buf=; shift 2
+ for i; do buf="$buf ${i%$oldsuffix}$newsuffix "; done; printf %s "$buf"
+}
+
+redo_clean() {
+ # Clean function for various redo implementations
+ [ -r .do_built ] && {
+ while read -r file; do
+ [ -d "$file" ] || rm -f "$file"
+ done < .do_built
+ }
+ find . -type f \( -name '*.tmp' -o -name '*.did' -o -name '.dep*' -o -name '.target*' \) \
+ -exec rm -f -- {} +
+ [ "$DO_BUILT" ] || find . -name '.do_built*' -exec rm -rf -- {} +
+ [ "$REDO_BASE" ] || rm -rf -- .redo
+}