Chris@1
|
1 #!/bin/bash
|
Chris@1
|
2
|
Chris@6
|
3 # Run this from the top-level vamp-build-and-test directory
|
Chris@6
|
4
|
Chris@1
|
5 ## Things to test:
|
Chris@1
|
6 ## the plugin builds!
|
Chris@1
|
7 ## plugin loads
|
Chris@1
|
8 ## passes vamp-plugin-tester tests
|
Chris@1
|
9 ## does not export any unnecessary symbols
|
Chris@1
|
10 ## has valid .cat and .n3
|
Chris@1
|
11
|
Chris@19
|
12 mydir=$(dirname "$0")
|
Chris@19
|
13 case "$mydir" in /*);; *) mydir=$(pwd)/"$mydir";; esac
|
Chris@19
|
14
|
Chris@13
|
15 #platform=linux
|
Chris@13
|
16 #bits=64
|
Chris@19
|
17 #toolprefix=""
|
Chris@19
|
18 #pluginext=.so
|
Chris@19
|
19 #hostwrapper=""
|
Chris@19
|
20 #hostext=""
|
Chris@14
|
21
|
Chris@13
|
22 platform=mingw
|
Chris@13
|
23 bits=32
|
Chris@13
|
24 toolprefix=i686-w64-mingw32-
|
Chris@19
|
25 pluginext=.dll
|
Chris@19
|
26 hostwrapper=wine
|
Chris@19
|
27 hostext=.exe
|
Chris@15
|
28
|
Chris@19
|
29 depincdir="$mydir"/../DEPENDENCIES/$platform$bits/include
|
Chris@19
|
30 deplibdir="$mydir"/../DEPENDENCIES/$platform$bits/lib
|
Chris@19
|
31
|
Chris@19
|
32 depincdir_generic="$mydir"/../DEPENDENCIES/generic/include
|
Chris@1
|
33
|
Chris@11
|
34 plugindirs="$@"
|
Chris@11
|
35 if [ -z "$plugindirs" ]; then
|
Chris@11
|
36 plugindirs=$(cat .hgsub | grep -v vamp-plugin-sdk | grep -v vamp-plugin-tester | awk '{ print $1; }')
|
Chris@11
|
37 fi
|
Chris@11
|
38
|
Chris@6
|
39 reportdir="REPORTS/$platform$bits"
|
Chris@6
|
40 mkdir -p "$reportdir" || exit 1
|
Chris@6
|
41
|
Chris@9
|
42 built="/tmp/built.$$.txt"
|
Chris@9
|
43 testfailed="/tmp/testfailed.$$.txt"
|
Chris@19
|
44 envcheckfailed="/tmp/envcheckfailed.$$.txt"
|
Chris@9
|
45 notbuilt="/tmp/notbuilt.$$.txt"
|
Chris@19
|
46 trap 'rm -f "$built" "$envcheckfailed" "$testfailed" "$notbuilt"' 0
|
Chris@19
|
47 touch "$built" "$envcheckfailed" "$testfailed" "$notbuilt"
|
Chris@9
|
48
|
Chris@4
|
49 configure() {
|
Chris@4
|
50 dir="$1"
|
Chris@4
|
51 if [ -f "$dir/configure" ] ; then
|
Chris@6
|
52 ( cd "$dir" ; ./configure ) 2>&1 | tee "$reportdir/$dir.configure.txt"
|
Chris@4
|
53 fi
|
Chris@4
|
54 }
|
Chris@4
|
55
|
Chris@1
|
56 find_makefile() {
|
Chris@1
|
57 dir="$1"
|
Chris@9
|
58 for f in \
|
Chris@19
|
59 build/$platform$bits/Makefile.$platform$bits \
|
Chris@13
|
60 build/$platform/Makefile.$platform$bits \
|
Chris@19
|
61 build/$platform$bits/Makefile.$platform \
|
Chris@19
|
62 build/$platform$bits/Makefile \
|
Chris@19
|
63 build/Makefile.$platform$bits \
|
Chris@19
|
64 Makefile.$platform$bits \
|
Chris@13
|
65 build/$platform/Makefile.$platform \
|
Chris@13
|
66 build/$platform/Makefile \
|
Chris@13
|
67 build/Makefile.$platform \
|
Chris@9
|
68 Makefile.$platform \
|
Chris@13
|
69 Makefile ; do
|
Chris@1
|
70 if [ -f "$dir/$f" ]; then
|
Chris@1
|
71 echo $f
|
Chris@1
|
72 break
|
Chris@1
|
73 fi
|
Chris@1
|
74 done
|
Chris@1
|
75 }
|
Chris@1
|
76
|
Chris@13
|
77 configure_maybe() {
|
Chris@13
|
78 dir="$1"
|
Chris@13
|
79 mfile=$(find_makefile "$dir")
|
Chris@13
|
80 if [ -z "$mfile" ]; then
|
Chris@13
|
81 configure "$dir"
|
Chris@13
|
82 fi
|
Chris@13
|
83 }
|
Chris@13
|
84
|
Chris@19
|
85 target_for() {
|
Chris@19
|
86 dir="$1"
|
Chris@19
|
87 if grep -q "^$dir: " METADATA/maketarget.txt ; then
|
Chris@19
|
88 grep "^$dir: " METADATA/maketarget.txt | head -1 | sed 's/^[^:]*: //'
|
Chris@19
|
89 fi
|
Chris@19
|
90 }
|
Chris@19
|
91
|
Chris@4
|
92 build() {
|
Chris@4
|
93 dir="$1"
|
Chris@1
|
94 if configure_maybe "$dir"; then
|
Chris@1
|
95 mfile=$(find_makefile "$dir")
|
Chris@1
|
96 if [ -n "$mfile" ]; then
|
Chris@19
|
97 target=$(target_for "$dir")
|
Chris@19
|
98 TOOLPREFIX="$toolprefix" \
|
Chris@19
|
99 CXXFLAGS="-I${depincdir} -I${depincdir_generic} -I../vamp-plugin-sdk" LDFLAGS="-L${deplibdir} -L../vamp-plugin-sdk" \
|
Chris@19
|
100 make -C "$dir" -f "$mfile" $target 2>&1 | \
|
Chris@19
|
101 tee "$reportdir/$dir.build.txt"
|
Chris@9
|
102 return ${PIPESTATUS[0]}
|
Chris@1
|
103 else
|
Chris@1
|
104 echo "Failed to find a Makefile in $dir"
|
Chris@4
|
105 return 1
|
Chris@1
|
106 fi
|
Chris@1
|
107 fi
|
Chris@4
|
108 }
|
Chris@4
|
109
|
Chris@4
|
110 rebuild() {
|
Chris@4
|
111 dir="$1"
|
Chris@13
|
112 if configure_maybe "$dir"; then
|
Chris@4
|
113 mfile=$(find_makefile "$dir")
|
Chris@4
|
114 if [ -n "$mfile" ]; then
|
Chris@4
|
115 make -C "$dir" -f "$mfile" clean
|
Chris@19
|
116 build "$dir"
|
Chris@4
|
117 else
|
Chris@4
|
118 echo "Failed to find a Makefile in $dir"
|
Chris@4
|
119 return 1
|
Chris@4
|
120 fi
|
Chris@4
|
121 fi
|
Chris@4
|
122 }
|
Chris@4
|
123
|
Chris@19
|
124 have_plugin() {
|
Chris@19
|
125 dir="$1"
|
Chris@19
|
126 for x in "$dir/"*"$pluginext"; do
|
Chris@19
|
127 if [ -f "$x" ]; then
|
Chris@19
|
128 return 0
|
Chris@19
|
129 fi
|
Chris@19
|
130 done
|
Chris@19
|
131 return 1
|
Chris@19
|
132 }
|
Chris@19
|
133
|
Chris@19
|
134 is_nondeterministic() {
|
Chris@19
|
135 plugin_id="$1"
|
Chris@19
|
136 grep -q "^$id\$" METADATA/nondeterministic.txt
|
Chris@19
|
137 }
|
Chris@19
|
138
|
Chris@5
|
139 run_tester() {
|
Chris@7
|
140 ##!!! todo: timeout if the plugin takes too long and report as failure?
|
Chris@5
|
141 dir="$1"
|
Chris@19
|
142 ids=$(VAMP_PATH="$dir" $hostwrapper vamp-plugin-sdk/host/vamp-simple-host$hostext --list-ids | sed 's/^vamp://' | sed 's/\r//g' )
|
Chris@6
|
143 if [ -z "$ids" ]; then
|
Chris@6
|
144 echo
|
Chris@6
|
145 echo "No plugins reported to test in $dir"
|
Chris@6
|
146 return 1
|
Chris@5
|
147 else
|
Chris@6
|
148 for id in $ids; do
|
Chris@6
|
149 extra=""
|
Chris@19
|
150 if is_nondeterministic "$id"; then
|
Chris@6
|
151 extra="-n"
|
Chris@6
|
152 fi
|
Chris@19
|
153 echo "Running command: VAMP_PATH=\"$dir\" $hostwrapper vamp-plugin-tester/vamp-plugin-tester$hostext \"$extra\" \"$id\""
|
Chris@19
|
154 if ( VAMP_PATH="$dir" $hostwrapper vamp-plugin-tester/vamp-plugin-tester$hostext "$extra" "$id" 2>&1 | tee "$reportdir/$dir.test.txt" ; exit ${PIPESTATUS[0]} ) ; then
|
Chris@6
|
155 echo "OK"
|
Chris@6
|
156 else
|
Chris@6
|
157 echo
|
Chris@6
|
158 echo "Tester failed for id $id: running again with valgrind and verbose for a report..."
|
Chris@6
|
159 echo "$dir" >> "$testfailed"
|
Chris@19
|
160 VAMP_PATH="$dir" valgrind $hostwrapper vamp-plugin-tester/vamp-plugin-tester$hostext -v "$extra" "$id" 2>&1 | tee -a "$reportdir/$dir.test.txt"
|
Chris@9
|
161 return 1
|
Chris@6
|
162 fi
|
Chris@6
|
163 done
|
Chris@5
|
164 fi
|
Chris@5
|
165 }
|
Chris@5
|
166
|
Chris@9
|
167 public_symbols() {
|
Chris@9
|
168 lib="$1"
|
Chris@19
|
169 "$toolprefix"nm -g --defined-only "$lib" | awk '{ print $3; }'
|
Chris@9
|
170 }
|
Chris@9
|
171
|
Chris@9
|
172 run_environmental_tests() {
|
Chris@9
|
173 dir="$1"
|
Chris@19
|
174 good=yes
|
Chris@19
|
175 for lib in $dir/*$pluginext; do
|
Chris@19
|
176 if [ ! -f "$lib" ]; then
|
Chris@19
|
177 echo "NOTE: no library found in $dir?"
|
Chris@19
|
178 good=no
|
Chris@19
|
179 else
|
Chris@19
|
180 echo
|
Chris@19
|
181 echo "Testing for exported symbols in $lib..."
|
Chris@19
|
182 if public_symbols "$lib" | grep -q vampGetPluginDescriptor; then
|
Chris@19
|
183 others=`public_symbols "$lib" | grep -v vampGetPluginDescriptor`
|
Chris@19
|
184 if [ -n "$others" ]; then
|
Chris@19
|
185 count=`echo "$others" | wc -l`
|
Chris@19
|
186 echo "WARNING: $count extra symbols exported by plugin library"
|
Chris@19
|
187 good=no
|
Chris@19
|
188 else
|
Chris@19
|
189 echo "GOOD: library $lib only exports vampGetPluginDescriptor"
|
Chris@19
|
190 fi
|
Chris@9
|
191 else
|
Chris@19
|
192 echo "NOTE: found library $lib that is not a Vamp plugin library"
|
Chris@9
|
193 fi
|
Chris@9
|
194 fi
|
Chris@9
|
195 done
|
Chris@19
|
196 if [ "$good" != "yes" ]; then
|
Chris@19
|
197 echo "$dir" >> "$envcheckfailed"
|
Chris@19
|
198 fi
|
Chris@9
|
199 }
|
Chris@4
|
200
|
Chris@15
|
201 if ! build "vamp-plugin-sdk"; then
|
Chris@5
|
202 echo "Failed to build Vamp plugin SDK!"
|
Chris@5
|
203 exit 1
|
Chris@5
|
204 fi
|
Chris@5
|
205
|
Chris@19
|
206 if ! build "vamp-plugin-tester"; then
|
Chris@5
|
207 echo "Failed to build Vamp plugin tester!"
|
Chris@5
|
208 exit 1
|
Chris@5
|
209 fi
|
Chris@5
|
210
|
Chris@11
|
211 for dir in $plugindirs ; do
|
Chris@4
|
212 echo
|
Chris@4
|
213 echo "Processing: $dir"
|
Chris@19
|
214 if build "$dir"; then
|
Chris@19
|
215 if have_plugin "$dir" ; then
|
Chris@19
|
216 echo "$dir" >> "$built"
|
Chris@19
|
217 run_tester "$dir"
|
Chris@19
|
218 run_environmental_tests "$dir"
|
Chris@19
|
219 else
|
Chris@19
|
220 echo "Build apparently succeeded, but no resulting plugin(s) found" | tee -a "$reportdir/$dir.build.txt"
|
Chris@19
|
221 echo "$dir" >> "$notbuilt"
|
Chris@19
|
222 fi
|
Chris@4
|
223 else
|
Chris@6
|
224 echo "$dir" >> "$notbuilt"
|
Chris@4
|
225 fi
|
Chris@1
|
226 done
|
Chris@1
|
227
|
Chris@10
|
228 cat /dev/null > "$reportdir/$dir.summary.txt"
|
Chris@6
|
229
|
Chris@4
|
230 echo
|
Chris@19
|
231 echo "** Successfully built, tested, and checked:"
|
Chris@6
|
232 cat "$built" | while read d; do
|
Chris@6
|
233 if ! grep -q "^$d\$" "$testfailed"; then
|
Chris@6
|
234 echo "$d"
|
Chris@6
|
235 echo "Success" >> "$reportdir/$d.summary.txt"
|
Chris@6
|
236 fi
|
Chris@6
|
237 done | sort
|
Chris@4
|
238
|
Chris@4
|
239 echo
|
Chris@19
|
240 echo "** Failed tests:"
|
Chris@6
|
241 cat "$testfailed" | sort | uniq | while read d; do
|
Chris@6
|
242 echo "$d"
|
Chris@6
|
243 echo "Built successfully, but failed tests" >> "$reportdir/$d.summary.txt"
|
Chris@6
|
244 done
|
Chris@5
|
245
|
Chris@5
|
246 echo
|
Chris@19
|
247 echo "** Failed environmental checks:"
|
Chris@19
|
248 cat "$envcheckfailed" | sort | uniq | while read d; do
|
Chris@19
|
249 echo "$d"
|
Chris@19
|
250 echo "Built successfully, but failed environmental checks" >> "$reportdir/$d.summary.txt"
|
Chris@19
|
251 done
|
Chris@19
|
252
|
Chris@19
|
253 echo
|
Chris@4
|
254 echo "** Failed to build:"
|
Chris@6
|
255 cat "$notbuilt" | sort | while read d; do
|
Chris@6
|
256 echo "$d"
|
Chris@6
|
257 echo "Failed to build" >> "$reportdir/$d.summary.txt"
|
Chris@6
|
258 done
|
Chris@4
|
259
|
Chris@4
|
260 echo
|