aboutsummaryrefslogtreecommitdiff
path: root/lib.rc
blob: 3c713e22137752a3243fbfb2c16f4326f3401f0e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
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
}