# flags for fpc, for instance -n or -t
FPFLAGS =
# load time flags for the c compiler, e.g. -lfp, -L/usr/lib
FPRTS = `ldpath` -lfp
# flags for the c compiler, for instance -g or -O
CFLAGS = -O
# which c compiler, fp compiler, make program
C = gcc
F = fpc
M = gmake
# installation information: bin directory, lib directory
BIN = /unc/biagioni/bin/${ARCH}
LIB = /usr/softlab/contrib/lib/${ARCH}
# .c files derived from .fp files and object files
# the .c files are needed because otherwise make doesn't know how
# to go from the .fp file to the .o file
LEXSRCS = fplex.fp mkfp.fp parsel.fp fplfsm.fp fpllex.fp fpldet.fp fplpar.fp parse.fp
LEXOBJS = mkfp.o parsel.o fplfsm.o fpllex.o fpldet.o fplstd.o fplpar.o parse.o
# the files to be removed when making clean
# (in addition to *.c *.o *.gen *.run *.res)
REMFILS = fplex fplpar log core ${LIBS}
# the following options are for profiling; uncomment them, then "make monitor"
#FPRTS = lib.o set.o store.o fpformat.o fp.o
#CFLAGS = -pg
#LIBS = lib.fp set.fp store.fp fpformat.fp

# these are the "default targets" that are made when typing "make"
current: fplex

.SUFFIXES:

.SUFFIXES: .fp .c .o .lex .res .l .gen .run

.fp.o:
	$F ${FPFLAGS} $*.fp
	$C ${CFLAGS} -c $*.c
	rm $*.c

.lex.gen:
	$M fplex
	time fplex $*.lex > $*.gen

.gen.run:
	cp $*.gen $*.gen.fp
	$F -m$* -i ${FPFLAGS} $*.gen.fp
	rm $*.gen.fp
	mv $*.gen.c $*.c
	$M $*.o fplstd.o
	$C ${CFLAGS} -o $*.run fplstd.o $*.o ${FPRTS}
	rm $*.o
	mv $*.c $$TRASH

.run.res:
	time $*.run < $*.tst > $*.res
	head -20 $*.tst $*.res

all: fplex

${BIN}/fplex: ${LEXSRCS}
	$M fplex
	install -s fplex ${BIN}/fplex

${LIB}/libfp.a: fplstd.fp
	$F fplstd.fp
	$C -c fplstd.c
	ar r ${LIB}/libfp.a fplstd.o
	ranlib ${LIB}/libfp.a
	rm fplstd.o fplstd.c

${LIB}/libnfp.a: fplstd.fp
	$F -n fplstd.fp
	$C -O -c fplstd.c
	ar r ${LIB}/libnfp.a fplstd.o
	ranlib ${LIB}/libnfp.a
	rm fplstd.o fplstd.c

install: ${BIN}/fplex ${LIB}/libnfp.a ${LIB}/libfp.a

lexer.res: self.lex
	cp self.lex lexer.lex
	$M lexer.gen
	rm lexer.lex
	diff lexer.gen fpllex.fp > lexer.res
	wc lexer.res

fplex: fplex.o ${LEXOBJS}
	rm -f fplex
	$C ${CFLAGS} -o fplex fplex.o ${LEXOBJS} ${FPRTS}

fplex.o: fplex.fp
	$F -m -i -o -p ${FPFLAGS} fplex.fp
	$C ${CFLAGS} -c fplex.c
	rm fplex.c

clean:
	echo removing *.c *.o *.h *.gen *.run *.res ${REMFILS}
	touch tmp.c tmp.o tmp.h tmp.gen tmp.run tmp.res ${REMFILS}
	rm *.c *.o *.h *.gen *.run *.res ${REMFILS}

monitor:
	cp ../../src/fp.c .
	cp ../../src/*.h .
	cp ../../lib/*.fp .
	cp ../../lib/*.c .
	fpc set.fp
	cat optset.c >> set.c
	$M lib.c fpformat.c store.c
	$M ${FPRTS}
	$M fplex

lexer_boot:
	fpc parsel.boot.fp
	mv parsel.boot.c parsel.c
	echo Def lexer id > fpllex.fp
	$M fplex
	echo 1 | fplex > fpllex.fp
	rm parsel.c parsel.o
	$M fplex

fplpar.fp: fplpar.grm
	school fplpar.grm | sed 's/id/fplerrcheck o lexer/g' > fplpar.fp

fplpar: fplpar.fp parse.o fpllex.o
	fpc -m -i fplpar.fp
	$C ${CFLAGS} -c fplpar.c
	gcc -o fplpar fplpar.o fpllex.o parse.o `ldpath` -lfp
	/bin/rm fplpar.c fplpar.o

mkfp.tst: mkfp.fp
	fpc -tjoinsub -m -o mkfp.fp
	$C ${CFLAGS} -o mkfp mkfp.c `ldpath` -lfp
	rm mkfp.c
