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