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