# ********************************************* #
#               Basic Macros                    #
# ********************************************* #

OCAMLC=ocamlc.opt 
OCAMLOPT=ocamlopt.opt 
OCAMLDEP=ocamldep.opt
OCAMLDOC=ocamldoc.opt
OCAMLMKTOP=ocamlmktop 

#BASELIBS=unix.cma -cclib -lunix str.cma
#BASELIBSX=unix.cmxa -cclib -lunix str.cmxa

BASELIBS=str.cma
BASELIBSX=str.cmxa

BASELIBSP4=$(BASELIBS) gramlib.cma
BASELIBSXP4=$(BASELIBSX) gramlib.cmxa

DIR=`basename $(PWD)`
FILENAME=$(DIR).`date +%d-%m-%Y.%k\h%M | tr -d " "`
DOCDIR=doc.`date +%d-%m-%Y.%k\h%M | tr -d " "`
MANDIR=man.`date +%d-%m-%Y.%k\h%M | tr -d " "`
TAROUTPUT=$(FILENAME).tgz
TMPFILE=/tmp/makerunnig

# Elements implemented in this folder
NAMES={global,tool,testExpr,pa_synopsis,pa_actuals,compiler,synopsis}

SOURCES=$(NAMES).ml
MODULES=$(NAMES).cmo
MODULEX=$(NAMES).cmx
SIGNATURES=$(NAMES).mli

INCLUDES=-I /usr/local/godi/lib/ocaml/pkg-lib/ -I /usr/local/godi/lib/ocaml/std-lib/
INCLUDESP4=$(INCLUDES) -I +camlp4 -pp 'camlp4o pa_extend.cmo'

BACKUPDIR=/tmp


###############################
#    Editing, cleaning etc    #
###############################

edit: 
	emacs $(SOURCES) Makefile &

clean_cmo:
	@rm -f $(MODULES) 

clean_cmx:
	@rm -f $(MODULEX)

clean: clean_cmo clean_cmx
	@rm -f *~ *.cmo *.cmx *.o *.cmi *.bak *.top $(NAMES) 

backup: clean
	FILENAME=$(TAROUTPUT); \
	tar -C .. -cvzf "$$FILENAME" --exclude "$(DIR)*.tgz" $(DIR)/ ; \
	mv "$$FILENAME" $(BACKUPDIR)  ;\
	echo "Entire directory backup ===> "$(BACKUPDIR)"/$$FILENAME" 



###############################
#           Modules           #
###############################

# Certainement à cause du code Camlp4, ocamldep ne comprend pas cette dépendance
# que j'ajoute donc à la main
testExpr.cmo: testExpr.cmi
testExpr.cmx: testExpr.cmi


modules: 
	make $(MODULES) 
modulex: 
	make $(MODULEX)

synopsis: modulex
	$(OCAMLOPT) $(INCLUDESP4) $(BASELIBSXP4) $(MODULEX) -o synopsis executable.ml && strip synopsis

match: synopsis
	rm -f match ; ln synopsis match

example0: modulex
	$(OCAMLOPT) $(INCLUDESP4) $(BASELIBSXP4) $(MODULEX) -o example example.ml && strip example

example: lib
	$(OCAMLOPT) -I +camlp4 gramlib.cmxa str.cmxa synopsis.cmxa -o examples/example examples/example.ml && \
	strip examples/example

lib: modulex
	$(OCAMLOPT) -a $(MODULEX) -o synopsis.cmxa


all: synopsis match


###############################
#        Doc, todo            #
###############################

rmdoc:  
	rm -f doc; rm -rf doc.*.*

clean_doc:  
	rm doc; mkdir $(DOCDIR) 2>/dev/null; ln -sf $(DOCDIR) doc 

doc: clean_doc
	$(OCAMLDOC) -html -colorize-code -d $(DOCDIR) $(INCLUDESP4) $(SOURCES)

todo:
	@echo "(5) option -m pour construire et imprimer le manuel en fonction de la synopsis" ;\
	echo  "(6) splittare se necessario gli attuali: -xvzf => -x -v -z -f " ;\
	echo  "(7) errcode = numero della direttiva causa dell'errore" ;\
	echo  "(8) permettere : usage 'o*(3-5)ARGS:f/sqdsq'" ;\
	echo -en

# ************************************** #
#           Generic rules                #
# ************************************** #

depend: 
	$(OCAMLDEP) $(INCLUDESP4) $(NAMES).mli $(NAMES).ml > .depend


.SUFFIXES: .ml .mli .cmo .cmi .cmx .top

.ml.cmo:
	$(OCAMLC) $(INCLUDESP4) -c -impl $<

.mli.cmi:
	$(OCAMLC) $(INCLUDESP4) -c -intf $<

.ml.cmx:
	$(OCAMLOPT) $(INCLUDESP4) -c -impl $<

.cmo.top:
	$(OCAMLMKTOP) $(INCLUDESP4) -custom $(BASELIBSP4) $< -o `basename $< .cmo`.top 


include .depend


