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

# OFLAGS=-w A # warn about everything
OFLAGS=-w -A # silence everything


LIBS = str.cma
RAPID_OBJS = datatypes.cmo ast_printer.cmo parser.cmo scanner.cmo sast_helper.cmo sast_printer.cmo translate.cmo semantic_check.cmo \
		generate.cmo rapid.cmo
PARSER_OBJS = datatypes.cmo ast_printer.cmo parser.cmo scanner.cmo test_parser.cmo
SAST_OBJS = datatypes.cmo ast_printer.cmo parser.cmo scanner.cmo sast_helper.cmo sast_printer.cmo translate.cmo semantic_check.cmo \
		test_sast.cmo

default: test

all: clean parser sast rapid

rapid: $(RAPID_OBJS)
	$(OCAMLC) $(LIBS) -o rapid $(RAPID_OBJS)

parser: $(PARSER_OBJS)
	$(OCAMLC) $(LIBS) -o parser $(PARSER_OBJS)

sast: $(SAST_OBJS)
	$(OCAMLC) $(LIBS) -o sast $(SAST_OBJS)

test: all
	./parser_tests.sh
	./sast_tests.sh
	./compiler_tests.sh

scanner.ml: scanner.mll
	$(OCAMLLEX) scanner.mll

parser.ml parser.mli: parser.mly
	$(OCAMLYACC) parser.mly

tar: $(TARFILES)
	cd .. && tar czf rapid.tar.gz `git ls-files compiler`

.PHONY: clean parser test all
clean:
	rm -f rapid microc parser sast parser.ml parser.mli scanner.ml \
		*.cmo *.cmi *.out *.diff

%.cmo: %.ml
	$(OCAMLC) $(OFLAGS) -c $<

%.cmi: %.mli
	$(OCAMLC) $(OFLAGS) -c $<

# Generated by ocamldep *.mli *.ml
ast.cmi : datatypes.cmo
parser.cmi : ast.cmi
sast.cmi : datatypes.cmo ast.cmi
ast_printer.cmo : datatypes.cmo ast.cmi
ast_printer.cmx : datatypes.cmx ast.cmi
datatypes.cmo :
datatypes.cmx :
generate.cmo : sast_printer.cmo sast.cmi datatypes.cmo ast_printer.cmo
generate.cmx : sast_printer.cmx sast.cmi datatypes.cmx ast_printer.cmx
parser.cmo : datatypes.cmo ast.cmi parser.cmi
parser.cmx : datatypes.cmx ast.cmi parser.cmi
rapid.cmo : semantic_check.cmo scanner.cmo sast_printer.cmo parser.cmi \
    generate.cmo ast_printer.cmo
rapid.cmx : semantic_check.cmx scanner.cmx sast_printer.cmx parser.cmx \
    generate.cmx ast_printer.cmx
sast_helper.cmo : sast.cmi datatypes.cmo ast.cmi
sast_helper.cmx : sast.cmi datatypes.cmx ast.cmi
sast_printer.cmo : sast.cmi datatypes.cmo ast_printer.cmo
sast_printer.cmx : sast.cmi datatypes.cmx ast_printer.cmx
scanner.cmo : parser.cmi
scanner.cmx : parser.cmx
semantic_check.cmo : translate.cmo sast_printer.cmo sast_helper.cmo sast.cmi \
    datatypes.cmo ast_printer.cmo ast.cmi
semantic_check.cmx : translate.cmx sast_printer.cmx sast_helper.cmx sast.cmi \
    datatypes.cmx ast_printer.cmx ast.cmi
test_parser.cmo : scanner.cmo parser.cmi ast_printer.cmo
test_parser.cmx : scanner.cmx parser.cmx ast_printer.cmx
test_sast.cmo : semantic_check.cmo scanner.cmo sast_printer.cmo parser.cmi \
    ast_printer.cmo
test_sast.cmx : semantic_check.cmx scanner.cmx sast_printer.cmx parser.cmx \
    ast_printer.cmx
translate.cmo : sast_printer.cmo sast_helper.cmo sast.cmi datatypes.cmo \
    ast_printer.cmo ast.cmi
translate.cmx : sast_printer.cmx sast_helper.cmx sast.cmi datatypes.cmx \
    ast_printer.cmx ast.cmi
