#-----------------------------------------------------------------------------
# directories and files

file		:= Rationale
main		:= bplc
bin             := $(HOME)/bin
tmp             := $(HOME)/tmp
#objects		:= Main.o
sources         := $(wildcard *.lhs)

BINDIST         :=  $(shell test -f ./BINDIST && echo 1)

#-----------------------------------------------------------------------------
# commands

-include config.mk

ifndef pv
$(error "Please say ./configure first.")
endif

#ghcflags	:= -Wall -O2
ghcflags	+= -Wall
flags		:= --tt
spell           := ispell -d british -t -l -p

#-----------------------------------------------------------------------------

#postscript : $(file).ps

.SUFFIXES :

ifdef BINDIST

default: all
	@echo "Everything is ready. Just say \"make install\"."

endif

all: bplc

install: all
	mkdir -p $(DESTDIR)$(bindir)
	install -m 755 bplc.sh $(DESTDIR)$(bindir)/bplc
	mkdir -p $(DESTDIR)$(libdir)
	install -m 755 bplc $(DESTDIR)$(libdir)
	install -m 644 System.bpl $(DESTDIR)$(libdir)
	install -m 644 Library/*.bpl $(DESTDIR)$(libdir)

ifdef BINDIST

bplc :

else

bplc : $(sources) Lexer.o Parser.hs
	$(ghc) $(ghcflags) --make -o bplc Driver.lhs

Lexer.o: Lexer.hs AbstractSyntax.hi
	$(ghc) $(ghcflags) -c -fglasgow-exts Lexer.hs

AbstractSyntax.hi: AbstractSyntax.lhs Message.hi
	$(ghc) $(ghcflags) -c AbstractSyntax.lhs

Message.hi: Message.lhs PrettierNG.hi
	$(ghc) $(ghcflags) -c Message.lhs

PrettierNG.hi: PrettierNG.lhs
	$(ghc) $(ghcflags) -c PrettierNG.lhs

endif

#-----------------------------------------------------------------------------
# pattern rules

%.hs : %.x
	alex -g $<

%.tex : %.lhs
	lhs2TeX $(flags) $< > $@

%.ps : %.dvi
#	dvips -P cmps -o $@ $<
	dvips -o $@ $<

%.pdf : %.dvi
	dvipdfm $<

#-----------------------------------------------------------------------------
# rules

.PHONY 	: edit xdvi gv acro print spell spellupdate links clean realclean

Parser.hs : Parser.lg
#	frown --lexer --expected --code=stackless Parser.lg
# Die Optimierung fhrt dazu, dass unterschiedliche Fehlermeldungen generiert werden!
	frown --lexer --expected --code=stackless --optimize Parser.lg
# backtracking parser
#	frown --backtrack --lexer --expected --optimize Parser.lg

edit :
	emacs $(sources) Lexer.x Parser.lg &

$(file).dvi : $(file).tex
	latex $(file)
	if grep -s '^LaTeX Warning: Citation .* undefined' $(file).log; \
	then bibtex $(file); latex $(file); \
	fi
	if grep -s '^LaTeX Warning: Label(s) may have changed' $(file).log; \
	then latex $(file); \
	fi

xdvi : $(file).dvi
	xdvi -s 6 $(file).dvi &

gv : $(file).ps
	gv -spartan $(file).ps &

acro : $(file).pdf
	acroread $(file).pdf &

print	: $(file).ps
	lpr $(file).ps

spell: $(file).tex
	egrep -v '$\%' $(file).tex | $(spell) $(file).spell | sort | uniq

spellupdate: $(file).tex
	egrep -v '$\%' $(file).tex | $(spell)  $(file).spell | sort | uniq > $(file).spell

links:
	ln -s $(HOME)/local/abbr.bib
	ln -s $(HOME)/local/rh.bib
#	ln -s $(HOME)/local/lhs2TeX.fmt
#	ln -s $(HOME)/local/lhs2TeX.sty
	ln -s $(HOME)/local/FuncMP.mp

clean	:
	rm -f *.o *.hi *.s Parser.hs[0-9]*
	rm -f *~ *% *.aux *.bbl *.blg *.log *.toc *.out
	rm -f main $(file).tex Main.tex $(file).[0-9]* *.mpx

realclean : clean
	rm -f bplc
	rm -f *.dvi *.ps *.pdf
	rm -f abbr.bib rh.bib lhs2TeX.fmt lhs2TeX.sty FuncMP.mp

srcdist :
	mkdir $(pv)
	echo $(version) > $(pv)/VERSION
	cp *.nsh *.nsi *.bat $(pv)
	cp *.lhs *.hs *.x *.lg $(pv)
	cp *.in *.ac $(pv)
	cp INSTALL Makefile configure aclocal.m4 install-sh $(pv)
	cp *.bpl $(pv)
	cp -r Examples $(pv)
	cp -r Tests $(pv)
	cp -r Library $(pv)
	[ -n "$(pv)" ] && find ./$(pv) -wholename '*/.svn' | xargs rm -rf
	[ -n "$(pv)" ] && find ./$(pv) -name '*~' | xargs rm
	tar cvjf $(pv)-source.tar.bz2 $(pv)

bindist: all
	mkdir $(pv)
	echo $(version) > $(pv)/VERSION
	touch $(pv)/BINDIST
	cp bplc $(pv)
	strip $(pv)/bplc
	cp *.in $(pv)
	cp INSTALL Makefile configure install-sh $(pv)
	cp *.bpl $(pv)
	cp -r Examples $(pv)
	cp -r Tests $(pv)
	cp -r Library $(pv)
	[ -n "$(pv)" ] && find ./$(pv) -wholename '*/.svn' | xargs rm -rf
	tar cvjf $(pv)-linux.tar.bz2 $(pv)

test: all
	cd Tests/OK && BPL_LIBDIR="$(PWD)" BPLC="$(PWD)/bplc" ../runtests.sh
