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@88: set -e Chris@86: Chris@19: mydir=$(dirname "$0") Chris@19: case "$mydir" in /*);; *) mydir=$(pwd)/"$mydir";; esac Chris@19: Chris@75: . "$mydir"/include.sh Chris@75: Chris@57: have_all=true Chris@66: for program in make perl git svn hg zip tar ; do Chris@57: if ! $program --version >/dev/null 2>&1; then Chris@57: if ! $program -v 2>&1 | grep -q version; then Chris@57: echo " ** $program program not found" Chris@57: have_all=false Chris@57: fi Chris@57: fi Chris@57: done Chris@57: if [ "$have_all" != "true" ]; then Chris@57: echo "Not all dependencies found, exiting" Chris@57: exit 1 Chris@57: fi Chris@57: Chris@22: do_rebuild="" Chris@121: do_speedy="" Chris@121: Chris@121: speedy_test_pattern="^[ABE]" Chris@14: Chris@22: usage() { Chris@22: echo Chris@121: echo "Usage: $0 [-c] [-s] [ ...]" Chris@22: echo Chris@31: echo " one of native, linux32, linux64, mingw32, mingw64, osx32, osx64" Chris@22: echo " -c build from clean" Chris@121: echo " -s speedy build: skip the slower tests" Chris@22: echo " directory to build (default is all of them)" Chris@22: echo Chris@22: echo "Platform usually should match the platform you are running this" Chris@22: echo "script on, unless you have a cross-compile toolset installed and" Chris@31: echo "this script knows how to run it. The special platform 'native'" Chris@31: echo "tries to guess the currently running platform." Chris@22: echo Chris@22: exit 2 Chris@22: } Chris@21: Chris@31: platform_arg="$1" Chris@109: platform_native="unknown" Chris@109: case `uname -a` in Chris@109: Linux*x86_64*) platform_native=linux64;; Chris@109: Linux*) platform_native=linux32;; Chris@109: Darwin*) platform_native=osx64;; Chris@109: CYG*) platform_native=mingw32;; Chris@109: MINGW*) platform_native=mingw32;; Chris@109: esac Chris@31: Chris@31: if [ "$platform_arg" = "native" ]; then Chris@109: platform_arg="$platform_native" Chris@31: fi Chris@31: Chris@78: platform= Chris@110: platform_defines=("UNUSED_=") # Avoid passing empty arg to make as if target Chris@114: pubtag= Chris@78: bits=32 Chris@78: altbits= Chris@78: toolprefix= Chris@78: pluginext= Chris@78: hostwrapper= Chris@78: hostext= Chris@78: valgrind= Chris@78: archflags= Chris@78: identpattern= Chris@96: sep=":" Chris@78: Chris@31: case "$platform_arg" in Chris@22: linux32) Chris@22: platform=linux Chris@114: pubtag=linux32 Chris@109: if [ "$platform_native" = "linux64" ]; then Chris@109: toolprefix=x86_64-unknown-linux-gnu- Chris@109: platform_defines=("CXX=${toolprefix}g++ -m32" "CC=${toolprefix}gcc -m32" "LD=${toolprefix}g++ -m32") Chris@109: fi Chris@22: pluginext=.so Chris@38: valgrind=valgrind Chris@42: identpattern='ELF 32' Chris@22: ;; Chris@22: linux64) Chris@22: platform=linux Chris@22: bits=64 Chris@114: pubtag=linux64 Chris@22: pluginext=.so Chris@38: valgrind=valgrind Chris@42: identpattern='ELF 64' Chris@22: ;; Chris@22: mingw32) Chris@22: platform=mingw Chris@114: pubtag=win32 Chris@22: toolprefix=i686-w64-mingw32- Chris@22: pluginext=.dll Chris@22: hostwrapper=wine Chris@22: hostext=.exe Chris@36: identpattern='PE32.*386.*Windows' Chris@96: sep=";" Chris@22: ;; Chris@22: mingw64) Chris@22: platform=mingw Chris@22: bits=64 Chris@114: pubtag=win64 Chris@78: altbits=32 # We can usually use a mingw32 Makefile if toolprefix is OK Chris@22: toolprefix=x86_64-w64-mingw32- Chris@22: pluginext=.dll Chris@22: hostwrapper=wine Chris@22: hostext=.exe Chris@78: identpattern='PE32.*x86-64.*Windows' Chris@96: sep=";" Chris@22: ;; Chris@22: osx32) Chris@22: platform=osx Chris@114: pubtag=osx32 Chris@22: pluginext=.dylib Chris@22: archflags="-arch i386" Chris@40: identpattern='Mach-O .*i386' Chris@22: ;; Chris@22: osx64) Chris@22: platform=osx Chris@22: bits=64 Chris@114: pubtag=osx Chris@22: pluginext=.dylib Chris@26: # This is a difficult choice for various reasons... have to ponder Chris@107: archflags="-mmacosx-version-min=10.7 -arch x86_64 -arch i386 -stdlib=libc++" Chris@40: identpattern='Mach-O 64-bit .*x86_64' Chris@22: ;; Chris@88: *) Chris@88: usage Chris@88: ;; Chris@22: esac; Chris@22: Chris@22: shift Chris@22: Chris@22: if [ -z "$platform" ]; then Chris@22: usage Chris@22: else Chris@114: echo "(Platform is $platform, $bits bits, package platform tag $pubtag)" Chris@22: fi Chris@22: Chris@78: if [ -z "$pluginext" ]; then Chris@78: echo "Internal error: pluginext not set for platform $platform" 1>&2 Chris@78: exit 2 Chris@78: fi Chris@78: Chris@78: if [ -z "$identpattern" ]; then Chris@78: echo "Internal error: identpattern not set for platform $platform" 1>&2 Chris@78: exit 2 Chris@78: fi Chris@78: Chris@121: while true; do Chris@121: case "t$1" in Chris@121: t-c) Chris@121: echo "(Building from clean)" Chris@121: do_rebuild=yes Chris@121: shift ;; Chris@121: t-s) Chris@121: echo "(Speedy build)" Chris@121: do_speedy=yes Chris@121: shift ;; Chris@121: *) Chris@121: break;; Chris@121: esac Chris@121: done Chris@15: Chris@91: metadir="$mydir"/../METADATA Chris@91: Chris@19: depincdir="$mydir"/../DEPENDENCIES/$platform$bits/include Chris@19: deplibdir="$mydir"/../DEPENDENCIES/$platform$bits/lib Chris@88: depincdir_generic="$mydir"/../DEPENDENCIES/generic/include Chris@19: Chris@88: pyver=27 Chris@88: pyincdir="$mydir"/../DEPENDENCIES/$platform$bits/Python$pyver/include Chris@88: numpyincdir="$mydir"/../DEPENDENCIES/$platform$bits/Python$pyver/Lib/site-packages/numpy/core/include Chris@88: pylibdir="$mydir"/../DEPENDENCIES/$platform$bits/Python$pyver/libs Chris@1: Chris@11: plugindirs="$@" Chris@11: if [ -z "$plugindirs" ]; then Chris@100: plugindirs=$(cat METADATA/repos.txt | grep -v vamp-plugin-sdk | grep -v vamp-plugin-tester | awk '{ print $1; }') Chris@61: else Chris@61: for dir in $plugindirs ; do Chris@61: if [ ! -d "$dir" ]; then Chris@61: echo "ERROR: Directory $dir not found" Chris@61: usage Chris@61: fi Chris@61: done Chris@11: fi Chris@11: Chris@88: set -u Chris@88: Chris@6: reportdir="REPORTS/$platform$bits" Chris@49: packagedir="PACKAGES/$platform$bits" Chris@49: Chris@49: mkdir -p "$reportdir" "$packagedir" || exit 1 Chris@6: Chris@9: built="/tmp/built.$$.txt" Chris@9: testfailed="/tmp/testfailed.$$.txt" Chris@19: envcheckfailed="/tmp/envcheckfailed.$$.txt" Chris@9: notbuilt="/tmp/notbuilt.$$.txt" Chris@49: Chris@19: trap 'rm -f "$built" "$envcheckfailed" "$testfailed" "$notbuilt"' 0 Chris@19: touch "$built" "$envcheckfailed" "$testfailed" "$notbuilt" Chris@9: Chris@86: target_for() { Chris@86: local dir="$1" Chris@91: if grep -q "^$dir: " ${metadir}/maketarget.txt ; then Chris@91: grep "^$dir: " ${metadir}/maketarget.txt | head -1 | sed 's/^[^:]*: //' Chris@86: fi Chris@86: } Chris@86: Chris@109: custom_plugin_dir_for() { Chris@86: local dir="$1" Chris@91: if grep -q "^$dir: " ${metadir}/plugindir.txt ; then Chris@91: echo "${mydir}/../${dir}"/$(grep "^$dir: " ${metadir}/plugindir.txt | head -1 | sed 's/^[^:]*: //') Chris@86: fi Chris@86: } Chris@86: Chris@109: plugin_dir_for() { Chris@109: local dir="$1" Chris@109: local pdir=$(custom_plugin_dir_for "$dir") Chris@109: if [ -z "$pdir" ]; then Chris@109: case "$dir" in Chris@109: /*) pdir="$dir" ;; Chris@109: *) pdir="${mydir}/../${dir}";; Chris@109: esac Chris@109: fi Chris@109: echo "$pdir" Chris@109: } Chris@109: Chris@4: configure() { Chris@86: local 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@129: repoint() { Chris@129: local dir="$1" Chris@129: if [ -f "$dir/repoint-project.json" ] ; then Chris@129: ( cd "$dir" ; ./repoint install ) 2>&1 | tee "$reportdir/$dir.repoint.txt" Chris@129: fi Chris@129: } Chris@129: Chris@1: find_makefile() { Chris@86: local dir="$1" Chris@9: for f in \ Chris@19: build/$platform$bits/Makefile.$platform$bits \ Chris@13: build/$platform/Makefile.$platform$bits \ Chris@19: build/$platform$bits/Makefile.$platform \ Chris@19: build/$platform$bits/Makefile \ Chris@19: build/Makefile.$platform$bits \ Chris@19: Makefile.$platform$bits \ Chris@13: build/$platform/Makefile.$platform \ Chris@13: build/$platform/Makefile \ Chris@13: build/Makefile.$platform \ Chris@9: Makefile.$platform \ Chris@78: build/$platform$altbits/Makefile.$platform$altbits \ Chris@78: build/$platform/Makefile.$platform$altbits \ Chris@78: build/$platform$altbits/Makefile.$platform \ Chris@78: build/$platform$altbits/Makefile \ Chris@78: build/Makefile.$platform$altbits \ Chris@78: Makefile.$platform$altbits \ 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@86: find_vampy_plugins_in() { Chris@86: local dir="$1" Chris@86: local pdir=$(plugin_dir_for "$dir") Chris@86: find "$pdir" -name \*.py -print0 | xargs -0 grep -l 'import.*\bvampy\b' Chris@86: } Chris@86: Chris@86: have_vampy_plugins() { Chris@86: local dir="$1" Chris@86: local plugs=$(find_vampy_plugins_in "$dir") Chris@86: if [ -z "$plugs" ]; then Chris@86: return 1 Chris@86: else Chris@86: return 0 Chris@86: fi Chris@86: } Chris@86: Chris@13: configure_maybe() { Chris@86: local dir="$1" Chris@43: if [ t"$do_rebuild" = t"yes" ]; then Chris@43: configure "$dir" Chris@43: else Chris@43: mfile=$(find_makefile "$dir") Chris@43: if [ -z "$mfile" ]; then Chris@43: configure "$dir" Chris@43: fi Chris@13: fi Chris@13: } Chris@13: Chris@44: logfile_for() { Chris@86: local activity="$1" Chris@86: local dir="$2" Chris@44: echo "$reportdir/$dir.$activity.txt" Chris@44: } Chris@44: Chris@4: build() { Chris@86: local dir="$1" Chris@86: local log=$(logfile_for build "$dir") Chris@129: repoint "$dir" Chris@1: if configure_maybe "$dir"; then Chris@1: mfile=$(find_makefile "$dir") Chris@1: if [ -n "$mfile" ]; then Chris@19: target=$(target_for "$dir") Chris@19: TOOLPREFIX="$toolprefix" \ Chris@90: CXXFLAGS="-I${depincdir} -I${pyincdir} -I${numpyincdir} -I${depincdir_generic} -I${mydir}/../vamp-plugin-sdk" \ Chris@90: LDFLAGS="-L${deplibdir} -L${pylibdir} -L${mydir}/../vamp-plugin-sdk" \ Chris@21: ARCHFLAGS="$archflags" \ Chris@109: make -C "$dir" -f "$mfile" $target "${platform_defines[@]}" 2>&1 | \ Chris@44: tee "$log" Chris@9: return ${PIPESTATUS[0]} Chris@86: elif have_vampy_plugins "$dir"; then Chris@86: return 0 Chris@1: else Chris@88: echo "*** Failed to find a Makefile in $dir!" | tee "$log" Chris@4: return 1 Chris@1: fi Chris@1: fi Chris@4: } Chris@4: Chris@4: rebuild() { Chris@86: local dir="$1" Chris@86: local log=$(logfile_for build "$dir") Chris@130: repoint "$dir" Chris@13: if configure_maybe "$dir"; then Chris@4: mfile=$(find_makefile "$dir") Chris@4: if [ -n "$mfile" ]; then Chris@77: if make -C "$dir" -f "$mfile" distclean; then Chris@77: build "$dir" Chris@77: elif make -C "$dir" -f "$mfile" clean; then Chris@32: build "$dir" Chris@32: else Chris@88: echo "*** Failed to 'make clean' in $dir!" | tee "$log" Chris@32: return 1 Chris@32: fi Chris@86: elif have_vampy_plugins "$dir"; then Chris@86: return 0 Chris@4: else Chris@88: echo "*** Failed to find a Makefile in $dir!" | tee "$log" Chris@4: return 1 Chris@4: fi Chris@4: fi Chris@4: } Chris@4: Chris@22: build_or_rebuild() { Chris@86: local dir="$1" Chris@22: if [ -n "$do_rebuild" ]; then Chris@22: rebuild "$dir" Chris@22: else Chris@22: build "$dir" Chris@22: fi Chris@22: } Chris@22: Chris@19: have_plugin() { Chris@86: local dir="$1" Chris@86: local log=$(logfile_for build "$dir") Chris@19: for x in "$dir/"*"$pluginext"; do Chris@19: if [ -f "$x" ]; then Chris@36: if file "$x" | grep -q "$identpattern" ; then Chris@36: return 0 Chris@36: else Chris@44: echo "Plugin $x exists, but fails to match file type for correct platform (file type is: `file $x`, expected pattern is: $identpattern)" | tee "$log" Chris@36: return 1 Chris@36: fi Chris@19: fi Chris@19: done Chris@86: have_vampy_plugins "$dir" Chris@19: } Chris@19: Chris@19: is_nondeterministic() { Chris@19: plugin_id="$1" Chris@91: grep -q "^$id\$" ${metadir}/nondeterministic.txt Chris@19: } Chris@19: Chris@44: plugin_ids_in() { Chris@86: local dir="$1" Chris@86: local pdir=$(plugin_dir_for "$dir") Chris@86: local vampydir="" Chris@86: if have_vampy_plugins "$pdir"; then Chris@86: vampydir="./vampy" Chris@86: fi Chris@40: # can't use sed to remove \r from DOS line endings -- BSD and GNU Chris@44: # vary in how they interpret \r escape -- so we use perl for that... Chris@109: VAMP_PATH="$pdir$sep$vampydir" $hostwrapper \ Chris@44: vamp-plugin-sdk/host/vamp-simple-host$hostext --list-ids | \ Chris@44: grep '^vamp:' | \ Chris@44: sed 's/^vamp://' | \ Chris@44: perl -p -e 's/\r//g' Chris@44: } Chris@44: Chris@44: run_tester() { Chris@44: ##!!! todo: timeout if the plugin takes too long and report as failure Chris@86: local dir="$1" Chris@86: local log=$(logfile_for test "$dir") Chris@86: local ids=$(plugin_ids_in "$dir") Chris@86: local pdir=$(plugin_dir_for "$dir") Chris@44: cat /dev/null > "$log" Chris@6: if [ -z "$ids" ]; then Chris@6: echo Chris@44: echo "No plugins reported to test in $dir" | tee -a "$log" Chris@44: echo "$dir" >> "$testfailed" Chris@44: return 1 Chris@44: fi Chris@44: good=yes Chris@44: for id in $ids; do Chris@44: extra="" Chris@44: if is_nondeterministic "$id"; then Chris@44: extra="-n" Chris@44: fi Chris@121: tests=$($hostwrapper vamp-plugin-tester/vamp-plugin-tester$hostext -l | tail -n +6 | sed 's/ *|.*$//' | fmt -1000) Chris@121: for test in $tests; do Chris@121: run_this_test=yes Chris@121: if [ -n "$do_speedy" ]; then Chris@121: if echo "$test" | grep -q "$speedy_test_pattern"; then Chris@121: run_this_test=yes Chris@121: else Chris@121: run_this_test="" Chris@121: fi Chris@121: fi Chris@121: if [ -z "$run_this_test" ]; then Chris@121: continue Chris@121: fi Chris@121: echo "Running command: VAMP_PATH=\"$pdir\" $hostwrapper vamp-plugin-tester/vamp-plugin-tester$hostext \"$extra\" -t \"$test\" \"$id\"" | tee -a "$log" Chris@131: if ( VAMP_PATH="$pdir$sep./vampy" $hostwrapper vamp-plugin-tester/vamp-plugin-tester$hostext "$extra" -t "$test" "$id" 2>&1 | tee -a "$log" ; exit ${PIPESTATUS[0]} ) ; then Chris@121: echo "OK" | tee -a "$log" Chris@86: else Chris@121: if [ -n "$do_speedy" ]; then Chris@121: echo | tee -a "$log" Chris@121: echo "Tester failed for id $id and test $test (not restarting with valgrind, as speedy flag is set)" | tee -a "$log" Chris@121: elif have_vampy_plugins "$pdir"; then # (don't attempt vampy+valgrind) Chris@121: echo | tee -a "$log" Chris@121: echo "Tester failed for id $id and test $test (not restarting with valgrind, as this is a VamPy plugin)" | tee -a "$log" Chris@121: else Chris@121: echo | tee -a "$log" Chris@121: echo "Tester failed for id $id and test $test: running again with valgrind (if available) and verbose for a report..." | tee -a "$log" Chris@121: VAMP_PATH="$pdir$sep./vampy" $valgrind $hostwrapper vamp-plugin-tester/vamp-plugin-tester$hostext -v "$extra" -t "$test" "$id" 2>&1 | tee -a "$log" Chris@121: fi Chris@121: good=no Chris@86: fi Chris@121: done Chris@44: done Chris@44: if [ "$good" != "yes" ]; then Chris@23: echo "$dir" >> "$testfailed" Chris@6: return 1 Chris@5: else Chris@44: return 0 Chris@5: fi Chris@5: } Chris@5: Chris@44: public_symbols_in() { Chris@9: lib="$1" Chris@23: # nm -g prints global symbols in both OS/X and GNU tools, but Chris@23: # printing only global *defined* symbols is harder. In GNU it is Chris@23: # nm -g --defined-only; the OS/X docs suggest nm -gu should work, Chris@23: # but it doesn't. What I think will work with both is simply Chris@23: # grepping out the undefineds: Chris@109: nm="${toolprefix}nm" Chris@109: if ! type -path "$nm" >/dev/null; then nm=nm; fi Chris@109: "$nm" -g "$lib" | grep -v ' U ' | awk '{ print $3; }' Chris@9: } Chris@9: Chris@44: env_test_exports() { Chris@86: local dir="$1" Chris@86: local log=$(logfile_for envtest "$dir") Chris@86: local good=yes Chris@44: for lib in "$dir"/*"$pluginext"; do Chris@44: if [ ! -f "$lib" ]; then Chris@44: # This should only happen if the glob was not expanded at all Chris@44: echo "NOTE: no library found in $dir?" | tee -a "$log" Chris@44: good=no Chris@44: break Chris@44: fi Chris@44: echo Chris@44: echo "Testing for exported symbols in $lib..." Chris@44: if public_symbols_in "$lib" | grep -q vampGetPluginDescriptor; then Chris@44: others=`public_symbols_in "$lib" | grep -v vampGetPluginDescriptor` Chris@44: if [ -n "$others" ]; then Chris@44: count=`echo "$others" | wc -l` Chris@44: echo "ERROR: library $lib exports $count extra symbols in addition to vampGetPluginDescriptor" | tee -a "$log" Chris@44: good=no Chris@44: else Chris@44: echo "GOOD: library $lib only exports vampGetPluginDescriptor" | tee -a "$log" Chris@44: fi Chris@44: else Chris@44: echo "NOTE: found library $lib that is not a Vamp plugin library" | tee -a "$log" Chris@44: fi Chris@44: done Chris@44: [ "$good" = "yes" ] Chris@44: } Chris@44: Chris@44: env_test_stdout() { Chris@86: local dir="$1" Chris@86: local log=$(logfile_for envtest "$dir") Chris@86: local pdir=$(plugin_dir_for "$dir") Chris@86: local good=yes Chris@109: local ids=$(VAMP_PATH="$pdir" $hostwrapper vamp-plugin-sdk/host/vamp-simple-host$hostext --list-ids); Chris@44: echo Chris@44: echo "Testing for any unwanted output to stdout..." Chris@44: for id in $ids; do Chris@44: case "$id" in Chris@44: vamp:*) ;; Chris@44: *) Chris@44: echo "ERROR: plugin in $dir prints to stdout as it runs: found text $id (should use stderr for debug logging to avoid mixing with batch output stream)" | tee -a "$log" Chris@44: good=no Chris@44: ;; Chris@44: esac Chris@44: done Chris@44: [ "$good" = "yes" ] Chris@44: } Chris@44: Chris@44: env_test_cat() { Chris@86: local dir="$1" Chris@86: local log=$(logfile_for envtest "$dir") Chris@109: local pdir=$(custom_plugin_dir_for "$dir") Chris@86: local cdir=$(if test -n "$pdir" ; then echo "$pdir" ; else echo "$dir" ; fi) Chris@86: local good=yes Chris@86: local first=yes Chris@44: echo Chris@44: echo "Testing some details of .cat files..." Chris@80: for catfile in "$cdir"/*".cat"; do Chris@44: if [ ! -f "$catfile" ]; then Chris@44: # This should only happen if the glob was not expanded at all Chris@44: echo "ERROR: no .cat file found in $dir" | tee -a "$log" Chris@44: good=no Chris@44: break Chris@44: fi Chris@44: if [ "$first" = "yes" ]; then Chris@44: first=no Chris@44: else Chris@80: echo "NOTE: multiple .cat files found in $cdir" | tee -a "$log" Chris@44: fi Chris@44: done Chris@44: if [ "$good" = "yes" ]; then Chris@46: excess=$(plugin_ids_in "$dir" | sed 's/^/vamp:/' | \ Chris@85: cat - "$cdir"/*".cat" | \ Chris@47: sed 's/::.*//' | \ Chris@47: sort | \ Chris@47: uniq -u) Chris@44: if [ -n "$excess" ]; then Chris@47: echo "ERROR: excess or missing definitions in .cat file? $excess" | tee -a "$log" Chris@44: good=no Chris@44: else Chris@47: echo "GOOD: no excess or missing definitions in .cat files" | tee -a "$log" Chris@44: fi Chris@44: fi Chris@44: [ "$good" = "yes" ] Chris@44: } Chris@44: Chris@44: env_test_ttl() { Chris@86: local dir="$1" Chris@86: local log=$(logfile_for envtest "$dir") Chris@109: local pdir=$(custom_plugin_dir_for "$dir") Chris@86: local rdir=$(if test -n "$pdir" ; then echo "$pdir" ; else echo "$dir" ; fi) Chris@86: local good=yes Chris@86: local first=yes Chris@44: echo Chris@44: echo "Testing existence of RDF files..." Chris@80: for ttlfile in "$rdir"/*.{n3,ttl}; do Chris@44: if [ ! -f "$ttlfile" ]; then Chris@44: # Because we have two different extensions, this isn't an Chris@44: # error as it is with e.g. .cat (because one or the other Chris@44: # of .n3 and .ttl almost certainly won't exist). But if we Chris@44: # drop out the bottom and first is still true, then we Chris@44: # know neither matched. Chris@44: : Chris@44: elif [ "$first" = "yes" ]; then Chris@44: first=no Chris@44: else Chris@80: echo "NOTE: multiple .ttl or .n3 files found in $rdir" | tee -a "$log" Chris@44: fi Chris@44: done Chris@80: if [ "$first" = "yes" ]; then Chris@80: echo "ERROR: no .ttl or .n3 files found in $rdir" | tee -a "$log" Chris@45: good=no; Chris@45: else Chris@45: echo "GOOD: found one or more .ttl or .n3 files (we don't actually test their validity or content here though)" | tee -a "$log" Chris@45: fi Chris@45: [ "$good" = "yes" ] Chris@45: } Chris@45: Chris@45: env_test_accompaniments() { Chris@86: local dir="$1" Chris@86: local log=$(logfile_for envtest "$dir") Chris@86: local good=yes Chris@46: echo Chris@46: echo "Testing existence of README and accompanying files..." Chris@133: if ! ls -1 "$dir" | egrep -qi "^readme(.txt|.md)?$"; then Chris@45: echo "ERROR: no README file found" | tee -a "$log" Chris@45: good=no Chris@45: fi Chris@53: if ! ls -1 "$dir" | egrep -qi "^(copying|licen[cs]e)(.txt)?$"; then Chris@45: echo "ERROR: no COPYING or LICEN[CS]E file found" | tee -a "$log" Chris@45: good=no Chris@45: fi Chris@53: if ! ls -1 "$dir" | egrep -qi "^citation(.txt)?$"; then Chris@45: echo "NOTE: no CITATION file found" | tee -a "$log" Chris@45: fi Chris@44: [ "$good" = "yes" ] Chris@44: } Chris@44: Chris@9: run_environmental_tests() { Chris@86: local dir="$1" Chris@86: local log=$(logfile_for envtest "$dir") Chris@86: local allgood=yes Chris@44: cat /dev/null > "$log" Chris@45: for test in exports stdout cat ttl accompaniments; do Chris@44: "env_test_$test" "$dir" || allgood=no Chris@9: done Chris@44: if [ "$allgood" != "yes" ]; then Chris@19: echo "$dir" >> "$envcheckfailed" Chris@44: return 1 Chris@44: else Chris@44: return 0 Chris@19: fi Chris@9: } Chris@4: Chris@49: package() { Chris@86: local dir="$1" Chris@86: local id=$(vcs_id "$dir") Chris@114: local pstub="$dir-$pubtag-$id" Chris@86: local pdir="$packagedir/$pstub" Chris@49: mkdir -p "$pdir" Chris@49: ( cd "$dir" ; Chris@49: cp -av \ Chris@49: *"$pluginext" \ Chris@49: *.cat \ Chris@49: *.n3 \ Chris@49: *.ttl \ Chris@49: [Rr][Ee][Aa][Dd][Mm][Ee]* \ Chris@49: [Cc][Oo][Pp][Yy][Ii][Nn][Gg]* \ Chris@49: [Ll][Ii][Cc][Ee][Nn][CcSs][Ee]* \ Chris@49: [Cc][Ii][Tt][Aa][Tt][Ii][Oo][Nn]* \ Chris@49: [Cc][Hh][Aa][Nn][Gg][Ee][Ll][Oo][Gg]* \ Chris@105: ../"$pdir"/ || true Chris@86: if have_vampy_plugins "$dir"; then Chris@86: find_vampy_plugins_in "$dir" | while read p; do Chris@86: cp -av "$p" ../"$pdir"/ Chris@86: done Chris@86: fi Chris@49: ) Chris@49: ( cd "$packagedir"; Chris@49: if [ "$platform" = "mingw" ]; then Chris@54: zip -r "$pstub".zip "$pstub" Chris@49: else Chris@53: tar cvjf "$pstub".tar.bz2 "$pstub" Chris@49: fi; Chris@53: rm -rf "$pstub" Chris@49: ) Chris@49: } Chris@49: Chris@22: if ! build_or_rebuild "vamp-plugin-sdk"; then Chris@88: echo "*** Failed to build Vamp plugin SDK!" Chris@5: exit 1 Chris@5: fi Chris@5: Chris@26: # Ensure we can only link statically against these Chris@26: for x in vamp-hostsdk vamp-sdk; do Chris@26: for y in dylib dll so; do Chris@26: rm -f "vamp-plugin-sdk/lib$x.$y" Chris@26: rm -f "vamp-plugin-sdk/$x.$y" Chris@26: done Chris@26: done Chris@26: Chris@22: if ! build_or_rebuild "vamp-plugin-tester"; then Chris@88: echo "*** Failed to build Vamp plugin tester!" Chris@5: exit 1 Chris@5: fi Chris@5: Chris@88: need_vampy=no Chris@88: for dir in $plugindirs ; do Chris@88: if have_vampy_plugins "$dir"; then Chris@88: need_vampy=yes Chris@88: break Chris@88: fi Chris@88: done Chris@88: if [ "$need_vampy" = "yes" ] && [ "$plugindirs" != "vampy" ]; then Chris@88: if ! build_or_rebuild "vampy"; then Chris@88: echo "*** Failed to build VamPy! (needed for other plugins)" Chris@88: exit 1 Chris@88: fi Chris@88: fi Chris@88: Chris@11: for dir in $plugindirs ; do Chris@31: dir=${dir%/*} Chris@4: echo Chris@4: echo "Processing: $dir" Chris@31: if [ ! -d "$dir" ]; then Chris@31: echo "Directory $dir not found!" Chris@31: echo "$dir" >> "$notbuilt" Chris@31: elif build_or_rebuild "$dir"; then Chris@19: if have_plugin "$dir" ; then Chris@19: echo "$dir" >> "$built" Chris@86: if ! run_tester "$dir"; then Chris@86: echo "Tester failed for $dir" Chris@86: fi Chris@86: if ! run_environmental_tests "$dir"; then Chris@86: echo "Environmental tests failed for $dir" Chris@86: fi Chris@19: else Chris@44: log=$(logfile_for build "$dir") Chris@44: echo "Build apparently succeeded, but no resulting plugin(s) found, or plugin(s) have wrong file type or platform" | tee -a "$log" Chris@19: echo "$dir" >> "$notbuilt" Chris@19: fi Chris@4: else Chris@6: echo "$dir" >> "$notbuilt" Chris@4: fi Chris@44: slog=$(logfile_for summary "$dir") Chris@86: echo "initialising logfile $slog for $dir" Chris@44: cat /dev/null > "$slog" Chris@1: done Chris@1: Chris@49: cat "$built" | while read dir; do Chris@49: package "$dir" Chris@49: done Chris@49: Chris@4: echo Chris@49: echo "** Built, tested, checked, and packaged:" Chris@44: cat "$built" | while read dir; do Chris@44: slog=$(logfile_for summary "$dir") Chris@44: if ! grep -q "^$dir\$" "$testfailed"; then Chris@44: if ! grep -q "^$dir\$" "$envcheckfailed"; then Chris@44: echo "$dir" Chris@59: echo "$dir: OK: Success" >> "$slog" Chris@32: fi Chris@6: fi Chris@6: done | sort Chris@4: Chris@4: echo Chris@19: echo "** Failed tests:" Chris@44: cat "$testfailed" | sort | uniq | while read dir; do Chris@44: slog=$(logfile_for summary "$dir") Chris@44: echo "$dir" Chris@59: echo "$dir: TEST_FAILED: Built successfully, but failed tests" >> "$slog" Chris@6: done Chris@5: Chris@5: echo Chris@19: echo "** Failed environmental checks:" Chris@44: cat "$envcheckfailed" | sort | uniq | while read dir; do Chris@44: slog=$(logfile_for summary "$dir") Chris@44: echo "$dir" Chris@59: echo "$dir: ENV_FAILED: Built successfully, but failed environmental checks" >> "$slog" Chris@19: done Chris@19: Chris@19: echo Chris@4: echo "** Failed to build:" Chris@44: cat "$notbuilt" | sort | while read dir; do Chris@44: slog=$(logfile_for summary "$dir") Chris@44: echo "$dir" Chris@59: echo "$dir: BUILD_FAILED: Failed to compile" >> "$slog" Chris@6: done Chris@4: Chris@4: echo