# (C) 1999-2004                                                
# Cuihtlauac Alvarado, France Telecon, Recherche & Developement
# Jean-Franois Monin, Universit Joseph Fourier - VERIMAG     

# $Id: Makefile,v 1.27 2007-08-10 10:21:26 tews Exp $ 

all: targets

include Makefile.here
include Makefile.config

TAGS_MLI=line_number.mli splay.mli
EMACS_MLI=emacs.mli
VI_MLI=vi.mli
OTAGS_ML=otags.ml
TAGS_ML=splay.ml line_number.ml editor.ml pr.ml
EMACS_ML=emacs.ml pr_emacs_tags.ml 
VI_ML=vi.ml pr_vi_tags.ml
MLI_SRC=${TAGS_MLI} ${EMACS_MLI} ${VI_MLI}
ML_SRC=${OTAGS_ML} ${TAGS_ML} ${EMACS_ML} ${VI_ML}
SRC=${MLI_SRC} ${ML_SRC}
OBJ=otags
LIBS=tags.cma pr_emacs_tags.cma pr_vi_tags.cma
TESTFILES=test.ml testmli.mli


targets: $(LIBS) $(OBJ) $(NCAMLP4)

-include Makefile.depend

#tags.cma: libotags(${IMPLEM:.ml=.o})
#	ranlib $+

tags.cma(%.cmo): %cmo

tags.cma: ${TAGS_ML:%.ml=%.cmo}
	$(CAMLC) -a -o $@ ${ZLIBS} $+

tags.cmxa: ${TAGS_ML:%.ml=%.cmx}
	$(CAMLOPT) -a -o $@ ${ZLIBS} $+

pr_emacs_tags.cma: ${EMACS_ML:%.ml=%.cmo}
	$(CAMLC) -a -o $@ ${ZLIBS} $+

pr_vi_tags.cma: ${VI_ML:%.ml=%.cmo}
	$(CAMLC) -a -o $@ ${ZLIBS} $+

pr_emacs_tags.cmxa: ${EMACS_ML:%.ml=%.cmx}
	$(CAMLOPT) -a -o $@ ${ZLIBS} $+

pr_vi_tags.cmxa: ${VI_ML:%.ml=%.cmx}
	$(CAMLOPT) -a -o $@ ${ZLIBS} $+

otags.opt: conf.cmx otags.cmx
	$(CAMLOPT) unix.cmxa -o $@ $+

otags.byte: conf.cmo otags.cmo
	$(CAMLC) unix.cma -o $@ $+

# Natively Compiled Parsers
#
# The default version use pa_o_fast.cmx as grammar, which is 
# not extensible and only installed from 3.09.3
#
# The *ext version use pa_o.cmx and pa_op.cmx, which are still
# extensible. 
# (The extensibility is a bit theoretical, because the cmx versions 
# cannot load any modules on runtime -- in contrast to camlp4.)

# since 3.09.3 we don't need any source tree
camlp4o_pr_emacs: \
		tags.cmxa pr_emacs_tags.cmxa 
	${CAMLOPT} -linkall -o $@ -I ${CAMLP4DIR} odyl.cmxa camlp4.cmxa \
		pa_o_fast.cmx $+ \
		odyl.cmx

camlp4o_pr_vi: \
		tags.cmxa pr_vi_tags.cmxa 
	${CAMLOPT} -linkall -o $@ -I ${CAMLP4DIR} odyl.cmxa camlp4.cmxa \
		pa_o_fast.cmx $+ \
		odyl.cmx

camlp4o_pr_emacs_ext: tags.cmxa pr_emacs_tags.cmxa 
	${CAMLOPT} -linkall -o $@ -I ${CAMLP4DIR} odyl.cmxa camlp4.cmxa \
		pa_o.cmx pa_op.cmx $+ \
		odyl.cmx

camlp4o_pr_vi_ext: tags.cmxa pr_vi_tags.cmxa 
	${CAMLOPT} -linkall -o $@ -I ${CAMLP4DIR} odyl.cmxa camlp4.cmxa \
		pa_o.cmx pa_op.cmx $+ \
		odyl.cmx

.PHONY: tags check checkext

tags::
	./otags -v ${ZLIBS} $(SRC)

check: all
	for f in $(TESTFILES) ; do \
		./mk_test $$f || exit 1; \
	done

checkext: check
	./mk_test -r $$HOME/src/ccsl/Ccslc
	./mk_test -r /usr/local/src/lablgtk-2.6.0

generation:
	for f in test/*new ; do \
		cp $$f $$(dirname $$f)/$$(basename $$f .new);\
	done


clean::
	rm -f *~
	rm -f *.cm[iaox] *.o *.cmxa *.a *.ppo 
	rm -f *.orig *.old *.new *.bak core.*
	rm -f *.*.ps *.*.dvi *.*.log *.*.tex *.*.aux
	rm -f TAGS *.tags *.dep *.tmp
	rm -f *.cmxa *.a
	rm -f $(OBJ)
	rm -f camlp4o_pr* otags.{cmo,cmx,o,opt,byte}
	rm -f *.tar*

install: $(LIBS) $(OBJ)
	mkdir -p $(BINDIR) $(INSTALLLIBDIR)
	install -m 644 $(LIBS) $(INSTALLLIBDIR)
	install -m 755 $(OBJ) $(BINDIR)
	if [ $(NATIVE) = "true" ] ; then \
		install -m 755 $(NCAMLP4) $(BINDIR); \
	fi

uninstall:
	cd $(INSTALLLIBDIR); rm -f $(LIBS)
	cd $(BINDIR); rm -f $(OBJ)
	cd $(BINDIR); rm -r $(NCAMLP4)

depend: ${MLI_SRC:.mli=.dep} ${ML_SRC:.ml=.dep} otags.dep
	cat *.dep > Makefile.depend
	echo "pr_emacs_tags.cmo: emacs.cmo" >> Makefile.depend
	echo "pr_emacs_tags.cmx: emacs.cmx" >> Makefile.depend
	echo "pr_vi_tags.cmo: vi.cmo" >> Makefile.depend
	echo "pr_vi_tags.cmx: vi.cmx" >> Makefile.depend
	rm -f *.dep
