MAIN = /usr/local
BIN = ${MAIN}/bin
LIB = ${MAIN}/lib
BINS = ${BIN}/fpc
LIBS = ${LIB}/libfp.a ${LIB}/libdfp.a ${LIB}/libnfp.a
SRC = fpg.l fpg.y fp.c fp.h stdfp.h fpc.c fpc.h parse.c parse.h code.c \
	code.h expr.c mkffp.c mkprol.c makefile prims.fp
CFLAGS = 

all: fpc fp.o debugfp.o nocheckfp.o lint
	cd lib; make ; cd ..

clean:
	rm -f *.o y.tab.c lex.yy.c fpc mkffp lint

.SUFFIXES:

.SUFFIXES: .fp

${BIN}/fpc: fpc
	rm -f ${BIN}/fpc
	cp fpc ${BIN}/fpc

${LIB}/libfp.a: fp.o
	ar r ${LIB}/libfp.a fp.o
	ranlib ${LIB}/libfp.a

${LIB}/libdfp.a: debugfp.o
	ar r ${LIB}/libdfp.a debugfp.o
	ranlib ${LIB}/libdfp.a

${LIB}/libnfp.a: nocheckfp.o
	ar r ${LIB}/libnfp.a nocheckfp.o
	ranlib ${LIB}/libnfp.a

${BIN}/mkffp: mkffp
	rm -f ${BIN}/mkffp
	cp mkffp ${BIN}/mkffp

${BIN}/mkprol: mkprol
	rm -f ${BIN}/mkprol
	cp mkprol ${BIN}/mkprol

fpc.o: fpc.c
	cc ${CFLAGS} -c fpc.c

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

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

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

fpc: y.tab.o fpc.o parse.o code.o expr.o
	rm -f fpc
	cc ${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 "long assignment may lose accuracy" | \
		grep -v "exit value declared inconsistently" > lint
	lint -abchux fp.c | grep -v yy | grep -v "^str" | \
		grep -v "^_flsbuf" | \
		grep -v "long assignment may lose accuracy" | \
		grep -v "illegal structure pointer combination" | \
		grep -v "exit value declared inconsistently" >> lint

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

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

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

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

lex.yy.c: fpg.l
	lex -v fpg.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
	cc ${CFLAGS} -c -O 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
	cc ${CFLAGS} -c -O y.tab.c

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

fp.c: fp.c.part1 fp.c.part2
	cat fp.c.part1 fp.c.part2 > fp.c

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

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

nocheckfp.o: fp.c fp.h
	cp fp.c nocheckfp.c
	cc ${CFLAGS} -c -O -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

release: all ${BINS} ${LIBS}
	cd lib ; make release ; cd ..
	echo release done

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