annotate SCRIPTS/process.sh @ 38:25a9332971f7

Various fixes to scripts for mingw32
author Chris Cannam
date Wed, 06 Aug 2014 17:43:06 +0100
parents 6fc0d89020f2
children 12d422dd6992
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@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@38 63 valgrind=valgrind
Chris@22 64 archflags=
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@38 73 valgrind=
Chris@22 74 archflags=
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@38 83 valgrind=
Chris@22 84 archflags=
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@38 93 valgrind=
Chris@22 94 archflags="-arch i386"
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@38 103 valgrind=
Chris@26 104 # This is a difficult choice for various reasons... have to ponder
Chris@26 105 archflags="-mmacosx-version-min=10.6 -arch x86_64 -arch i386"
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@19 237 return 0
Chris@19 238 fi
Chris@19 239 done
Chris@19 240 return 1
Chris@19 241 }
Chris@19 242
Chris@19 243 is_nondeterministic() {
Chris@19 244 plugin_id="$1"
Chris@19 245 grep -q "^$id\$" METADATA/nondeterministic.txt
Chris@19 246 }
Chris@19 247
Chris@5 248 run_tester() {
Chris@7 249 ##!!! todo: timeout if the plugin takes too long and report as failure?
Chris@5 250 dir="$1"
Chris@19 251 ids=$(VAMP_PATH="$dir" $hostwrapper vamp-plugin-sdk/host/vamp-simple-host$hostext --list-ids | sed 's/^vamp://' | sed 's/\r//g' )
Chris@32 252 cat /dev/null > "$reportdir/$dir.test.txt"
Chris@6 253 if [ -z "$ids" ]; then
Chris@6 254 echo
Chris@32 255 echo "No plugins reported to test in $dir" | tee -a "$reportdir/$dir.test.txt"
Chris@23 256 echo "$dir" >> "$testfailed"
Chris@6 257 return 1
Chris@5 258 else
Chris@38 259 good=yes
Chris@6 260 for id in $ids; do
Chris@6 261 extra=""
Chris@19 262 if is_nondeterministic "$id"; then
Chris@6 263 extra="-n"
Chris@6 264 fi
Chris@38 265 echo "Running command: VAMP_PATH=\"$dir\" $hostwrapper vamp-plugin-tester/vamp-plugin-tester$hostext \"$extra\" \"$id\"" | tee -a "$reportdir/$dir.test.txt"
Chris@32 266 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 267 echo "OK"
Chris@6 268 else
Chris@6 269 echo
Chris@38 270 echo "Tester failed for id $id: running again with valgrind (if available) and verbose for a report..."
Chris@6 271 echo "$dir" >> "$testfailed"
Chris@38 272 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 273 good=no
Chris@6 274 fi
Chris@6 275 done
Chris@38 276 if [ "$good" != "yes" ]; then
Chris@38 277 return 1
Chris@38 278 fi
Chris@5 279 fi
Chris@38 280 return 0
Chris@5 281 }
Chris@5 282
Chris@9 283 public_symbols() {
Chris@9 284 lib="$1"
Chris@23 285 # nm -g prints global symbols in both OS/X and GNU tools, but
Chris@23 286 # printing only global *defined* symbols is harder. In GNU it is
Chris@23 287 # nm -g --defined-only; the OS/X docs suggest nm -gu should work,
Chris@23 288 # but it doesn't. What I think will work with both is simply
Chris@23 289 # grepping out the undefineds:
Chris@23 290 "$toolprefix"nm -g "$lib" | grep -v ' U ' | awk '{ print $3; }'
Chris@9 291 }
Chris@9 292
Chris@9 293 run_environmental_tests() {
Chris@9 294 dir="$1"
Chris@19 295 good=yes
Chris@32 296 cat /dev/null > "$reportdir/$dir.envtest.txt"
Chris@19 297 for lib in $dir/*$pluginext; do
Chris@19 298 if [ ! -f "$lib" ]; then
Chris@32 299 echo "NOTE: no library found in $dir?" | tee -a "$reportdir/$dir.envtest.txt"
Chris@19 300 good=no
Chris@19 301 else
Chris@19 302 echo
Chris@19 303 echo "Testing for exported symbols in $lib..."
Chris@19 304 if public_symbols "$lib" | grep -q vampGetPluginDescriptor; then
Chris@19 305 others=`public_symbols "$lib" | grep -v vampGetPluginDescriptor`
Chris@19 306 if [ -n "$others" ]; then
Chris@19 307 count=`echo "$others" | wc -l`
Chris@32 308 echo "WARNING: $count extra symbols exported by plugin library" | tee -a "$reportdir/$dir.envtest.txt"
Chris@19 309 good=no
Chris@19 310 else
Chris@32 311 echo "GOOD: library $lib only exports vampGetPluginDescriptor" | tee -a "$reportdir/$dir.envtest.txt"
Chris@19 312 fi
Chris@9 313 else
Chris@32 314 echo "NOTE: found library $lib that is not a Vamp plugin library" | tee -a "$reportdir/$dir.envtest.txt"
Chris@9 315 fi
Chris@9 316 fi
Chris@9 317 done
Chris@19 318 if [ "$good" != "yes" ]; then
Chris@19 319 echo "$dir" >> "$envcheckfailed"
Chris@19 320 fi
Chris@9 321 }
Chris@4 322
Chris@22 323 if ! build_or_rebuild "vamp-plugin-sdk"; then
Chris@5 324 echo "Failed to build Vamp plugin SDK!"
Chris@5 325 exit 1
Chris@5 326 fi
Chris@5 327
Chris@26 328 # Ensure we can only link statically against these
Chris@26 329 for x in vamp-hostsdk vamp-sdk; do
Chris@26 330 for y in dylib dll so; do
Chris@26 331 rm -f "vamp-plugin-sdk/lib$x.$y"
Chris@26 332 rm -f "vamp-plugin-sdk/$x.$y"
Chris@26 333 done
Chris@26 334 done
Chris@26 335
Chris@22 336 if ! build_or_rebuild "vamp-plugin-tester"; then
Chris@5 337 echo "Failed to build Vamp plugin tester!"
Chris@5 338 exit 1
Chris@5 339 fi
Chris@5 340
Chris@11 341 for dir in $plugindirs ; do
Chris@31 342 dir=${dir%/*}
Chris@4 343 echo
Chris@4 344 echo "Processing: $dir"
Chris@31 345 if [ ! -d "$dir" ]; then
Chris@31 346 echo "Directory $dir not found!"
Chris@31 347 echo "$dir" >> "$notbuilt"
Chris@31 348 elif build_or_rebuild "$dir"; then
Chris@19 349 if have_plugin "$dir" ; then
Chris@19 350 echo "$dir" >> "$built"
Chris@19 351 run_tester "$dir"
Chris@19 352 run_environmental_tests "$dir"
Chris@19 353 else
Chris@19 354 echo "Build apparently succeeded, but no resulting plugin(s) found" | tee -a "$reportdir/$dir.build.txt"
Chris@19 355 echo "$dir" >> "$notbuilt"
Chris@19 356 fi
Chris@4 357 else
Chris@6 358 echo "$dir" >> "$notbuilt"
Chris@4 359 fi
Chris@38 360 cat /dev/null > "$reportdir/$dir.summary.txt"
Chris@1 361 done
Chris@1 362
Chris@4 363 echo
Chris@19 364 echo "** Successfully built, tested, and checked:"
Chris@6 365 cat "$built" | while read d; do
Chris@6 366 if ! grep -q "^$d\$" "$testfailed"; then
Chris@32 367 if ! grep -q "^$d\$" "$envcheckfailed"; then
Chris@32 368 echo "$d"
Chris@38 369 echo "$d: Success" >> "$reportdir/$d.summary.txt"
Chris@32 370 fi
Chris@6 371 fi
Chris@6 372 done | sort
Chris@4 373
Chris@4 374 echo
Chris@19 375 echo "** Failed tests:"
Chris@6 376 cat "$testfailed" | sort | uniq | while read d; do
Chris@6 377 echo "$d"
Chris@38 378 echo "$d: Built successfully, but failed tests" >> "$reportdir/$d.summary.txt"
Chris@6 379 done
Chris@5 380
Chris@5 381 echo
Chris@19 382 echo "** Failed environmental checks:"
Chris@19 383 cat "$envcheckfailed" | sort | uniq | while read d; do
Chris@19 384 echo "$d"
Chris@38 385 echo "$d: Built successfully, but failed environmental checks" >> "$reportdir/$d.summary.txt"
Chris@19 386 done
Chris@19 387
Chris@19 388 echo
Chris@4 389 echo "** Failed to build:"
Chris@6 390 cat "$notbuilt" | sort | while read d; do
Chris@6 391 echo "$d"
Chris@38 392 echo "$d: Failed to build" >> "$reportdir/$d.summary.txt"
Chris@6 393 done
Chris@4 394
Chris@4 395 echo