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@22
|
15 do_rebuild=""
|
Chris@14
|
16
|
Chris@22
|
17 usage() {
|
Chris@22
|
18 echo
|
Chris@22
|
19 echo "Usage: $0 <platform> [-c] [<dir> ...]"
|
Chris@22
|
20 echo
|
Chris@22
|
21 echo " <platform> one of linux32, linux64, mingw32, mingw64, osx32, osx64"
|
Chris@22
|
22 echo " -c build from clean"
|
Chris@22
|
23 echo " <dir> directory to build (default is all of them)"
|
Chris@22
|
24 echo
|
Chris@22
|
25 echo "Platform usually should match the platform you are running this"
|
Chris@22
|
26 echo "script on, unless you have a cross-compile toolset installed and"
|
Chris@22
|
27 echo "this script knows how to run it."
|
Chris@22
|
28 echo
|
Chris@22
|
29 exit 2
|
Chris@22
|
30 }
|
Chris@21
|
31
|
Chris@22
|
32 case "$1" in
|
Chris@22
|
33 linux32)
|
Chris@22
|
34 platform=linux
|
Chris@22
|
35 bits=32
|
Chris@22
|
36 toolprefix=
|
Chris@22
|
37 pluginext=.so
|
Chris@22
|
38 hostwrapper=
|
Chris@22
|
39 hostext=
|
Chris@22
|
40 archflags=
|
Chris@22
|
41 ;;
|
Chris@22
|
42 linux64)
|
Chris@22
|
43 platform=linux
|
Chris@22
|
44 bits=64
|
Chris@22
|
45 toolprefix=
|
Chris@22
|
46 pluginext=.so
|
Chris@22
|
47 hostwrapper=
|
Chris@22
|
48 hostext=
|
Chris@22
|
49 archflags=
|
Chris@22
|
50 ;;
|
Chris@22
|
51 mingw32)
|
Chris@22
|
52 platform=mingw
|
Chris@22
|
53 bits=32
|
Chris@22
|
54 toolprefix=i686-w64-mingw32-
|
Chris@22
|
55 pluginext=.dll
|
Chris@22
|
56 hostwrapper=wine
|
Chris@22
|
57 hostext=.exe
|
Chris@22
|
58 archflags=
|
Chris@22
|
59 ;;
|
Chris@22
|
60 mingw64)
|
Chris@22
|
61 platform=mingw
|
Chris@22
|
62 bits=64
|
Chris@22
|
63 toolprefix=x86_64-w64-mingw32-
|
Chris@22
|
64 pluginext=.dll
|
Chris@22
|
65 hostwrapper=wine
|
Chris@22
|
66 hostext=.exe
|
Chris@22
|
67 archflags=
|
Chris@22
|
68 ;;
|
Chris@22
|
69 osx32)
|
Chris@22
|
70 platform=osx
|
Chris@22
|
71 bits=32
|
Chris@22
|
72 toolprefix=
|
Chris@22
|
73 pluginext=.dylib
|
Chris@22
|
74 hostwrapper=
|
Chris@22
|
75 hostext=
|
Chris@22
|
76 archflags="-arch i386"
|
Chris@22
|
77 ;;
|
Chris@22
|
78 osx64)
|
Chris@22
|
79 platform=osx
|
Chris@22
|
80 bits=64
|
Chris@22
|
81 toolprefix=
|
Chris@22
|
82 pluginext=.dylib
|
Chris@22
|
83 hostwrapper=
|
Chris@22
|
84 hostext=
|
Chris@26
|
85 # This is a difficult choice for various reasons... have to ponder
|
Chris@26
|
86 archflags="-mmacosx-version-min=10.6 -arch x86_64 -arch i386"
|
Chris@22
|
87 ;;
|
Chris@22
|
88 esac;
|
Chris@22
|
89
|
Chris@22
|
90 shift
|
Chris@22
|
91
|
Chris@22
|
92 if [ -z "$platform" ]; then
|
Chris@22
|
93 usage
|
Chris@22
|
94 else
|
Chris@22
|
95 echo "(Platform is $platform, $bits bits)"
|
Chris@22
|
96 fi
|
Chris@22
|
97
|
Chris@22
|
98 if [ t"$1" = t"-c" ]; then
|
Chris@22
|
99 echo "(Building from clean)"
|
Chris@22
|
100 do_rebuild=yes
|
Chris@22
|
101 shift
|
Chris@22
|
102 fi
|
Chris@15
|
103
|
Chris@19
|
104 depincdir="$mydir"/../DEPENDENCIES/$platform$bits/include
|
Chris@19
|
105 deplibdir="$mydir"/../DEPENDENCIES/$platform$bits/lib
|
Chris@19
|
106
|
Chris@19
|
107 depincdir_generic="$mydir"/../DEPENDENCIES/generic/include
|
Chris@1
|
108
|
Chris@11
|
109 plugindirs="$@"
|
Chris@11
|
110 if [ -z "$plugindirs" ]; then
|
Chris@11
|
111 plugindirs=$(cat .hgsub | grep -v vamp-plugin-sdk | grep -v vamp-plugin-tester | awk '{ print $1; }')
|
Chris@11
|
112 fi
|
Chris@11
|
113
|
Chris@6
|
114 reportdir="REPORTS/$platform$bits"
|
Chris@6
|
115 mkdir -p "$reportdir" || exit 1
|
Chris@6
|
116
|
Chris@9
|
117 built="/tmp/built.$$.txt"
|
Chris@9
|
118 testfailed="/tmp/testfailed.$$.txt"
|
Chris@19
|
119 envcheckfailed="/tmp/envcheckfailed.$$.txt"
|
Chris@9
|
120 notbuilt="/tmp/notbuilt.$$.txt"
|
Chris@19
|
121 trap 'rm -f "$built" "$envcheckfailed" "$testfailed" "$notbuilt"' 0
|
Chris@19
|
122 touch "$built" "$envcheckfailed" "$testfailed" "$notbuilt"
|
Chris@9
|
123
|
Chris@4
|
124 configure() {
|
Chris@4
|
125 dir="$1"
|
Chris@4
|
126 if [ -f "$dir/configure" ] ; then
|
Chris@6
|
127 ( cd "$dir" ; ./configure ) 2>&1 | tee "$reportdir/$dir.configure.txt"
|
Chris@4
|
128 fi
|
Chris@4
|
129 }
|
Chris@4
|
130
|
Chris@1
|
131 find_makefile() {
|
Chris@1
|
132 dir="$1"
|
Chris@9
|
133 for f in \
|
Chris@19
|
134 build/$platform$bits/Makefile.$platform$bits \
|
Chris@13
|
135 build/$platform/Makefile.$platform$bits \
|
Chris@19
|
136 build/$platform$bits/Makefile.$platform \
|
Chris@19
|
137 build/$platform$bits/Makefile \
|
Chris@19
|
138 build/Makefile.$platform$bits \
|
Chris@19
|
139 Makefile.$platform$bits \
|
Chris@13
|
140 build/$platform/Makefile.$platform \
|
Chris@13
|
141 build/$platform/Makefile \
|
Chris@13
|
142 build/Makefile.$platform \
|
Chris@9
|
143 Makefile.$platform \
|
Chris@13
|
144 Makefile ; do
|
Chris@1
|
145 if [ -f "$dir/$f" ]; then
|
Chris@1
|
146 echo $f
|
Chris@1
|
147 break
|
Chris@1
|
148 fi
|
Chris@1
|
149 done
|
Chris@1
|
150 }
|
Chris@1
|
151
|
Chris@13
|
152 configure_maybe() {
|
Chris@13
|
153 dir="$1"
|
Chris@13
|
154 mfile=$(find_makefile "$dir")
|
Chris@13
|
155 if [ -z "$mfile" ]; then
|
Chris@13
|
156 configure "$dir"
|
Chris@13
|
157 fi
|
Chris@13
|
158 }
|
Chris@13
|
159
|
Chris@19
|
160 target_for() {
|
Chris@19
|
161 dir="$1"
|
Chris@19
|
162 if grep -q "^$dir: " METADATA/maketarget.txt ; then
|
Chris@19
|
163 grep "^$dir: " METADATA/maketarget.txt | head -1 | sed 's/^[^:]*: //'
|
Chris@19
|
164 fi
|
Chris@19
|
165 }
|
Chris@19
|
166
|
Chris@4
|
167 build() {
|
Chris@4
|
168 dir="$1"
|
Chris@1
|
169 if configure_maybe "$dir"; then
|
Chris@1
|
170 mfile=$(find_makefile "$dir")
|
Chris@1
|
171 if [ -n "$mfile" ]; then
|
Chris@19
|
172 target=$(target_for "$dir")
|
Chris@19
|
173 TOOLPREFIX="$toolprefix" \
|
Chris@21
|
174 CXXFLAGS="-I${depincdir} -I${depincdir_generic} -I../vamp-plugin-sdk" \
|
Chris@21
|
175 LDFLAGS="-L${deplibdir} -L../vamp-plugin-sdk" \
|
Chris@21
|
176 ARCHFLAGS="$archflags" \
|
Chris@19
|
177 make -C "$dir" -f "$mfile" $target 2>&1 | \
|
Chris@19
|
178 tee "$reportdir/$dir.build.txt"
|
Chris@9
|
179 return ${PIPESTATUS[0]}
|
Chris@1
|
180 else
|
Chris@1
|
181 echo "Failed to find a Makefile in $dir"
|
Chris@4
|
182 return 1
|
Chris@1
|
183 fi
|
Chris@1
|
184 fi
|
Chris@4
|
185 }
|
Chris@4
|
186
|
Chris@4
|
187 rebuild() {
|
Chris@4
|
188 dir="$1"
|
Chris@13
|
189 if configure_maybe "$dir"; then
|
Chris@4
|
190 mfile=$(find_makefile "$dir")
|
Chris@4
|
191 if [ -n "$mfile" ]; then
|
Chris@4
|
192 make -C "$dir" -f "$mfile" clean
|
Chris@19
|
193 build "$dir"
|
Chris@4
|
194 else
|
Chris@4
|
195 echo "Failed to find a Makefile in $dir"
|
Chris@4
|
196 return 1
|
Chris@4
|
197 fi
|
Chris@4
|
198 fi
|
Chris@4
|
199 }
|
Chris@4
|
200
|
Chris@22
|
201 build_or_rebuild() {
|
Chris@22
|
202 dir="$1"
|
Chris@22
|
203 if [ -n "$do_rebuild" ]; then
|
Chris@22
|
204 rebuild "$dir"
|
Chris@22
|
205 else
|
Chris@22
|
206 build "$dir"
|
Chris@22
|
207 fi
|
Chris@22
|
208 }
|
Chris@22
|
209
|
Chris@19
|
210 have_plugin() {
|
Chris@19
|
211 dir="$1"
|
Chris@19
|
212 for x in "$dir/"*"$pluginext"; do
|
Chris@19
|
213 if [ -f "$x" ]; then
|
Chris@19
|
214 return 0
|
Chris@19
|
215 fi
|
Chris@19
|
216 done
|
Chris@19
|
217 return 1
|
Chris@19
|
218 }
|
Chris@19
|
219
|
Chris@19
|
220 is_nondeterministic() {
|
Chris@19
|
221 plugin_id="$1"
|
Chris@19
|
222 grep -q "^$id\$" METADATA/nondeterministic.txt
|
Chris@19
|
223 }
|
Chris@19
|
224
|
Chris@5
|
225 run_tester() {
|
Chris@7
|
226 ##!!! todo: timeout if the plugin takes too long and report as failure?
|
Chris@5
|
227 dir="$1"
|
Chris@19
|
228 ids=$(VAMP_PATH="$dir" $hostwrapper vamp-plugin-sdk/host/vamp-simple-host$hostext --list-ids | sed 's/^vamp://' | sed 's/\r//g' )
|
Chris@6
|
229 if [ -z "$ids" ]; then
|
Chris@6
|
230 echo
|
Chris@6
|
231 echo "No plugins reported to test in $dir"
|
Chris@23
|
232 echo "$dir" >> "$testfailed"
|
Chris@6
|
233 return 1
|
Chris@5
|
234 else
|
Chris@6
|
235 for id in $ids; do
|
Chris@6
|
236 extra=""
|
Chris@19
|
237 if is_nondeterministic "$id"; then
|
Chris@6
|
238 extra="-n"
|
Chris@6
|
239 fi
|
Chris@19
|
240 echo "Running command: VAMP_PATH=\"$dir\" $hostwrapper vamp-plugin-tester/vamp-plugin-tester$hostext \"$extra\" \"$id\""
|
Chris@19
|
241 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
|
242 echo "OK"
|
Chris@6
|
243 else
|
Chris@6
|
244 echo
|
Chris@6
|
245 echo "Tester failed for id $id: running again with valgrind and verbose for a report..."
|
Chris@6
|
246 echo "$dir" >> "$testfailed"
|
Chris@19
|
247 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
|
248 return 1
|
Chris@6
|
249 fi
|
Chris@6
|
250 done
|
Chris@5
|
251 fi
|
Chris@5
|
252 }
|
Chris@5
|
253
|
Chris@9
|
254 public_symbols() {
|
Chris@9
|
255 lib="$1"
|
Chris@23
|
256 # nm -g prints global symbols in both OS/X and GNU tools, but
|
Chris@23
|
257 # printing only global *defined* symbols is harder. In GNU it is
|
Chris@23
|
258 # nm -g --defined-only; the OS/X docs suggest nm -gu should work,
|
Chris@23
|
259 # but it doesn't. What I think will work with both is simply
|
Chris@23
|
260 # grepping out the undefineds:
|
Chris@23
|
261 "$toolprefix"nm -g "$lib" | grep -v ' U ' | awk '{ print $3; }'
|
Chris@9
|
262 }
|
Chris@9
|
263
|
Chris@9
|
264 run_environmental_tests() {
|
Chris@9
|
265 dir="$1"
|
Chris@19
|
266 good=yes
|
Chris@19
|
267 for lib in $dir/*$pluginext; do
|
Chris@19
|
268 if [ ! -f "$lib" ]; then
|
Chris@19
|
269 echo "NOTE: no library found in $dir?"
|
Chris@19
|
270 good=no
|
Chris@19
|
271 else
|
Chris@19
|
272 echo
|
Chris@19
|
273 echo "Testing for exported symbols in $lib..."
|
Chris@19
|
274 if public_symbols "$lib" | grep -q vampGetPluginDescriptor; then
|
Chris@19
|
275 others=`public_symbols "$lib" | grep -v vampGetPluginDescriptor`
|
Chris@19
|
276 if [ -n "$others" ]; then
|
Chris@19
|
277 count=`echo "$others" | wc -l`
|
Chris@19
|
278 echo "WARNING: $count extra symbols exported by plugin library"
|
Chris@19
|
279 good=no
|
Chris@19
|
280 else
|
Chris@19
|
281 echo "GOOD: library $lib only exports vampGetPluginDescriptor"
|
Chris@19
|
282 fi
|
Chris@9
|
283 else
|
Chris@19
|
284 echo "NOTE: found library $lib that is not a Vamp plugin library"
|
Chris@9
|
285 fi
|
Chris@9
|
286 fi
|
Chris@9
|
287 done
|
Chris@19
|
288 if [ "$good" != "yes" ]; then
|
Chris@19
|
289 echo "$dir" >> "$envcheckfailed"
|
Chris@19
|
290 fi
|
Chris@9
|
291 }
|
Chris@4
|
292
|
Chris@22
|
293 if ! build_or_rebuild "vamp-plugin-sdk"; then
|
Chris@5
|
294 echo "Failed to build Vamp plugin SDK!"
|
Chris@5
|
295 exit 1
|
Chris@5
|
296 fi
|
Chris@5
|
297
|
Chris@26
|
298 # Ensure we can only link statically against these
|
Chris@26
|
299 for x in vamp-hostsdk vamp-sdk; do
|
Chris@26
|
300 for y in dylib dll so; do
|
Chris@26
|
301 rm -f "vamp-plugin-sdk/lib$x.$y"
|
Chris@26
|
302 rm -f "vamp-plugin-sdk/$x.$y"
|
Chris@26
|
303 done
|
Chris@26
|
304 done
|
Chris@26
|
305
|
Chris@22
|
306 if ! build_or_rebuild "vamp-plugin-tester"; then
|
Chris@5
|
307 echo "Failed to build Vamp plugin tester!"
|
Chris@5
|
308 exit 1
|
Chris@5
|
309 fi
|
Chris@5
|
310
|
Chris@11
|
311 for dir in $plugindirs ; do
|
Chris@4
|
312 echo
|
Chris@4
|
313 echo "Processing: $dir"
|
Chris@22
|
314 if build_or_rebuild "$dir"; then
|
Chris@19
|
315 if have_plugin "$dir" ; then
|
Chris@19
|
316 echo "$dir" >> "$built"
|
Chris@19
|
317 run_tester "$dir"
|
Chris@19
|
318 run_environmental_tests "$dir"
|
Chris@19
|
319 else
|
Chris@19
|
320 echo "Build apparently succeeded, but no resulting plugin(s) found" | tee -a "$reportdir/$dir.build.txt"
|
Chris@19
|
321 echo "$dir" >> "$notbuilt"
|
Chris@19
|
322 fi
|
Chris@4
|
323 else
|
Chris@6
|
324 echo "$dir" >> "$notbuilt"
|
Chris@4
|
325 fi
|
Chris@1
|
326 done
|
Chris@1
|
327
|
Chris@10
|
328 cat /dev/null > "$reportdir/$dir.summary.txt"
|
Chris@6
|
329
|
Chris@4
|
330 echo
|
Chris@19
|
331 echo "** Successfully built, tested, and checked:"
|
Chris@6
|
332 cat "$built" | while read d; do
|
Chris@6
|
333 if ! grep -q "^$d\$" "$testfailed"; then
|
Chris@6
|
334 echo "$d"
|
Chris@6
|
335 echo "Success" >> "$reportdir/$d.summary.txt"
|
Chris@6
|
336 fi
|
Chris@6
|
337 done | sort
|
Chris@4
|
338
|
Chris@4
|
339 echo
|
Chris@19
|
340 echo "** Failed tests:"
|
Chris@6
|
341 cat "$testfailed" | sort | uniq | while read d; do
|
Chris@6
|
342 echo "$d"
|
Chris@6
|
343 echo "Built successfully, but failed tests" >> "$reportdir/$d.summary.txt"
|
Chris@6
|
344 done
|
Chris@5
|
345
|
Chris@5
|
346 echo
|
Chris@19
|
347 echo "** Failed environmental checks:"
|
Chris@19
|
348 cat "$envcheckfailed" | sort | uniq | while read d; do
|
Chris@19
|
349 echo "$d"
|
Chris@19
|
350 echo "Built successfully, but failed environmental checks" >> "$reportdir/$d.summary.txt"
|
Chris@19
|
351 done
|
Chris@19
|
352
|
Chris@19
|
353 echo
|
Chris@4
|
354 echo "** Failed to build:"
|
Chris@6
|
355 cat "$notbuilt" | sort | while read d; do
|
Chris@6
|
356 echo "$d"
|
Chris@6
|
357 echo "Failed to build" >> "$reportdir/$d.summary.txt"
|
Chris@6
|
358 done
|
Chris@4
|
359
|
Chris@4
|
360 echo
|