annotate SCRIPTS/process.sh @ 36:56eff3575b55

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