OCAMLC = ocamlc
OCAMLOPT = ocamlopt
OCAMLDEP = ocamldep
OCAMLLEX = ocamllex
OCAMLYACC = ocamlyacc

INCLUDES = 
OCAMLFLAGS = -g $(INCLUDES)
OCAMLOPTFLAGS = $(INCLUDES)

PROG = imp
OBJS = ast.cmo lexer.cmo imp.cmo interpretation.cmo parser.cmo pprint.cmo main.cmo
GEN = imp.ml imp.mli lexer.ml

$(PROG): $(OBJS)
	$(OCAMLC) -o $(PROG) $(OCAMLFLAGS) $(OBJS)

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

.ml.cmo:
	$(OCAMLC) $(OCAMLFLAGS) -c $<

.mli.cmi:
	$(OCAMLC) $(OCAMLFLAGS) -c $<

.ml.cmx:
	$(OCAMLOPT) $(OCAMLOPTLAGS) -c $<

lexer.ml: lexer.mll
	$(OCAMLLEX) $<

imp.ml imp.mli: imp.mly
	$(OCAMLYACC) $<

clean:
	-rm -f $(PROG) *.cm[iox] $(GEN)

imp.cmi: ast.cmi 
lexer.cmi: imp.cmi 
imp.cmo: ast.cmi lexer.cmi imp.cmi 
imp.cmx: ast.cmx lexer.cmx imp.cmi 
lexer.cmo: imp.cmi lexer.cmi 
lexer.cmx: imp.cmx lexer.cmi 
interpretation.cmi: ast.cmi 
parser.cmi: ast.cmi 
pprint.cmi: ast.cmi 
ast.cmo: ast.cmi 
ast.cmx: ast.cmi 
interpretation.cmo: ast.cmi interpretation.cmi 
interpretation.cmx: ast.cmx interpretation.cmi 
main.cmo: ast.cmi interpretation.cmi parser.cmi pprint.cmi main.cmi 
main.cmx: ast.cmx interpretation.cmx parser.cmx pprint.cmx main.cmi 
parser.cmo: lexer.cmi parser.cmi 
parser.cmx: lexer.cmi parser.cmi 
pprint.cmo: ast.cmi pprint.cmi 
pprint.cmx: ast.cmx pprint.cmi 
