1makeWrapper() {
2 local original=$1
3 local wrapper=$2
4 local params varName value command separator n fileNames
5 local flagsBefore flags
6
7 mkdir -p "$(dirname $wrapper)"
8
9 echo "#! $SHELL -e" > $wrapper
10
11 params=("$@")
12 for ((n = 2; n < ${#params[*]}; n += 1)); do
13 p=${params[$n]}
14
15 if test "$p" = "--set"; then
16 varName=${params[$((n + 1))]}
17 value=${params[$((n + 2))]}
18 n=$((n + 2))
19 echo "export $varName=$value" >> $wrapper
20 fi
21
22 if test "$p" = "--run"; then
23 command=${params[$((n + 1))]}
24 n=$((n + 1))
25 echo "$command" >> $wrapper
26 fi
27
28 if test "$p" = "--suffix" -o "$p" = "--prefix"; then
29 varName=${params[$((n + 1))]}
30 separator=${params[$((n + 2))]}
31 value=${params[$((n + 3))]}
32 n=$((n + 3))
33 if test -n "$value"; then
34 if test "$p" = "--suffix"; then
35 echo "export $varName=\$$varName\${$varName:+$separator}$value" >> $wrapper
36 else
37 echo "export $varName=$value\${$varName:+$separator}\$$varName" >> $wrapper
38 fi
39 fi
40 fi
41
42 if test "$p" = "--suffix-each"; then
43 varName=${params[$((n + 1))]}
44 separator=${params[$((n + 2))]}
45 values=${params[$((n + 3))]}
46 n=$((n + 3))
47 for value in $values; do
48 echo "export $varName=\$$varName\${$varName:+$separator}$value" >> $wrapper
49 done
50 fi
51
52 if test "$p" = "--suffix-contents" -o "$p" = "--prefix-contents"; then
53 varName=${params[$((n + 1))]}
54 separator=${params[$((n + 2))]}
55 fileNames=${params[$((n + 3))]}
56 n=$((n + 3))
57 for fileName in $fileNames; do
58 if test "$p" = "--suffix-contents"; then
59 echo "export $varName=\$$varName\${$varName:+$separator}$(cat $fileName)" >> $wrapper
60 else
61 echo "export $varName=$(cat $fileName)\${$varName:+$separator}\$$varName" >> $wrapper
62 fi
63 done
64 fi
65
66 if test "$p" = "--add-flags"; then
67 flags=${params[$((n + 1))]}
68 n=$((n + 1))
69 flagsBefore="$flagsBefore $flags"
70 fi
71 done
72
73 # Note: extraFlagsArray is an array containing additional flags
74 # that may be set by --run actions.
75 echo exec -a '"$0"' "$original" $flagsBefore '"${extraFlagsArray[@]}"' '"$@"' >> $wrapper
76
77 chmod +x $wrapper
78}
79
80addSuffix() {
81 suffix=$1
82 shift
83 for name in "$@"; do
84 echo "$name$suffix"
85 done
86}
87
88filterExisting() {
89 for fn in "$@"; do
90 if test -e "$fn"; then
91 echo "$fn"
92 fi
93 done
94}
95
96# Syntax: wrapProgram <PROGRAM> <MAKE-WRAPPER FLAGS...>
97wrapProgram() {
98 local prog="$1"
99 local hidden="$(dirname "$prog")/.$(basename "$prog")"-wrapped
100 mv $prog $hidden
101 makeWrapper $hidden $prog "$@"
102}