##########################################################################
#                                                                        #
#                             Alt-Ergo Zero                              #
#                                                                        #
#                  Sylvain Conchon and Alain Mebsout                     #
#                  Universite Paris-Sud 11                               #
#                                                                        #
#  Copyright 2011. This file is distributed under the terms of the       #
#  Apache Software License version 2.0                                   #
#                                                                        #
##########################################################################

QUIET=""

# where to install the binaries
DESTDIR=
prefix=/usr/local
exec_prefix=${prefix}
BINDIR=$(DESTDIR)${exec_prefix}/bin
LIBDIR=$(DESTDIR)${exec_prefix}/lib/alt-ergo-zero

# where to install the man page
MANDIR=$(DESTDIR)${prefix}/share/man

# other variables set by ./configure
OCAMLC   = ocamlc.opt
OCAMLOPT = ocamlopt.opt
OCAMLDEP = ocamldep
OCAMLLEX = ocamllex
OCAMLYACC= ocamlyacc
OCAMLLIB = /usr/local/lib/ocaml
OCAMLBEST= opt
OCAMLVERSION = 4.01.0
OCAMLWIN32 = no
EXE = 
LIBEXT = .a
OBJEXT = .o

INCLUDES = -I common/ -I smt/

BFLAGS = -dtypes -g $(INCLUDES) -annot
OFLAGS = -dtypes $(INCLUDES) -annot -for-pack Aez

BIBBYTE=nums.cma unix.cma

BIBOPT=$(BIBBYTE:.cma=.cmxa)

# main target
#############

NAME = aez

CMA  = aez.cma
CMXA = aez.cmxa

all: $(OCAMLBEST)
byte: $(CMA) 
opt: $(CMA) $(CMXA)  

# bytecode and native-code compilation
######################################

SMTCMO = smt/exception.cmo smt/symbols.cmo \
	 smt/ty.cmo smt/term.cmo smt/literal.cmo \
         smt/solver_types.cmo smt/explanation.cmo \
         smt/polynome.cmo smt/uf.cmo smt/use.cmo \
	 smt/intervals.cmo smt/fm.cmo smt/arith.cmo smt/sum.cmo \
         smt/combine.cmo smt/cc.cmo smt/solver.cmo smt/smt.cmo

COMMONCMO = common/timer.cmo common/hashcons.cmo common/hstring.cmo\
	    common/vec.cmo common/heap.cmo common/iheap.cmo

CMO = $(COMMONCMO) $(SMTCMO)

CMX = $(CMO:.cmo=.cmx)

$(CMA): aez.cmo
	$(OCAMLC) -a $(BFLAGS) -o $@ $^

$(CMXA): aez.cmx
	$(OCAMLOPT) -a $(OFLAGS) $(INCLUDES) -o $@ $^

aez.cmo: smt/smt.cmi
aez.cmo: $(CMO)
	$(OCAMLC) $(BFLAGS) -pack -o $@ $(CMO)

aez.cmx: smt/smt.cmi
aez.cmx: $(CMX)
	$(OCAMLOPT) $(INCLUDES) -pack -o $@ $(CMX)



# generic rules
###############

.SUFFIXES: .mli .ml .cmi .cmo .cmx .mll .mly

.mli.cmi:
	@true compile -w a $(BFLAGS) $< 
	$(if $(QUIET),@echo 'Compiling $@' &&) $(OCAMLC) -c $(BFLAGS) $<

.ml.cmo:
	$(if $(QUIET),@echo 'Compiling $@' &&) $(OCAMLC) -c $(BFLAGS) $<
	@true compile -w a $(BFLAGS) $< 

.ml.o:
	@true compile -w a $(BFLAGS) $< 
	$(if $(QUIET),@echo 'Compiling $@' &&) $(OCAMLOPT) -c $(OFLAGS) $<

.ml.cmx:
	$(if $(QUIET),@echo 'Compiling $@' &&) $(OCAMLOPT) -c $(OFLAGS) $<
	@true compile -w a $(BFLAGS) $< 

.mll.ml:
	$(if $(QUIET),@echo 'Compiling $<' &&) $(OCAMLLEX) $< > /dev/null

.mly.ml:
	$(if $(QUIET),@echo 'Compiling $<' &&) $(OCAMLYACC) -v $< 

.mly.mli:
	$(if $(QUIET),@echo 'Compiling $<' &&) $(OCAMLYACC) -v $< 

# Emacs tags
############

tags:
	find . -name "*.ml*" | sort -r | xargs \
	etags "--regex=/let[ \t]+\([^ \t]+\)/\1/" \
	      "--regex=/let[ \t]+rec[ \t]+\([^ \t]+\)/\1/" \
	      "--regex=/and[ \t]+\([^ \t]+\)/\1/" \
	      "--regex=/type[ \t]+\([^ \t]+\)/\1/" \
              "--regex=/exception[ \t]+\([^ \t]+\)/\1/" \
	      "--regex=/val[ \t]+\([^ \t]+\)/\1/" \
	      "--regex=/module[ \t]+\([^ \t]+\)/\1/"

# installation
##############

INSTALL_LIBDIR=$(DESTDIR)$(OCAMLLIB)/alt-ergo-zero

install: install-$(OCAMLBEST)

install-byte: 
	mkdir -p $(INSTALL_LIBDIR)
	cp -f aez.cm[iot] $(CMA) $(INSTALL_LIBDIR)

install-opt: 
	mkdir -p $(INSTALL_LIBDIR)
	cp -f aez.cm[iot] $(CMA) $(INSTALL_LIBDIR)
	cp -f aez$(LIBEXT) aez.cmx $(CMXA) $(INSTALL_LIBDIR)

ocamlfind-install:
	ocamlfind install aez META $(BUILD)aez.cmi $(BCMA) $(BCMXA) $(BUILD)aez.a

ocamlfind-remove:
	ocamlfind remove aez

doc: smt/smt.mli
	mkdir -p $(doc)
	ocamldoc -html -d doc/ -I smt -I common smt/smt.mli
#######

clean:: 
	@rm -f *.cm[itox] *.cmti *.o *~ *.annot
	@rm -f common/*.cm[itox] common/*.cmti common/*.o common/*~ common/*.annot
	@rm -f smt/*.cm[itox] smt/*.cmti  smt/*.o smt/*~ smt/*.annot
	@rm -f $(GENERATED) *.output
	@rm -f $(NAME).byte $(NAME).opt

# depend
########

.depend depend:: $(GENERATED)
	@rm -f .depend
	@$(OCAMLDEP) -slash -I common/ common/*.ml common/*.mli > .depend
	@$(OCAMLDEP) -I common/ -I smt/ smt/*.ml smt/*.mli >> .depend
	@$(OCAMLDEP) -I common/ -I smt/ -slash *.ml *.mli >> .depend


include .depend
