# standard defs
#MAIN = /usr
#LIBD = ${MAIN}/lib
#BIND = ${MAIN}/bin
#BAKD = /tmp		# backup directory --- for backup use only
# actual defs
# if mk is aliased to make ARCH=xxxxx (or gmake ARCH=xxxx) so that the
# value of HW_OS is set automatically when using mk
MAIN = /usr/esb/cache
LIBD = ${MAIN}/lib
BIND = ${MAIN}/bin
LIBS = ${LIBD}/libfp.a ${LIBD}/libdfp.a ${LIBD}/libnfp.a
BAKD = ~/tmp
BINS = ${BIND}/fpc
SRC = fpl.l fpg.y fp.c fp.h stdfp.h patchlevel.h fpc.c fpc.h parse.c parse.h \
	code.c code.h expr.c mkffp.c mkprol.c makefile prims.fp
CFLAGS = -O
C = cc

all: fpc fp.o debugfp.o nocheckfp.o prims lint

clean:
	touch tmp.o tmp.ln nocheckfp.x debugfp.x
	rm -f *.o *.ln y.tab.c lex.yy.c fpc mkffp lint prims.c prims nocheckfp.* debugfp.*

.SUFFIXES:

.SUFFIXES: .fp

instbin: ${BIND}/fpc

${BIND}/fpc: fpc ${BIND}
	rm -f ${BIND}/fpc
	install -f ${BIND} -u esb -g fox -S fpc

${LIBD}/libfp.a: fp.o ${LIBD}
	/bin/ar r ${LIBD}/libfp.a fp.o
	/usr/bin/ranlib ${LIBD}/libfp.a

${LIBD}/libdfp.a: debugfp.o ${LIBD}
	/bin/ar r ${LIBD}/libdfp.a debugfp.o
	/usr/bin/ranlib ${LIBD}/libdfp.a

${LIBD}/libnfp.a: nocheckfp.o ${LIBD}
	/bin/ar r ${LIBD}/libnfp.a nocheckfp.o
	/usr/bin/ranlib ${LIBD}/libnfp.a

${BIND}/mkffp: mkffp ${BIND}
	rm -f ${BIND}/mkffp
	install -s -c mkffp ${BIND}/mkffp

${BIND}/mkprol: mkprol ${BIND}
	rm -f ${BIND}/mkprol
	install -s -c mkprol ${BIND}/mkprol

fpc.o: fpc.c patchlevel.h
	$C ${CFLAGS} -c fpc.c

parse.o: parse.c
	$C ${CFLAGS} -c parse.c

code.o: code.c
	$C ${CFLAGS} -c code.c

expr.o: expr.c
	$C ${CFLAGS} -c expr.c

fpc: y.tab.o fpc.o parse.o code.o expr.o
	rm -f fpc
	$C ${CFLAGS} -o fpc y.tab.o parse.o code.o expr.o fpc.o -ll

lint: y.tab.c lex.yy.c fpc.c parse.c code.c expr.c fp.c
	lint -achx y.tab.c fpc.c parse.c code.c expr.c | grep -v yy | \
		grep -v "^str" | grep -v "^_flsbuf" | grep -v "printf" | \
		grep -v "long assignment may lose accuracy" | \
		grep -v "exit value declared inconsistently" > lint
	lint -abchux fp.c | grep -v yy | grep -v "^str" | \
		grep -v "printf" | grep -v "^_flsbuf" | \
		grep -v "long assignment may lose accuracy" | \
		grep -v "illegal structure pointer combination" | \
		grep -v "can't take" | \
		grep -v "exit value declared inconsistently" >> lint

mkprol.o: mkprol.c
	$C ${CFLAGS} -c mkprol.c

mkffp.o: mkffp.c
	$C ${CFLAGS} -c mkffp.c

mkffp: y.tab.o fpc.o parse.o mkffp.o
	$C ${CFLAGS} -o mkffp y.tab.o parse.o mkffp.o fpc.o -ll

mkprol: y.tab.o fpc.o parse.o mkprol.o
	$C ${CFLAGS} -o mkprol y.tab.o parse.o mkprol.o fpc.o -ll

lex.yy.c: fpl.l
	lex -v fpl.l
	sed "s/fprintf/(void) fprintf/" lex.yy.c | \
		sed "s/putc/(void) putc/" > /tmp/lex.yy.c
	mv /tmp/lex.yy.c lex.yy.c

xlator.o: xlator.c
	$C ${CFLAGS} -c xlator.c

y.tab.c: fpg.y
	yacc fpg.y
	@echo "should have given 1 shift/reduce conflict (bu fn o ...)"

y.tab.o: y.tab.c lex.yy.c
	$C ${CFLAGS} -c y.tab.c

parse.c: parse.h fpc.h
	touch parse.c

fp.o: fp.c fp.h stdfp.h
	$C ${CFLAGS} -c fp.c

debugfp.o: fp.c fp.h
	cp fp.c debugfp.c
	$C ${CFLAGS} -c -DDEBUG debugfp.c
	rm -f debugfp.c

nocheckfp.o: fp.c fp.h
	cp fp.c nocheckfp.c
	$C ${CFLAGS} -c -DNOCHECK nocheckfp.c
	rm -f nocheckfp.c

code.c: parse.h code.h fpc.h fp.h stdfp.h
	touch code.c

expr.c: parse.h code.h fp.h stdfp.h
	touch expr.c

fpc.c: fpc.h
	touch fpc.c

install: ${BINS} ${LIBS} prims

backups: ${BAKD}
	cp -t ${SRC} ${BAKD}

primslist: fp.c
	grep "^fp_data" fp.c | grep "(data)" | sed "s/^fp_data //" | \
		sed "s/ (data)//" | sort > primslist

prims: prims.fp fpc fp.o
	./fpc -m prims.fp
	$C -o prims prims.c ./fp.o
	echo 1 | ./prims | tail -1
