annotate SCRIPTS/process.sh @ 32:6fc0d89020f2

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