Chris@1: #!/bin/bash Chris@1: Chris@6: # Run this from the top-level vamp-build-and-test directory Chris@6: Chris@1: ## Things to test: Chris@1: ## the plugin builds! Chris@1: ## plugin loads Chris@1: ## passes vamp-plugin-tester tests Chris@1: ## does not export any unnecessary symbols Chris@1: ## has valid .cat and .n3 Chris@1: Chris@13: #platform=linux Chris@13: #bits=64 Chris@13: Chris@13: platform=mingw Chris@13: bits=32 Chris@13: toolprefix=i686-w64-mingw32- Chris@1: Chris@11: plugindirs="$@" Chris@11: if [ -z "$plugindirs" ]; then Chris@11: plugindirs=$(cat .hgsub | grep -v vamp-plugin-sdk | grep -v vamp-plugin-tester | awk '{ print $1; }') Chris@11: fi Chris@11: Chris@6: reportdir="REPORTS/$platform$bits" Chris@6: mkdir -p "$reportdir" || exit 1 Chris@6: Chris@9: built="/tmp/built.$$.txt" Chris@9: testfailed="/tmp/testfailed.$$.txt" Chris@9: notbuilt="/tmp/notbuilt.$$.txt" Chris@9: trap 'rm -f "$built" "$testfailed" "$notbuilt"' 0 Chris@9: touch "$built" "$testfailed" "$notbuilt" Chris@9: Chris@4: configure() { Chris@4: dir="$1" Chris@4: if [ -f "$dir/configure" ] ; then Chris@6: ( cd "$dir" ; ./configure ) 2>&1 | tee "$reportdir/$dir.configure.txt" Chris@4: fi Chris@4: } Chris@4: Chris@1: find_makefile() { Chris@1: dir="$1" Chris@9: for f in \ Chris@13: build/$platform/Makefile.$platform$bits \ Chris@13: build/$platform/Makefile.$platform \ Chris@13: build/$platform/Makefile \ Chris@13: build/Makefile.$platform$bits \ Chris@13: build/Makefile.$platform \ Chris@13: Makefile.$platform$bits \ Chris@9: Makefile.$platform \ Chris@13: Makefile ; do Chris@1: if [ -f "$dir/$f" ]; then Chris@1: echo $f Chris@1: break Chris@1: fi Chris@1: done Chris@1: } Chris@1: Chris@13: configure_maybe() { Chris@13: dir="$1" Chris@13: mfile=$(find_makefile "$dir") Chris@13: if [ -z "$mfile" ]; then Chris@13: configure "$dir" Chris@13: fi Chris@13: } Chris@13: Chris@4: build() { Chris@4: dir="$1" Chris@1: if configure_maybe "$dir"; then Chris@1: mfile=$(find_makefile "$dir") Chris@1: if [ -n "$mfile" ]; then Chris@13: make -C "$dir" -f "$mfile" TOOLPREFIX="$toolprefix" 2>&1 | tee "$reportdir/$dir.build.txt" Chris@9: return ${PIPESTATUS[0]} Chris@1: else Chris@1: echo "Failed to find a Makefile in $dir" Chris@4: return 1 Chris@1: fi Chris@1: fi Chris@4: } Chris@4: Chris@4: rebuild() { Chris@4: dir="$1" Chris@13: if configure_maybe "$dir"; then Chris@4: mfile=$(find_makefile "$dir") Chris@4: if [ -n "$mfile" ]; then Chris@4: make -C "$dir" -f "$mfile" clean Chris@13: make -C "$dir" -f "$mfile" TOOLPREFIX="$toolprefix" 2>&1 | tee "$reportdir/$dir.build.txt" Chris@9: return ${PIPESTATUS[0]} Chris@4: else Chris@4: echo "Failed to find a Makefile in $dir" Chris@4: return 1 Chris@4: fi Chris@4: fi Chris@4: } Chris@4: Chris@5: run_tester() { Chris@7: ##!!! todo: timeout if the plugin takes too long and report as failure? Chris@5: dir="$1" Chris@6: ids=$(VAMP_PATH="$dir" vamp-plugin-sdk/host/vamp-simple-host --list-ids | sed 's/^vamp://') Chris@6: if [ -z "$ids" ]; then Chris@6: echo Chris@6: echo "No plugins reported to test in $dir" Chris@6: return 1 Chris@5: else Chris@6: for id in $ids; do Chris@6: extra="" Chris@10: if grep -q "^$id\$" METADATA/nondeterministic.txt; then Chris@6: extra="-n" Chris@6: fi Chris@9: if ( VAMP_PATH="$dir" vamp-plugin-tester/vamp-plugin-tester "$extra" "$id" 2>&1 | tee "$reportdir/$dir.test.txt" ; exit ${PIPESTATUS[0]} ) ; then Chris@6: echo "OK" Chris@6: else Chris@6: echo Chris@6: echo "Tester failed for id $id: running again with valgrind and verbose for a report..." Chris@6: echo "$dir" >> "$testfailed" Chris@6: VAMP_PATH="$dir" valgrind vamp-plugin-tester/vamp-plugin-tester -v "$extra" "$id" 2>&1 | tee -a "$reportdir/$dir.test.txt" Chris@9: return 1 Chris@6: fi Chris@6: done Chris@5: fi Chris@5: } Chris@5: Chris@9: public_symbols() { Chris@9: lib="$1" Chris@9: nm -g --defined-only "$lib" | awk '{ print $3; }' Chris@9: } Chris@9: Chris@9: run_environmental_tests() { Chris@9: dir="$1" Chris@9: for lib in $dir/*.so; do Chris@9: if public_symbols "$lib" | grep -q vampGetPluginDescriptor; then Chris@9: others=`public_symbols "$lib" | grep -v vampGetPluginDescriptor` Chris@9: if [ -n "$others" ]; then Chris@9: count=`echo "$others" | wc -l` Chris@9: echo "WARNING: $count extra symbols exported by plugin library" Chris@9: #!!! what to do about it? Chris@9: else Chris@9: echo "GOOD: library $lib only exports vampGetPluginDescriptor" Chris@9: fi Chris@9: else Chris@9: echo "NOTE: found library $lib that is not a Vamp plugin library" Chris@9: fi Chris@9: done Chris@9: } Chris@4: Chris@13: if ! rebuild "vamp-plugin-sdk"; then Chris@5: echo "Failed to build Vamp plugin SDK!" Chris@5: exit 1 Chris@5: fi Chris@5: Chris@13: if ! rebuild "vamp-plugin-tester"; then Chris@5: echo "Failed to build Vamp plugin tester!" Chris@5: exit 1 Chris@5: fi Chris@5: Chris@11: for dir in $plugindirs ; do Chris@4: echo Chris@4: echo "Processing: $dir" Chris@6: if rebuild "$dir"; then Chris@6: echo "$dir" >> "$built" Chris@6: run_tester "$dir" Chris@9: run_environmental_tests "$dir" Chris@4: else Chris@6: echo "$dir" >> "$notbuilt" Chris@4: fi Chris@1: done Chris@1: Chris@10: cat /dev/null > "$reportdir/$dir.summary.txt" Chris@6: Chris@4: echo Chris@5: echo "** Successfully built and tested:" Chris@6: cat "$built" | while read d; do Chris@6: if ! grep -q "^$d\$" "$testfailed"; then Chris@6: echo "$d" Chris@6: echo "Success" >> "$reportdir/$d.summary.txt" Chris@6: fi Chris@6: done | sort Chris@4: Chris@4: echo Chris@5: echo "** Built, but failed tests:" Chris@6: cat "$testfailed" | sort | uniq | while read d; do Chris@6: echo "$d" Chris@6: echo "Built successfully, but failed tests" >> "$reportdir/$d.summary.txt" Chris@6: done Chris@5: Chris@5: echo Chris@4: echo "** Failed to build:" Chris@6: cat "$notbuilt" | sort | while read d; do Chris@6: echo "$d" Chris@6: echo "Failed to build" >> "$reportdir/$d.summary.txt" Chris@6: done Chris@4: Chris@4: echo