# Makefile for tactics/programs

include ../../config

TACCMO=misc_utils.cmo effects.cmo renamings.cmo progTypes.cmo \
       progAst.cmo prog_errors.cmo prog_env.cmo prog_utils.cmo \
       prog_db.cmo prog_cci.cmo monad.cmo tradEnv.cmo \
       prog_red.cmo prog_typing.cmo prog_wp.cmo mlise.cmo prog_tactic.cmo \
       pprog.cmo

EXTCMO=prog_extract.cmo

ALLCMO=$(TACCMO) $(EXTCMO)

TACVO=Arrays.vo Exchange.vo Permut.vo Sorted.vo Arrays_stuff.vo \
      Tuples.vo ProgInt.vo ProgBool.vo ProgWf.vo Programs.vo \
      ProgramsExtraction.vo

ALLFILES=$(ALLCMO) $(ALLCMO:.cmo=.cmi) $(TACVO)

ZDEP=$(COQTOP)/bin/$(ARCH)/coqdep -c

LIBS=-I ../../theories/ZARITH -I ../contrib/omega -I ../contrib/polynom

ZLIBS=-I ../../src/lib/util -I ../../src/meta \
      -I ../../src/constr -I ../../src/typing -I ../../src/proofs \
      -I ../../src/env -I ../../src/tactics -I ../../src/parsing \
      -I .. -I ../tcc -I ../contrib/extraction -I ../../theories/ZARITH \
      -I ../contrib/polynom

ZDEBUG=
ZFLAGS= $(ZLIBS) -I $(CAMLP4LIB) $(ZDEBUG)
OPTFLAGS=$(TIMEPROF)

COQ=../../bin/$(ARCH)/coqtop -q -bindir ../../bin/$(ARCH) -libdir ../.. $(LIBS)
COQC=../../bin/$(ARCH)/coqc -q -bindir ../../bin/$(ARCH) -libdir ../.. $(LIBS)

byte: $(ALLCMO) $(TACVO) programs.coq
opt: sourceopt
sourceopt: $(ALLCMO:.cmo=.cmx)

module:
	$(MAKE) OPT=-full $(TACVO)

install-library:
	$(INSTALL) -d $(ALLFILES) programs.coq $(COQLIB)/tactics/programs
	-(cd EXAMPLES; $(MAKE) install-library)

programs.coq: $(ALLCMO) $(TACVO)
	$(COQ) $(OPT:opt=full) -batch -load-vernac-source MakeProgramsState.v -outputstate programs.coq

COQMKTOP=$(COQTOP)/bin/$(ARCH)/coqmktop -srcdir ../..

debug: coq-debug-programs.out

coq-debug-programs.out: $(TACCMO)
	(cd ../tcc; $(MAKE) byte)
	$(COQMKTOP) -o coq-debug-programs.out -g $(ZLIBS) tcc.cmo g_zsyntax.cmo $(TACCMO)

debug2: coq-debug-prog_ext.out

coq-debug-prog_ext.out: $(ALLCMO)
	$(COQMKTOP) -o coq-debug-prog_ext.out -g $(ZLIBS) tcc.cmo g_zsyntax.cmo $(TACCMO) \
	ml_import.cmo mlterm.cmo fw_env.cmo fwtoml.cmo \
        genpp.cmo optimise.cmo caml.cmo haskell.cmo ocaml.cmo \
	$(EXTCMO)

# bench ##################################################

bench:
	cd EXAMPLES; $(MAKE) clean; $(MAKE) all

# clean, depend and generic rules ########################

clean:
	rm -f *~ *.cm* *.o *.v? *.pp[oi] programs.coq *.out
	cd EXAMPLES; $(MAKE) clean

archclean:
	rm -f *~ *.cmx *.o *.v? *.pp[oi] *.out
	cd EXAMPLES; $(MAKE) archclean

.SUFFIXES: .mli .ml .cmo .ml4 .cmi .cmx .v .vo

.mli.cmi:
	$(CAMLC) $(ZFLAGS) $<

.ml.cmo:
	$(CAMLC) $(ZFLAGS) $<

.ml.cmx:
	$(CAMLOPTC) $(ZFLAGS) $(OPTFLAGS) $<

.ml4.cmo:
	$(P4)  -o $*.ppo $< 
	$(CAMLC)  $(ZFLAGS) -impl $*.ppo
	rm $*.ppo

.ml4.cmx:
	$(P4)  -o $*.ppo $< 
	$(CAMLOPTC) $(ZFLAGS) $(OPTFLAGS) -impl $*.ppo
	rm $*.ppo

.v.vo:
	$(COQC) $(OPT) -I ../../states $*

depend:
	$(ZDEP) $(LIBS) $(ZLIBS) *.v *.ml* > .depend
	$(P4DEP) *.ml* >> .depend
	cd EXAMPLES; $(MAKE) depend

include .depend








