annotate SCRIPTS/process.sh @ 43:563827464628

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