#!/bin/bash

## Things to test:
##   the plugin builds!
##   plugin loads
##   passes vamp-plugin-tester tests
##   does not export any unnecessary symbols
##   has valid .cat and .n3

platform=linux
bits=64

configure() {
    dir="$1"
    if [ -f "$dir/configure" ] ; then
	( cd "$dir" ; ./configure )
    fi
}

configure_maybe() {
    dir="$1"
    if [ ! -f "$dir/Makefile" ] ; then
	configure "$dir"
    fi
}

find_makefile() {
    dir="$1"
    for f in Makefile Makefile.$platform Makefile.$platform$bits build/$platform/Makefile build/$platform/Makefile.$platform build/$platform/Makefile.$platform$bits; do
	if [ -f "$dir/$f" ]; then
	    echo $f
	    break
	fi
    done
}

build() {
    dir="$1"
    if configure_maybe "$dir"; then
	mfile=$(find_makefile "$dir")
	if [ -n "$mfile" ]; then
	    make -C "$dir" -f "$mfile"
	else
	    echo "Failed to find a Makefile in $dir"
	    return 1
	fi
    fi
}

rebuild() {
    dir="$1"
    if configure "$dir"; then
	mfile=$(find_makefile "$dir")
	if [ -n "$mfile" ]; then
	    make -C "$dir" -f "$mfile" clean
	    make -C "$dir" -f "$mfile"
	else
	    echo "Failed to find a Makefile in $dir"
	    return 1
	fi
    fi
}

run_tester() {
    ##!!! todo: list the plugins in each library and run the tester
    ##!!! separately on each -- that way we can report on specific
    ##!!! plugins rather than whole libraries (though for the
    ##!!! "printout" report we should include the whole library test,
    ##!!! just for information's sake?) and we can have separate
    ##!!! nondeterministic statuses
    dir="$1"
    extra=""
    if grep -q "^$dir\$" nondeterministic.txt; then
	extra="-n"
    fi
    if VAMP_PATH="$dir" vamp-plugin-tester/vamp-plugin-tester "$extra" -a ; then
	echo "OK"
    else
	echo
	echo "Tester failed: running again with valgrind and verbose for a report..."
	VAMP_PATH="$dir" valgrind vamp-plugin-tester/vamp-plugin-tester -v "$extra" -a
    fi
}

successes="/tmp/successes.$$.txt"
partials="/tmp/successes.$$.txt"
failures="/tmp/failures.$$.txt"
trap 'rm -f "$successes" "$partials" "$failures"' 0

if ! build "vamp-plugin-sdk"; then 
    echo "Failed to build Vamp plugin SDK!"
    exit 1
fi

if ! build "vamp-plugin-tester"; then 
    echo "Failed to build Vamp plugin tester!"
    exit 1
fi

for dir in $(cat .hgsub | grep -v vamp-plugin-sdk | grep -v vamp-plugin-tester | awk '{ print $1; }') ; do
    echo
    echo "Processing: $dir"
    if build "$dir"; then
	if run_tester "$dir"; then
	    echo "$dir" >> "$successes"
	else
	    echo "$dir" >> "$partials"
	fi
    else
	echo "$dir" >> "$failures"
    fi
done

echo
echo "** Successfully built and tested:"
cat "$successes"

echo
echo "** Built, but failed tests:"
cat "$partials"

echo
echo "** Failed to build:"	    
cat "$failures"

echo
