annotate SCRIPTS/process.sh @ 21:ee6b7d71155b

Some os/x build fixes
author Chris Cannam
date Tue, 05 Aug 2014 12:55:55 +0100
parents b7f35acc8561
children 5b4cb5af2a90
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@13 15 #platform=linux
Chris@13 16 #bits=64
Chris@19 17 #toolprefix=""
Chris@19 18 #pluginext=.so
Chris@19 19 #hostwrapper=""
Chris@19 20 #hostext=""
Chris@21 21 #archflags=
Chris@14 22
Chris@21 23 #platform=mingw
Chris@21 24 #bits=32
Chris@21 25 #toolprefix=i686-w64-mingw32-
Chris@21 26 #pluginext=.dll
Chris@21 27 #hostwrapper=wine
Chris@21 28 #hostext=.exe
Chris@21 29 #archflags=
Chris@21 30
Chris@21 31 platform=osx
Chris@21 32 bits=64
Chris@21 33 toolprefix=
Chris@21 34 pluginext=.dylib
Chris@21 35 hostwrapper=
Chris@21 36 hostext=
Chris@21 37 archflags="-arch x86_64"
Chris@15 38
Chris@19 39 depincdir="$mydir"/../DEPENDENCIES/$platform$bits/include
Chris@19 40 deplibdir="$mydir"/../DEPENDENCIES/$platform$bits/lib
Chris@19 41
Chris@19 42 depincdir_generic="$mydir"/../DEPENDENCIES/generic/include
Chris@1 43
Chris@11 44 plugindirs="$@"
Chris@11 45 if [ -z "$plugindirs" ]; then
Chris@11 46 plugindirs=$(cat .hgsub | grep -v vamp-plugin-sdk | grep -v vamp-plugin-tester | awk '{ print $1; }')
Chris@11 47 fi
Chris@11 48
Chris@6 49 reportdir="REPORTS/$platform$bits"
Chris@6 50 mkdir -p "$reportdir" || exit 1
Chris@6 51
Chris@9 52 built="/tmp/built.$$.txt"
Chris@9 53 testfailed="/tmp/testfailed.$$.txt"
Chris@19 54 envcheckfailed="/tmp/envcheckfailed.$$.txt"
Chris@9 55 notbuilt="/tmp/notbuilt.$$.txt"
Chris@19 56 trap 'rm -f "$built" "$envcheckfailed" "$testfailed" "$notbuilt"' 0
Chris@19 57 touch "$built" "$envcheckfailed" "$testfailed" "$notbuilt"
Chris@9 58
Chris@4 59 configure() {
Chris@4 60 dir="$1"
Chris@4 61 if [ -f "$dir/configure" ] ; then
Chris@6 62 ( cd "$dir" ; ./configure ) 2>&1 | tee "$reportdir/$dir.configure.txt"
Chris@4 63 fi
Chris@4 64 }
Chris@4 65
Chris@1 66 find_makefile() {
Chris@1 67 dir="$1"
Chris@9 68 for f in \
Chris@19 69 build/$platform$bits/Makefile.$platform$bits \
Chris@13 70 build/$platform/Makefile.$platform$bits \
Chris@19 71 build/$platform$bits/Makefile.$platform \
Chris@19 72 build/$platform$bits/Makefile \
Chris@19 73 build/Makefile.$platform$bits \
Chris@19 74 Makefile.$platform$bits \
Chris@13 75 build/$platform/Makefile.$platform \
Chris@13 76 build/$platform/Makefile \
Chris@13 77 build/Makefile.$platform \
Chris@9 78 Makefile.$platform \
Chris@13 79 Makefile ; do
Chris@1 80 if [ -f "$dir/$f" ]; then
Chris@1 81 echo $f
Chris@1 82 break
Chris@1 83 fi
Chris@1 84 done
Chris@1 85 }
Chris@1 86
Chris@13 87 configure_maybe() {
Chris@13 88 dir="$1"
Chris@13 89 mfile=$(find_makefile "$dir")
Chris@13 90 if [ -z "$mfile" ]; then
Chris@13 91 configure "$dir"
Chris@13 92 fi
Chris@13 93 }
Chris@13 94
Chris@19 95 target_for() {
Chris@19 96 dir="$1"
Chris@19 97 if grep -q "^$dir: " METADATA/maketarget.txt ; then
Chris@19 98 grep "^$dir: " METADATA/maketarget.txt | head -1 | sed 's/^[^:]*: //'
Chris@19 99 fi
Chris@19 100 }
Chris@19 101
Chris@4 102 build() {
Chris@4 103 dir="$1"
Chris@1 104 if configure_maybe "$dir"; then
Chris@1 105 mfile=$(find_makefile "$dir")
Chris@1 106 if [ -n "$mfile" ]; then
Chris@19 107 target=$(target_for "$dir")
Chris@19 108 TOOLPREFIX="$toolprefix" \
Chris@21 109 CXXFLAGS="-I${depincdir} -I${depincdir_generic} -I../vamp-plugin-sdk" \
Chris@21 110 LDFLAGS="-L${deplibdir} -L../vamp-plugin-sdk" \
Chris@21 111 ARCHFLAGS="$archflags" \
Chris@19 112 make -C "$dir" -f "$mfile" $target 2>&1 | \
Chris@19 113 tee "$reportdir/$dir.build.txt"
Chris@9 114 return ${PIPESTATUS[0]}
Chris@1 115 else
Chris@1 116 echo "Failed to find a Makefile in $dir"
Chris@4 117 return 1
Chris@1 118 fi
Chris@1 119 fi
Chris@4 120 }
Chris@4 121
Chris@4 122 rebuild() {
Chris@4 123 dir="$1"
Chris@13 124 if configure_maybe "$dir"; then
Chris@4 125 mfile=$(find_makefile "$dir")
Chris@4 126 if [ -n "$mfile" ]; then
Chris@4 127 make -C "$dir" -f "$mfile" clean
Chris@19 128 build "$dir"
Chris@4 129 else
Chris@4 130 echo "Failed to find a Makefile in $dir"
Chris@4 131 return 1
Chris@4 132 fi
Chris@4 133 fi
Chris@4 134 }
Chris@4 135
Chris@19 136 have_plugin() {
Chris@19 137 dir="$1"
Chris@19 138 for x in "$dir/"*"$pluginext"; do
Chris@19 139 if [ -f "$x" ]; then
Chris@19 140 return 0
Chris@19 141 fi
Chris@19 142 done
Chris@19 143 return 1
Chris@19 144 }
Chris@19 145
Chris@19 146 is_nondeterministic() {
Chris@19 147 plugin_id="$1"
Chris@19 148 grep -q "^$id\$" METADATA/nondeterministic.txt
Chris@19 149 }
Chris@19 150
Chris@5 151 run_tester() {
Chris@7 152 ##!!! todo: timeout if the plugin takes too long and report as failure?
Chris@5 153 dir="$1"
Chris@19 154 ids=$(VAMP_PATH="$dir" $hostwrapper vamp-plugin-sdk/host/vamp-simple-host$hostext --list-ids | sed 's/^vamp://' | sed 's/\r//g' )
Chris@6 155 if [ -z "$ids" ]; then
Chris@6 156 echo
Chris@6 157 echo "No plugins reported to test in $dir"
Chris@6 158 return 1
Chris@5 159 else
Chris@6 160 for id in $ids; do
Chris@6 161 extra=""
Chris@19 162 if is_nondeterministic "$id"; then
Chris@6 163 extra="-n"
Chris@6 164 fi
Chris@19 165 echo "Running command: VAMP_PATH=\"$dir\" $hostwrapper vamp-plugin-tester/vamp-plugin-tester$hostext \"$extra\" \"$id\""
Chris@19 166 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 167 echo "OK"
Chris@6 168 else
Chris@6 169 echo
Chris@6 170 echo "Tester failed for id $id: running again with valgrind and verbose for a report..."
Chris@6 171 echo "$dir" >> "$testfailed"
Chris@19 172 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 173 return 1
Chris@6 174 fi
Chris@6 175 done
Chris@5 176 fi
Chris@5 177 }
Chris@5 178
Chris@9 179 public_symbols() {
Chris@9 180 lib="$1"
Chris@19 181 "$toolprefix"nm -g --defined-only "$lib" | awk '{ print $3; }'
Chris@9 182 }
Chris@9 183
Chris@9 184 run_environmental_tests() {
Chris@9 185 dir="$1"
Chris@19 186 good=yes
Chris@19 187 for lib in $dir/*$pluginext; do
Chris@19 188 if [ ! -f "$lib" ]; then
Chris@19 189 echo "NOTE: no library found in $dir?"
Chris@19 190 good=no
Chris@19 191 else
Chris@19 192 echo
Chris@19 193 echo "Testing for exported symbols in $lib..."
Chris@19 194 if public_symbols "$lib" | grep -q vampGetPluginDescriptor; then
Chris@19 195 others=`public_symbols "$lib" | grep -v vampGetPluginDescriptor`
Chris@19 196 if [ -n "$others" ]; then
Chris@19 197 count=`echo "$others" | wc -l`
Chris@19 198 echo "WARNING: $count extra symbols exported by plugin library"
Chris@19 199 good=no
Chris@19 200 else
Chris@19 201 echo "GOOD: library $lib only exports vampGetPluginDescriptor"
Chris@19 202 fi
Chris@9 203 else
Chris@19 204 echo "NOTE: found library $lib that is not a Vamp plugin library"
Chris@9 205 fi
Chris@9 206 fi
Chris@9 207 done
Chris@19 208 if [ "$good" != "yes" ]; then
Chris@19 209 echo "$dir" >> "$envcheckfailed"
Chris@19 210 fi
Chris@9 211 }
Chris@4 212
Chris@21 213 if ! rebuild "vamp-plugin-sdk"; then
Chris@5 214 echo "Failed to build Vamp plugin SDK!"
Chris@5 215 exit 1
Chris@5 216 fi
Chris@5 217
Chris@21 218 if ! rebuild "vamp-plugin-tester"; then
Chris@5 219 echo "Failed to build Vamp plugin tester!"
Chris@5 220 exit 1
Chris@5 221 fi
Chris@5 222
Chris@11 223 for dir in $plugindirs ; do
Chris@4 224 echo
Chris@4 225 echo "Processing: $dir"
Chris@21 226 if rebuild "$dir"; then
Chris@19 227 if have_plugin "$dir" ; then
Chris@19 228 echo "$dir" >> "$built"
Chris@19 229 run_tester "$dir"
Chris@19 230 run_environmental_tests "$dir"
Chris@19 231 else
Chris@19 232 echo "Build apparently succeeded, but no resulting plugin(s) found" | tee -a "$reportdir/$dir.build.txt"
Chris@19 233 echo "$dir" >> "$notbuilt"
Chris@19 234 fi
Chris@4 235 else
Chris@6 236 echo "$dir" >> "$notbuilt"
Chris@4 237 fi
Chris@1 238 done
Chris@1 239
Chris@10 240 cat /dev/null > "$reportdir/$dir.summary.txt"
Chris@6 241
Chris@4 242 echo
Chris@19 243 echo "** Successfully built, tested, and checked:"
Chris@6 244 cat "$built" | while read d; do
Chris@6 245 if ! grep -q "^$d\$" "$testfailed"; then
Chris@6 246 echo "$d"
Chris@6 247 echo "Success" >> "$reportdir/$d.summary.txt"
Chris@6 248 fi
Chris@6 249 done | sort
Chris@4 250
Chris@4 251 echo
Chris@19 252 echo "** Failed tests:"
Chris@6 253 cat "$testfailed" | sort | uniq | while read d; do
Chris@6 254 echo "$d"
Chris@6 255 echo "Built successfully, but failed tests" >> "$reportdir/$d.summary.txt"
Chris@6 256 done
Chris@5 257
Chris@5 258 echo
Chris@19 259 echo "** Failed environmental checks:"
Chris@19 260 cat "$envcheckfailed" | sort | uniq | while read d; do
Chris@19 261 echo "$d"
Chris@19 262 echo "Built successfully, but failed environmental checks" >> "$reportdir/$d.summary.txt"
Chris@19 263 done
Chris@19 264
Chris@19 265 echo
Chris@4 266 echo "** Failed to build:"
Chris@6 267 cat "$notbuilt" | sort | while read d; do
Chris@6 268 echo "$d"
Chris@6 269 echo "Failed to build" >> "$reportdir/$d.summary.txt"
Chris@6 270 done
Chris@4 271
Chris@4 272 echo