annotate SCRIPTS/process.sh @ 40:a7005ff33d3c

OS/X build fixes
author Chris Cannam
date Thu, 07 Aug 2014 08:17:36 +0100
parents 12d422dd6992
children b57cdd4f273e
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@36 55 identpattern='ELF 32.*Linux'
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@36 66 identpattern='ELF 64.*Linux'
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@13 179 mfile=$(find_makefile "$dir")
Chris@13 180 if [ -z "$mfile" ]; then
Chris@13 181 configure "$dir"
Chris@13 182 fi
Chris@13 183 }
Chris@13 184
Chris@19 185 target_for() {
Chris@19 186 dir="$1"
Chris@19 187 if grep -q "^$dir: " METADATA/maketarget.txt ; then
Chris@19 188 grep "^$dir: " METADATA/maketarget.txt | head -1 | sed 's/^[^:]*: //'
Chris@19 189 fi
Chris@19 190 }
Chris@19 191
Chris@4 192 build() {
Chris@4 193 dir="$1"
Chris@1 194 if configure_maybe "$dir"; then
Chris@1 195 mfile=$(find_makefile "$dir")
Chris@1 196 if [ -n "$mfile" ]; then
Chris@19 197 target=$(target_for "$dir")
Chris@19 198 TOOLPREFIX="$toolprefix" \
Chris@21 199 CXXFLAGS="-I${depincdir} -I${depincdir_generic} -I../vamp-plugin-sdk" \
Chris@21 200 LDFLAGS="-L${deplibdir} -L../vamp-plugin-sdk" \
Chris@21 201 ARCHFLAGS="$archflags" \
Chris@19 202 make -C "$dir" -f "$mfile" $target 2>&1 | \
Chris@19 203 tee "$reportdir/$dir.build.txt"
Chris@9 204 return ${PIPESTATUS[0]}
Chris@1 205 else
Chris@1 206 echo "Failed to find a Makefile in $dir"
Chris@4 207 return 1
Chris@1 208 fi
Chris@1 209 fi
Chris@4 210 }
Chris@4 211
Chris@4 212 rebuild() {
Chris@4 213 dir="$1"
Chris@13 214 if configure_maybe "$dir"; then
Chris@4 215 mfile=$(find_makefile "$dir")
Chris@4 216 if [ -n "$mfile" ]; then
Chris@32 217 if make -C "$dir" -f "$mfile" clean; then
Chris@32 218 build "$dir"
Chris@32 219 else
Chris@32 220 echo "Failed to 'make clean' in $dir!" | tee "$reportdir/$dir.build.txt"
Chris@32 221 return 1
Chris@32 222 fi
Chris@4 223 else
Chris@32 224 echo "Failed to find a Makefile in $dir!" | tee "$reportdir/$dir.build.txt"
Chris@4 225 return 1
Chris@4 226 fi
Chris@4 227 fi
Chris@4 228 }
Chris@4 229
Chris@22 230 build_or_rebuild() {
Chris@22 231 dir="$1"
Chris@22 232 if [ -n "$do_rebuild" ]; then
Chris@22 233 rebuild "$dir"
Chris@22 234 else
Chris@22 235 build "$dir"
Chris@22 236 fi
Chris@22 237 }
Chris@22 238
Chris@19 239 have_plugin() {
Chris@19 240 dir="$1"
Chris@19 241 for x in "$dir/"*"$pluginext"; do
Chris@19 242 if [ -f "$x" ]; then
Chris@36 243 if file "$x" | grep -q "$identpattern" ; then
Chris@36 244 return 0
Chris@36 245 else
Chris@36 246 echo "Plugin $x exists, but fails to match file type for correct platform"
Chris@36 247 echo "(file type is: `file $x`)"
Chris@36 248 return 1
Chris@36 249 fi
Chris@19 250 fi
Chris@19 251 done
Chris@19 252 return 1
Chris@19 253 }
Chris@19 254
Chris@19 255 is_nondeterministic() {
Chris@19 256 plugin_id="$1"
Chris@19 257 grep -q "^$id\$" METADATA/nondeterministic.txt
Chris@19 258 }
Chris@19 259
Chris@5 260 run_tester() {
Chris@7 261 ##!!! todo: timeout if the plugin takes too long and report as failure?
Chris@5 262 dir="$1"
Chris@40 263 # can't use sed to remove \r from DOS line endings -- BSD and GNU
Chris@40 264 # vary in how they interpret \r escape
Chris@40 265 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 266 cat /dev/null > "$reportdir/$dir.test.txt"
Chris@6 267 if [ -z "$ids" ]; then
Chris@6 268 echo
Chris@32 269 echo "No plugins reported to test in $dir" | tee -a "$reportdir/$dir.test.txt"
Chris@23 270 echo "$dir" >> "$testfailed"
Chris@6 271 return 1
Chris@5 272 else
Chris@38 273 good=yes
Chris@6 274 for id in $ids; do
Chris@6 275 extra=""
Chris@19 276 if is_nondeterministic "$id"; then
Chris@6 277 extra="-n"
Chris@6 278 fi
Chris@38 279 echo "Running command: VAMP_PATH=\"$dir\" $hostwrapper vamp-plugin-tester/vamp-plugin-tester$hostext \"$extra\" \"$id\"" | tee -a "$reportdir/$dir.test.txt"
Chris@32 280 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 281 echo "OK"
Chris@6 282 else
Chris@6 283 echo
Chris@38 284 echo "Tester failed for id $id: running again with valgrind (if available) and verbose for a report..."
Chris@6 285 echo "$dir" >> "$testfailed"
Chris@38 286 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 287 good=no
Chris@6 288 fi
Chris@6 289 done
Chris@38 290 if [ "$good" != "yes" ]; then
Chris@38 291 return 1
Chris@38 292 fi
Chris@5 293 fi
Chris@38 294 return 0
Chris@5 295 }
Chris@5 296
Chris@9 297 public_symbols() {
Chris@9 298 lib="$1"
Chris@23 299 # nm -g prints global symbols in both OS/X and GNU tools, but
Chris@23 300 # printing only global *defined* symbols is harder. In GNU it is
Chris@23 301 # nm -g --defined-only; the OS/X docs suggest nm -gu should work,
Chris@23 302 # but it doesn't. What I think will work with both is simply
Chris@23 303 # grepping out the undefineds:
Chris@23 304 "$toolprefix"nm -g "$lib" | grep -v ' U ' | awk '{ print $3; }'
Chris@9 305 }
Chris@9 306
Chris@9 307 run_environmental_tests() {
Chris@9 308 dir="$1"
Chris@19 309 good=yes
Chris@32 310 cat /dev/null > "$reportdir/$dir.envtest.txt"
Chris@19 311 for lib in $dir/*$pluginext; do
Chris@19 312 if [ ! -f "$lib" ]; then
Chris@32 313 echo "NOTE: no library found in $dir?" | tee -a "$reportdir/$dir.envtest.txt"
Chris@19 314 good=no
Chris@19 315 else
Chris@19 316 echo
Chris@19 317 echo "Testing for exported symbols in $lib..."
Chris@19 318 if public_symbols "$lib" | grep -q vampGetPluginDescriptor; then
Chris@19 319 others=`public_symbols "$lib" | grep -v vampGetPluginDescriptor`
Chris@19 320 if [ -n "$others" ]; then
Chris@19 321 count=`echo "$others" | wc -l`
Chris@32 322 echo "WARNING: $count extra symbols exported by plugin library" | tee -a "$reportdir/$dir.envtest.txt"
Chris@19 323 good=no
Chris@19 324 else
Chris@32 325 echo "GOOD: library $lib only exports vampGetPluginDescriptor" | tee -a "$reportdir/$dir.envtest.txt"
Chris@19 326 fi
Chris@9 327 else
Chris@32 328 echo "NOTE: found library $lib that is not a Vamp plugin library" | tee -a "$reportdir/$dir.envtest.txt"
Chris@9 329 fi
Chris@9 330 fi
Chris@9 331 done
Chris@19 332 if [ "$good" != "yes" ]; then
Chris@19 333 echo "$dir" >> "$envcheckfailed"
Chris@19 334 fi
Chris@9 335 }
Chris@4 336
Chris@22 337 if ! build_or_rebuild "vamp-plugin-sdk"; then
Chris@5 338 echo "Failed to build Vamp plugin SDK!"
Chris@5 339 exit 1
Chris@5 340 fi
Chris@5 341
Chris@26 342 # Ensure we can only link statically against these
Chris@26 343 for x in vamp-hostsdk vamp-sdk; do
Chris@26 344 for y in dylib dll so; do
Chris@26 345 rm -f "vamp-plugin-sdk/lib$x.$y"
Chris@26 346 rm -f "vamp-plugin-sdk/$x.$y"
Chris@26 347 done
Chris@26 348 done
Chris@26 349
Chris@22 350 if ! build_or_rebuild "vamp-plugin-tester"; then
Chris@5 351 echo "Failed to build Vamp plugin tester!"
Chris@5 352 exit 1
Chris@5 353 fi
Chris@5 354
Chris@11 355 for dir in $plugindirs ; do
Chris@31 356 dir=${dir%/*}
Chris@4 357 echo
Chris@4 358 echo "Processing: $dir"
Chris@31 359 if [ ! -d "$dir" ]; then
Chris@31 360 echo "Directory $dir not found!"
Chris@31 361 echo "$dir" >> "$notbuilt"
Chris@31 362 elif build_or_rebuild "$dir"; then
Chris@19 363 if have_plugin "$dir" ; then
Chris@19 364 echo "$dir" >> "$built"
Chris@19 365 run_tester "$dir"
Chris@19 366 run_environmental_tests "$dir"
Chris@19 367 else
Chris@36 368 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 369 echo "$dir" >> "$notbuilt"
Chris@19 370 fi
Chris@4 371 else
Chris@6 372 echo "$dir" >> "$notbuilt"
Chris@4 373 fi
Chris@38 374 cat /dev/null > "$reportdir/$dir.summary.txt"
Chris@1 375 done
Chris@1 376
Chris@4 377 echo
Chris@19 378 echo "** Successfully built, tested, and checked:"
Chris@6 379 cat "$built" | while read d; do
Chris@6 380 if ! grep -q "^$d\$" "$testfailed"; then
Chris@32 381 if ! grep -q "^$d\$" "$envcheckfailed"; then
Chris@32 382 echo "$d"
Chris@38 383 echo "$d: Success" >> "$reportdir/$d.summary.txt"
Chris@32 384 fi
Chris@6 385 fi
Chris@6 386 done | sort
Chris@4 387
Chris@4 388 echo
Chris@19 389 echo "** Failed tests:"
Chris@6 390 cat "$testfailed" | sort | uniq | while read d; do
Chris@6 391 echo "$d"
Chris@38 392 echo "$d: Built successfully, but failed tests" >> "$reportdir/$d.summary.txt"
Chris@6 393 done
Chris@5 394
Chris@5 395 echo
Chris@19 396 echo "** Failed environmental checks:"
Chris@19 397 cat "$envcheckfailed" | sort | uniq | while read d; do
Chris@19 398 echo "$d"
Chris@38 399 echo "$d: Built successfully, but failed environmental checks" >> "$reportdir/$d.summary.txt"
Chris@19 400 done
Chris@19 401
Chris@19 402 echo
Chris@4 403 echo "** Failed to build:"
Chris@6 404 cat "$notbuilt" | sort | while read d; do
Chris@6 405 echo "$d"
Chris@38 406 echo "$d: Failed to build" >> "$reportdir/$d.summary.txt"
Chris@6 407 done
Chris@4 408
Chris@4 409 echo