#.SILENT:

SHELL=/bin/sh

TIME=/bin/time

CPP=cpp

PRECISION=	DP

SRC=		$$HOME/ucb

SOURCE=		$(SRC)/ucbctest

OUTPUTS=	\
	cpi_$(PRECISION).output \
	cpar_$(PRECISION).output \
	cfindpi_$(PRECISION).output \
	clib_$(PRECISION).output \
	cdiv_$(PRECISION).output \
	cmul_$(PRECISION).output \
	csqr_$(PRECISION).output \
	csin_$(PRECISION).output \
	ccos_$(PRECISION).output \
	catan_$(PRECISION).output \
	cexp_$(PRECISION).output \
	cexpm1_$(PRECISION).output \
	clog1p_$(PRECISION).output \
	clog_$(PRECISION).output

FPCE=		fpce/fpce.o

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

PISOURCES=	$(SOURCE)/pi.c $(UCBTEST)
PARSOURCES=	$(SOURCE)/par.c $(UCBTEST)
DIVSOURCES=	$(SOURCE)/divmain.c $(SRC)/ucbtest/div.c $(UCBTEST)
MULSOURCES=	$(SOURCE)/mulmain.c $(SRC)/ucbtest/mul.c $(UCBTEST)
SQRSOURCES=	$(SOURCE)/sqrmain.c $(SRC)/ucbtest/sqr.c $(UCBTEST)
LIBSOURCES=	$(SOURCE)/libmain.c $(SRC)/ucbtest/lib.c $(UCBTEST)
SCANSOURCES=	$(SRC)/ucbeef/beefscan.c $(UCBTEST)
FINDPISOURCES=	\
	$(SOURCE)/findpimain.c $(SRC)/ucbtest/findpi.c $(UCBTEST) \
	$(SRC)/ucbeef/distd.c  $(SRC)/ucbeef/others.c $(SRC)/ucbeef/randm.c  
BEEFSOURCES=	\
	$(SOURCE)/beefmain.c $(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

LIBCTEST=	libctest.a

CCLDOPTS=	-lm

.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)

cpi_$(PRECISION).out:	$(PISOURCES) $(LIBCTEST)
	$(CC) $(CCOPTS) $(PISOURCES) -D$(PRECISION) $(LIBCTEST) -o $@ -I$(SRC)/ucbtest $(CCLDOPTS)

cpar_$(PRECISION).out:	$(PARSOURCES) $(LIBCTEST)
	$(CC) $(CCOPTS) $(PARSOURCES) -D$(PRECISION) $(LIBCTEST) -o $@ -I$(SRC)/ucbtest $(CCLDOPTS)

cdiv_$(PRECISION).out:	$(DIVSOURCES) $(LIBCTEST)
	$(CC) $(CCOPTS) $(DIVSOURCES) $(LIBCTEST) -D$(PRECISION) -o $@ -I$(SRC)/ucbtest $(CCLDOPTS)

cmul_$(PRECISION).out:	$(MULSOURCES) $(LIBCTEST)
	$(CC) $(CCOPTS) $(MULSOURCES) $(LIBCTEST) -D$(PRECISION) -o $@ -I$(SRC)/ucbtest $(CCLDOPTS)

csqr_$(PRECISION).out:	$(SQRSOURCES) $(LIBCTEST)
	$(CC) $(CCOPTS) $(SQRSOURCES) $(LIBCTEST) -D$(PRECISION) -o $@ -I$(SRC)/ucbtest $(CCLDOPTS)

clib_$(PRECISION).out:	$(LIBSOURCES) $(LIBCTEST)
	$(CC) $(CCOPTS) $(LIBSOURCES) $(LIBCTEST) -D$(PRECISION) -o $@ -I$(SRC)/ucbtest $(CCLDOPTS)

clib_$(PRECISION).output: clib_$(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 ; \
	clib_$(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

cfindpi_$(PRECISION).out:	$(FINDPISOURCES) $(LIBCTEST)
	$(CC) $(CCOPTS) $(FINDPISOURCES) $(LIBCTEST) -D$(PRECISION) -o $@ -I$(SRC)/ucbeef -I$(SRC)/ucbtest $(CCLDOPTS) -DTEST_cos -DTEST_sin

csin_$(PRECISION).out \
ccos_$(PRECISION).out \
catan_$(PRECISION).out \
cexp_$(PRECISION).out \
cexpm1_$(PRECISION).out \
clog1p_$(PRECISION).out \
clog_$(PRECISION).out \
: 	$(BEEFSOURCES) $(LIBCTEST)
	test=`echo $@ | awk -F_ '{print $$1}' | sed 's/^c//g'` ; \
	$(CC) $(CCOPTS) $(BEEFSOURCES) $(LIBCTEST) -D$(PRECISION) -o $@ -I$(SRC)/ucbtest -I$(SRC)/ucbeef $(CCLDOPTS) -DTEST_$$test

ccos_$(PRECISION).output \
catan_$(PRECISION).output \
cexp_$(PRECISION).output \
cexpm1_$(PRECISION).output \
clog1p_$(PRECISION).output \
clog_$(PRECISION).output \
csin_$(PRECISION).output: \
csin_$(PRECISION).out \
ccos_$(PRECISION).out \
catan_$(PRECISION).out \
cexp_$(PRECISION).out \
cexpm1_$(PRECISION).out \
clog1p_$(PRECISION).out \
clog_$(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

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

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

force:
