annotate SCRIPTS/process.sh @ 26:edb8f67e06d2

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