SERIOUS=true # Comment to remove.

INCLUDE=-I lib -I .
INCLUDECOQ=$(INCLUDE) -R . Self -R lib ITP10 # Hoping it is the right way to do it.
OCAMLOPT=ocamlopt $(INCLUDE)
OCAMLC=ocamlc -w a $(INCLUDE)
OCAMLMKTOP=ocamlmktop $(INCLUDE)
OCAMLDEP=ocamldep $(INCLUDE)
COQC=coqc $(OPT) $(INCLUDECOQ)
COQDOC=coqdoc 
COQDEP=coqdep $(INCLUDECOQ)
ifndef SERIOUS
OPTION= -quick
VO=vio
else
OPTION=
VO=vo
endif
LIBCOQSOURCES=\
	lattice_def.v CompleteLattice.v \
	z_extra_props.v wf_prop.v add_option.v Word.v ProdWiden.v wf_prop.v solve.v lat_prop.v sign.v \
	#interval.v FuncSignature.v FuncFunctors.v Library.v
MAINCOQSOURCES=\
	Semantics.v \
	NormalizeTest.v \
	# Collect.v AbstractionsSignatures.v AbEnvNotRelational.v AbSemantics.v Main.v
COQSOURCES=$(addprefix lib/,$(LIBCOQSOURCES)) $(MAINCOQSOURCES)
CAMLSOURCES_ML=#extracted.ml print.ml parser.ml lexer.ml main.ml
CAMLSOURCES_MLI=#extracted.mli parser.mli

all :
	make depend
	make coq
	make depend
	#make analyser
	#make test

coq : $(COQSOURCES:.v=.${VO})

caml: coq $(CAMLSOURCES_MLI:.mli=.cmi) $(CAMLSOURCES_ML:.ml=.cmo)

analyser: caml
	ocamlc -o analyser $(CAMLSOURCES_ML:.ml=.cmo)

test: analyser
	./analyser tests/p1.c
	./analyser tests/p2.c
	./analyser tests/p10.c


parser.ml parser.mli: parser.mly
	ocamlyacc -v $<
lexer.ml: lexer.mll
	ocamllex $<

depend: $(COQSOURCES)
	$(COQDEP) $(COQSOURCES) > .depend
	$(OCAMLDEP) $(CAMLSOURCES_MLI) $(CAMLSOURCES_ML) >> .depend
	@echo "extracted.cmi: coq extracted.mli" >> .depend 
	@echo "parser.cmi: parser.mli extracted.cmi" >> .depend 
	@echo "parser.cmo: extracted.cmi parser.ml parser.cmi" >> .depend 
	@echo "parser.cmx: extracted.cmx parser.cmi" >> .depend 
	@echo "lexer.cmo: parser.cmi" >> .depend 
	@echo "lexer.cmx: parser.cmx" >> .depend

coqdoc: depend
	make clean
	make "OPT=-dump-glob dump"
	coqdoc -d www/src/ --glob-from dump --no-index -g -html *.v

dot: 
	$(COQDEP) $(COQSOURCES) | dep2dot > depend.dot

tar: depend
	rm -fr certified_while
	mkdir certified_while; mkdir certified_while/lib
	cp $(MAINCOQSOURCES) extracted.ml extracted.mli print.ml main.ml parser.mly lexer.mll Makefile .depend certified_while/
	cd lib; cp $(LIBCOQSOURCES) ../certified_while/lib/
	cp -r tests certified_while/tests
	tar -czf www/certified_while.tgz certified_while/

.SUFFIXES: .ml .mli .cmo .cmi .cmx .v .${VO}

.v.${VO}:
	$(COQC) $(OPTION) $<
.ml.cmo:
	$(OCAMLC) -c $<
.mli.cmi:
	$(OCAMLC) -c $<
.ml.cmx:
	$(OCAMLOPT) -c $<

clean : cleancaml
	cd lib; \rm -f *.vo *.vio *~ *.cmo *.cmi *.glob 
	rm -f *.vo *.vio *~ 

cleancaml:
	\rm -f *.cmo *.cmi parser.ml lexer.ml *.glob parser.output 
	\rm -f parser.{ml,mli}

-include .depend



