CSLC = ocamlc
CSLOPT = ocamlopt
CSLDEP = ocamldep
CSLLEX = ocamllex
CSLYACC = ocamlyacc
CSLFLAGS = -g
CSLOPTFLAGS =

LEX_FILES = $(wildcard *.mll)
YACC_FILES = $(wildcard *.mly)
TMP_MLFILES = $(YACC_FILES:%.mly=%.ml) $(LEX_FILES:%.mll=%.ml)
TMP_MLIFILES = $(YACC_FILES:%.mly=%.mli)

ALL_PROGS = icfp
MAIN = main.cmo

PROG_OBJS_WITH_CMI = flags.cmo parser.cmo tree2meaning.cmo print.cmo simpledoc2tree.cmo best_combinatorial.cmo $(MAIN)
PROG_OBJS = common.cmo $(LEX_FILES:%.mll=%.cmo) $(PROG_OBJS_WITH_CMI)
CMA_FILES = str.cma unix.cma

PROG_OBJX_WITH_CMI = $(PROG_OBJS_WITH_CMI:%.cmo=%.cmx)
PROG_OBJX = $(PROG_OBJS:%.cmo=%.cmx)
CMXA_FILES = $(CMA_FILES:%.cma=%.cmxa)

.PHONY: depend tags clean

default: $(ALL_PROGS)

icfp: .depend TAGS $(PROG_OBJS)
	$(CSLC) -custom $(CSLFLAGS) $(LIBDIRS) -o $@ $(CMA_FILES) $(PROG_OBJS)

icfp_native: .depend TAGS $(PROG_OBJX)
	$(CSLOPT) $(CSLOPTFLAGS) $(LIBDIRS) -o $@ $(CMXA_FILES) $(PROG_OBJX)

# Common rules
.SUFFIXES: .ml .mli .cmo .cmi .cmx .mll .mly

%.ml: %.mll types.cmi parser.cmi
	$(CSLLEX) $<

%.mli %.ml: %.mly
	$(CSLYACC) $<

$(PROG_OBJS_WITH_CMI): %.cmo: %.cmi

$(PROG_OBJX_WITH_CMI): %.cmx: %.cmi

%.cmo: %.ml lexer.cmo
	$(CSLC) $(CSLFLAGS) -c $<

%.cmx: %.ml lexer.cmx
	$(CSLOPT) $(CSLOPTFLAGS) -c $<

%.cmi: %.mli
	$(CSLC) $(CSLFLAGS) -c $<

.ml.mli:
	 $(CSLC) $(CSLFLAGS) -c -i $< > $@

clean:
	rm -f $(ALL_PROGS) *~ *.o *.cm[iox] $(TMP_MLIFILES) $(TMP_MLFILES) .depend TAGS gmon.out ocamlprof.dump

tags: 
	ocamltags *.ml
TAGS:
	ocamltags *.ml

# Dependencies
depend: .depend
.depend:
	$(CSLDEP) $(INCLUDES) *.mli *.mll *.ml > .depend

# missing dependencies:
simpledoc2tree.cmo: common.cmo
print.cmi: types.cmi

-include .depend
