
# tools
#######

CC =        gcc
OCAMLC =    ocamlc.opt
OCAMLOPT =  ocamlopt.opt
OCAMLDEP =  ocamldep
OCAMLDOC =  ocamldoc
OCAMLLEX =  ocamllex
MENHIR =    menhir


# external libs
###############

ZARITHDIR = +zarith
APRONDIR = +apron 
GMPDIR = +gmp


# flags & paths
###############

OCAMLDIR = `$(OCAMLC) -where`
OCAMLFLAGS = -g
OCAMLOPTFLAGS =
OCAMLINC = -I web -I frontend -I utils -I driver -I domains -I $(ZARITHDIR) -I $(APRONDIR) -I $(GMPDIR)
OCAMLLIBS = bigarray.cma gmp.cma apron.cma polkaMPQ.cma octD.cma zarith.cma str.cma unix.cma -cclib "-L$(ZARITHDIR) -L$(APRONDIR) -L$(GMPDIR)"
OCAMLOPTLIBS = bigarray.cmxa gmp.cmxa apron.cmxa polkaMPQ.cmxa octD.cmxa zarith.cmxa str.cmxa unix.cmxa -cclib "-L$(ZARITHDIR) -L$(APRONDIR) -L$(GMPDIR)"
MENHIRFLAGS = --explain
CFLAGS = -I $(OCAMLDIR) -O3 -Wall
CLIBS = -lgmp
DATE = `date +'%Y%m%d'`
VERSION = 1.0

DIST = banal-$(VERSION)

ifeq ($(DEBUG),1)
OCAMLFLAGS := $(OCAMLFLAGS) -g
OCAMLOPTFLAGS := $(OCAMLOPTFLAGS) -g
CFLAGS := $(CFLAGS) -g
endif

WEBCGIINSTALL = $(HOME)/public_html/cgi-bin
WEBSTATICINSTALL = $(HOME)/public_html/banal



# files
#######

TARGETS = banal banal-b wanalyzer.cgi wanalyzer-b.cgi wtest.cgi

AUTOGEN = \
  frontend/lexer.ml \
  frontend/parser.ml \
  frontend/parser.mli \

MLFILES = \
  web/uri.ml \
  web/date.ml \
  web/http.ml \
  web/html.ml \
  utils/mapext.ml \
  utils/int.ml \
  utils/float.ml \
  utils/intinf.ml \
  utils/rat.ml \
  utils/datatypes.ml \
  utils/itv_int.ml \
  utils/itv_rat.ml \
  utils/itv_float.ml \
  utils/mathtypes.ml \
  utils/affine.ml \
  frontend/abstract_syntax.ml \
  frontend/parser.ml \
  frontend/lexer.ml \
  frontend/typed_syntax.ml \
  frontend/semantics.ml \
  frontend/abstract_to_typed_syntax.ml \
  domains/domain.ml \
  domains/linearization.ml \
  domains/apron_domain.ml \
  driver/iterator.ml

MLIFILES = \
  frontend/parser.mli \

CMDMLFILES = driver/main.ml
WEBMLFILES = web/webmain.ml

WEBTESTMLFILES = \
  web/uri.ml \
  web/date.ml \
  web/http.ml \
  web/html.ml \
  web/test.ml


CFILES = \
  utils/ml_float.c \

CMOFILES = $(MLFILES:%.ml=%.cmo)
CMXFILES = $(MLFILES:%.ml=%.cmx)
CMIFILES = $(MLIFILES:%.ml=%.cmi)
OFILES = $(CFILES:%.c=%.o)
CMDCMOFILES = $(CMDMLFILES:%.ml=%.cmo)
CMDCMXFILES = $(CMDMLFILES:%.ml=%.cmx)
WEBCMOFILES = $(WEBMLFILES:%.ml=%.cmo)
WEBCMXFILES = $(WEBMLFILES:%.ml=%.cmx)
WEBTESTCMOFILES = $(WEBTESTMLFILES:%.ml=%.cmo)
WEBTESTCMXFILES = $(WEBTESTMLFILES:%.ml=%.cmx)


# rules
#######

all: $(AUTOGEN) banal wanalyzer.cgi wtest.cgi

banal: $(OFILES) $(CMXFILES) $(CMDCMXFILES)
	$(OCAMLOPT) -o $@ $(OCAMLOPTFLAGS) $(OCAMLINC) -cclib "$(CLIBS)" $(OCAMLOPTLIBS) $+

banal-b: $(OFILES) $(CMOFILES) $(CMDCMOFILES)
	$(OCAMLC) -custom -o $@ $(OCAMLFLAGS) $(OCAMLINC) -cclib "$(CLIBS)" $(OCAMLLIBS) $+

wanalyzer.cgi: $(OFILES) $(CMXFILES) $(WEBCMXFILES)
	$(OCAMLOPT) -o $@ $(OCAMLOPTFLAGS) $(OCAMLINC) -cclib "$(CLIBS)" $(OCAMLOPTLIBS) $+

wanalyzer-b.cgi: $(OFILES) $(CMOFILES) $(WEBCMOFILES)
	$(OCAMLC) -custom -o $@ $(OCAMLFLAGS) $(OCAMLINC) -cclib "$(CLIBS)" $(OCAMLLIBS) $+

wtest.cgi: $(WEBTESTCMXFILES)
	$(OCAMLOPT) -o $@ $(OCAMLOPTFLAGS) $(OCAMLINC) str.cmxa unix.cmxa $+

%.cmo: %.ml %.cmi
	$(OCAMLC) $(OCAMLFLAGS) $(OCAMLINC) -c $*.ml

%.cmx: %.ml %.cmi
	$(OCAMLOPT) $(OCAMLOPTFLAGS) $(OCAMLINC) -c $*.ml

%.cmi: %.mli
	$(OCAMLC) $(OCAMLFLAGS) $(OCAMLINC) -c $*.mli

%.cmo: %.ml
	$(OCAMLC) $(OCAMLFLAGS) $(OCAMLINC)  -c $*.ml

%.cmx: %.ml
	$(OCAMLOPT) $(OCAMLOPTFLAGS) $(OCAMLINC)  -c $*.ml

%.ml: %.mll
	$(OCAMLLEX) $*.mll

%.ml %.mli: %.mly
	$(MENHIR) $(MENHIRFLAGS) $*.mly

install: wanalyzer.cgi wtest.cgi
	mkdir -p $(WEBCGIINSTALL) 
	cp wanalyzer.cgi wtest.cgi $(WEBCGIINSTALL) 
	mkdir -p $(WEBSTATICINSTALL)
	cp static/* README CRAPL-LICENSE.txt $(DIST).tgz $(WEBSTATICINSTALL)

dist:
	rm -f $(DIST).tgz
	tar --transform 's,^,$(DIST)/,' -c -z -f $(DIST).tgz *

clean:
	rm -f depend $(AUTOGEN) $(TARGETS)
	rm -f `find . -name "*.o"`
	rm -f `find . -name "*.a"`
	rm -f `find . -name "*.cm*"`
	rm -f `find . -name "*~"`
	rm -f `find . -name "\#*"`
	rm -f `find . -name "*.conflicts"`
	rm -f *.svg out/*.svg out/*.tex analysis.log
	rm -f *.tgz

MLSOURCES = $(MLFILES) $(MLIFILES) $(CMDMLFILES) $(WEBMLFILES) 
depend: $(MLSOURCES) Makefile
	-$(OCAMLDEP) -native $(OCAMLINC) $(MLSOURCES) > depend

.phony:	all clean

include depend
