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