#.SILENT:

SHELL=/bin/sh

TIME=/bin/time

CPP=cpp

PRECISION=	DP

SRC=		$$HOME/ucb

SOURCE=		$(SRC)/ucbftest

OUTPUTS=	\
	fpi_$(PRECISION).output \
	fpar_$(PRECISION).output \
	ffindpi_$(PRECISION).output \
	flib_$(PRECISION).output \
	fdiv_$(PRECISION).output \
	fmul_$(PRECISION).output \
	fsqr_$(PRECISION).output \
	fsin_$(PRECISION).output \
	fcos_$(PRECISION).output \
	fatan_$(PRECISION).output \
	fexp_$(PRECISION).output \
	fexpm1_$(PRECISION).output \
	flog1p_$(PRECISION).output \
	flog_$(PRECISION).output

FPCE=		fpce/fpce.o

UCBTEST=	$(SRC)/ucbtest/init.c $(SRC)/ucbtest/ieee.c $(FPCE)
UCBEXIT=	$(SRC)/ucbtest/ucbexit.c

FPISOURCES=	$(SOURCE)/pi.F $(SRC)/ucbtest/init.F
FPARSOURCES=	$(SOURCE)/par.F $(SRC)/ucbtest/init.F
DIVSOURCES=	$(SRC)/ucbtest/div.c $(UCBTEST)
MULSOURCES=	$(SRC)/ucbtest/mul.c $(UCBTEST)
SQRSOURCES=	$(SRC)/ucbtest/sqr.c $(UCBTEST)
LIBSOURCES=	$(SRC)/ucbtest/lib.c $(UCBTEST)
SCANSOURCES=    $(SRC)/ucbeef/beefscan.c $(UCBTEST)
FINDPISOURCES=  $(SRC)/ucbtest/findpi.c $(UCBTEST) \
                $(SRC)/ucbeef/distd.c  $(SRC)/ucbeef/others.c $(SRC)/ucbeef/randm.c
BEEFSOURCES=    $(SRC)/ucbtest/beef.c $(UCBTEST) \
                $(SRC)/ucbeef/anlyzr.c $(SRC)/ucbeef/distd.c \
                $(SRC)/ucbeef/others.c $(SRC)/ucbeef/randm.c  $(SRC)/ucbeef/report.c \
                $(SRC)/ucbeef/er_atn.c $(SRC)/ucbeef/er_dfl.c $(SRC)/ucbeef/er_em1.c \
                $(SRC)/ucbeef/er_l1p.c $(SRC)/ucbeef/er_log.c $(SRC)/ucbeef/er_sin.c

LIBFTEST=	libftest.a

F77LDOPTS=	

.PRECIOUS:	$(OUTPUTS)

.SUFFIXES:	.out .output

.out.output:
	if $(TIME) $< > $@.tmp 2>&1 ; then : ; else \
	        if grep UCBFAIL $@.tmp ; then : ; else \
	        echo UCBFAIL $@ >> $@.tmp ; \
	        fi ; \
	fi
	mv $@.tmp $@
	@echo
	@echo tail $@ :
	@echo
	@tail -20 $@
	@echo

all:	dirs $(OUTPUTS)

dirs:	force
	if test -d `dirname $(FPCE)` ; then : ; else mkdir -p `dirname $(FPCE)` ; fi

$(FPCE):	$(SRC)/ucbtest/fpce.S
	$(CPP) -P $(CPPOPTS) $(SRC)/ucbtest/fpce.S > fpce.s
	$(CC) $(CCOPTS) -c fpce.s
	mv fpce.o $(FPCE)

fpi_$(PRECISION).out:	$(FPISOURCES) $(UCBEXIT) $(LIBFTEST)
	$(CC) -c $(CCOPTS) $(UCBEXIT) -D$(PRECISION) -I$(SRC)/ucbtest
	cat $(FPISOURCES) | $(CPP) -P -D$(PRECISION) $(CPPOPTS) -I$(SOURCE) > pi.f
	$(F77) $(F77OPTS) pi.f ucbexit.o $(LIBFTEST) -o $@ $(F77LDOPTS)
	rm -f pi.f

fpar_$(PRECISION).out:	$(FPARSOURCES) $(UCBEXIT) $(LIBFTEST)
	$(CC) -c $(CCOPTS) $(UCBEXIT) -D$(PRECISION) -I$(SRC)/ucbtest
	cat $(FPARSOURCES) | $(CPP) -P -D$(PRECISION) $(CPPOPTS) -I$(SOURCE) > par.f
	$(F77) $(F77OPTS) par.f ucbexit.o $(LIBFTEST) -o $@ $(F77LDOPTS)
	rm -f par.f

fmul_$(PRECISION).out:	$(SOURCE)/mulmain.F $(MULSOURCES) $(LIBFTEST)
	rm -f *.o
	$(CC) -c $(CCOPTS) $(MULSOURCES) -D$(PRECISION) -I$(SRC)/ucbtest
	cat $(SOURCE)/mulmain.F | $(CPP) -P -D$(PRECISION) $(CPPOPTS) -I$(SOURCE) > mulmain.f
	$(F77) $(F77OPTS) mulmain.f $(FPCE) *.o $(LIBFTEST) -o $@ $(F77LDOPTS)
	rm -f mulmain.f

fdiv_$(PRECISION).out:	$(SOURCE)/divmain.F $(DIVSOURCES) $(LIBFTEST)
	rm -f *.o
	$(CC) -c $(CCOPTS) $(DIVSOURCES) -D$(PRECISION) -I$(SRC)/ucbtest
	cat $(SOURCE)/divmain.F | $(CPP) -P -D$(PRECISION) $(CPPOPTS) -I$(SOURCE) > divmain.f
	$(F77) $(F77OPTS) divmain.f $(FPCE) *.o $(LIBFTEST) -o $@ $(F77LDOPTS)
	rm -f divmain.f
 
fsqr_$(PRECISION).out:	$(SOURCE)/sqrmain.F $(SQRSOURCES) $(LIBFTEST)
	rm -f *.o
	$(CC) -c $(CCOPTS) $(SQRSOURCES) -D$(PRECISION) -I$(SRC)/ucbtest
	cat $(SOURCE)/sqrmain.F | $(CPP) -P -D$(PRECISION) $(CPPOPTS) -I$(SOURCE) > sqrmain.f
	$(F77) $(F77OPTS) sqrmain.f $(FPCE) *.o $(LIBFTEST) -o $@ $(F77LDOPTS)
	rm -f sqrmain.f

flib_$(PRECISION).out:	$(SOURCE)/libmain.F $(LIBSOURCES) $(LIBFTEST)
	rm -f *.o
	$(CC) -c $(CCOPTS) $(LIBSOURCES) -D$(PRECISION) -I$(SRC)/ucbtest
	cat $(SOURCE)/libmain.F | $(CPP) -P -D$(PRECISION) $(CPPOPTS) -I$(SOURCE) > libmain.f
	$(F77) $(F77OPTS) libmain.f $(FPCE) *.o $(LIBFTEST) -o $@ $(F77LDOPTS)
	rm -f libmain.f

flib_$(PRECISION).output: flib_$(PRECISION).out 
	rm -f $@.tmp
	-case $(PRECISION) in \
	SP)     suffix=s.input ;; \
	DP)     suffix=d.input ;; \
	QP)     suffix=q.input ;; \
	esac ; \
	for f in $(SRC)/ucblib/*$${suffix} ; do \
	echo $$f ; \
	flib_$(PRECISION).out < $$f >> $@.tmp 2>&1 & \
	bgproc=$$! ; sleep 10 ; kill $$bgproc 2>/dev/null ; \
	done ; \
	started=`ls $(SRC)/ucblib/*$${suffix} 2>/dev/null | wc -w` ; \
	finished=`grep Total $@.tmp | wc -l` ; \
	if grep UCBFAIL $@.tmp 1>/dev/null 2>&1 || test $$finished -ne $$started ; then \
	echo UCBFAIL $@ , $$finished out of $$started tests completed >> $@.tmp ; \
	else echo UCBPASS $@ >> $@.tmp ; fi
	mv $@.tmp $@
	@echo
	@echo Totals $@ :
	@echo
	-@grep Total $@
	@echo

beefscan.out:		$(SCANSOURCES)
	$(CC) $(CCOPTS) $(SCANSOURCES) -o $@ $(CCLDOPTS) -I$(SRC)/ucbtest

ffindpi_$(PRECISION).out:	$(SOURCE)/findpimain.F $(FINDPISOURCES) $(LIBFTEST)
	rm -f *.o
	$(CC) -c $(CCOPTS) $(FINDPISOURCES) $(LIBFTEST) -D$(PRECISION) -I$(SRC)/ucbeef -I$(SRC)/ucbtest -DTEST_sin -DTEST_cos
	cat $(SOURCE)/findpimain.F | $(CPP) -P -D$(PRECISION) $(CPPOPTS) -I$(SOURCE) > findpimain.f
	$(F77) $(F77OPTS) findpimain.f $(FPCE) *.o $(LIBFTEST) -o $@ $(F77LDOPTS)
	rm -f findpimain.f

fsin_$(PRECISION).out \
fcos_$(PRECISION).out \
fatan_$(PRECISION).out \
fexp_$(PRECISION).out \
fexpm1_$(PRECISION).out \
flog1p_$(PRECISION).out \
flog_$(PRECISION).out \
: \
	$(SOURCE)/beefmain.F $(BEEFSOURCES) $(LIBFTEST)
	rm -f *.o
	test=`echo $@ | awk -F_ '{print $$1}' | sed 's/^f//g'` ; \
	$(CC) -c $(CCOPTS) $(BEEFSOURCES) $(LIBFTEST) -D$(PRECISION) -I$(SRC)/ucbtest -I$(SRC)/ucbeef -DTEST_$$test
	cat $(SOURCE)/beefmain.F | $(CPP) -P -D$(PRECISION) $(CPPOPTS) -I$(SOURCE) > beefmain.f
	$(F77) $(F77OPTS) beefmain.f $(FPCE) *.o $(LIBFTEST) -o $@ $(F77LDOPTS)
	rm -f beefmain.f

fsin_$(PRECISION).output \
fcos_$(PRECISION).output \
fatan_$(PRECISION).output \
fexp_$(PRECISION).output \
fexpm1_$(PRECISION).output \
flog1p_$(PRECISION).output \
flog_$(PRECISION).output \
: \
fsin_$(PRECISION).out \
fcos_$(PRECISION).out \
fatan_$(PRECISION).out \
fexp_$(PRECISION).out \
fexpm1_$(PRECISION).out \
flog1p_$(PRECISION).out \
flog_$(PRECISION).out \
beefscan.out
	if $(TIME) $*.out > $@.tmp 2> $@.err ; then \
	        cat $@.tmp | beefscan.out | cat - $@.err > $@ ; \
	else \
	        echo UCBFAIL $@.tmp $$? | cat $@.tmp $@.err - > $@ ; \
	fi
	rm $@.tmp $@.err
	@echo
	@echo $@ :
	@echo
	@cat $@
	@echo

$(LIBFTEST): force
	make -f $(SRC)/libftest/Makefile SRC="$(SRC)" \
	F77OPTS="$(F77OPTS)" CPP="$(CPP)" CPPOPTS="$(CPPOPTS)"

clean:
	rm -f *.o *.out *.tmp *.f core $(FPCE)
	make -f $(SRC)/libftest/Makefile SRC=$(SRC) clean

force:
