: library test harness : files= inc= lib= opt= src= unset= verbose= while : do case $1 in --proc*=*) opt="$opt -DN_PROC=${1#*=}" ;; --thread*=*) opt="$opt -DN_THREAD=${1#*=}" ;; --timeout*=*) opt="$opt -DTIMEOUT=${1#*=}" ;; --v*|-v) opt="$opt -DINFO" exec 9>&2 shift verbose=1 ;; *) break ;; esac shift done case $# in [01]) echo "Usage: testlib [-v] library unit [cc-options] [*.h] [*.c]" >&2 exit 2 ;; esac case $verbose in '') exec 9>/dev/null ;; esac library=$1 unit=$2 shift 2 while : do case $1 in *.c) files="$files $1" ;; */*.h) inc="$inc -I${1%/*}" case $1 in */*test.h) src=${1%/*} ;; esac ;; *.h) inc="$inc -I." ;; -l*) lib="$lib $1" case $1 in -lpthread) unset='LD_PRELOAD= _RLD_LIST=' ;; esac ;; -*|*,*) opt="$opt $1" ;; *) base=${1##*/} case $base in cc.*|*.cc) break ;; *.*) lib="$lib $1" ;; *) break ;; esac ;; esac shift done if test -d $unit then source=$unit else case $src in "") src=${1%/*} ;; esac source=$src fi case $inc in "") case $source in ?*) inc=-I$source ;; esac ;; esac case $lib in "") lib=-l$library ;; esac case $files in "") eval files='"' $source/*.c '"' ;; *) list=$files files= for i in $list do case $i in */*) ;; *) i=$source/$i ;; esac files="$files $i" done ;; esac case $# in 0) set cc ;; esac case $verbose in '') trap 'rm -f t.exe t-*.exe xxx yyy zzz; exit 0' 0 1 2 13 15 ;; esac tests=0 errors=0 locked=0 echo "TEST $unit" >&2 prev="make test" for file in $files do (( tests = tests + 1 )) test=${file%.c} test=${test##*/} printf "%-15s " $test >&2 test -f t.exe && { rm -f t.exe || { (( locked = locked + 1 )) mv t.exe t-$locked.exe || { echo previous $prev t.exe locked >&2 break 2 } } } prev=$file "$@" $opt $inc -o t.exe $file $lib >&9 2>&1 code=$? rm -f ${test}.[oO]* case $code in 0) if eval $unset ./t.exe then echo passed >&2 continue fi ;; *) echo compile FAILED >&2 ;; esac (( errors = errors + 1 )) done msg="TEST $unit, $tests test" case $tests in 1) ;; *) msg=${msg}s ;; esac msg="$msg, $errors error" case $errors in 1) ;; *) msg=${msg}s ;; esac echo "$msg" >&2