# ocamlc flags
#
#  -c     Compile  only. Suppress the linking phase of the compilation. 
#         Source code files are turned into compiled files, but no executable 
#         file is produced. This option is useful to compile modules 
#         separately.
#
# -g	  Add debugging information while compiling and linking. This option 
#  	  is required in order to be able to debug the program with 
#         ocamldebug, and to produce stack backtraces when the program 
#         terminates on an uncaught exception.


include Makefile.config

BASE_DIR  := $(shell pwd)
OCAML_DIR = /home/accounts/facultystaff/l/lwittie/lib/ocaml-3.11.0-32/caml # for .h files needed by Ocaml-C glue code
OMEGA_DIR = ${BASE_DIR}/presburger/omega
GMP++_DIR = ${BASE_DIR}/presburger/gmp++
STL_DIR   = ${BASE_DIR}/presburger/STLport-4.5.3
CC_FLAGS  = -D${ENDIANNESS} # -DDEBUG
GPP_FLAGS = -Wa,--32 # -fpermissive

all:static
clean:clean_clay
clean_all:clean_clay clean_omega

dynamic: clay_dynamic
static: clay_static

# Clean the Clay compilation
clean_clay:
	rm -f clay *.o *.cmo *.cmi parse.ml parse.mli lex.ml parse.output;
	rm -f ${OMEGA_DIR}/basic/src/Exit.o;
	rm -f ${GMP++_DIR}/gmp++.o;
	rm -f presburger/presburger.o presburger/presburger.cmi;

# Clean the Omega (SAT Solver) compilation
clean_omega:
	rm -f ${OMEGA_DIR}/omega_lib/obj/libomega.a;
	rm -f ${OMEGA_DIR}/omega_lib/obj/libomega.so;
	cd ${OMEGA_DIR}; make clean; cd ${BASE_DIR}; 

cleanwin:
	del clay *.cmo *.cmi parse.ml parse.mli lex.ml parse.output

clayquote.cmo: clayquote.ml
	${OCAMLC} -I +camlp4 -pp "camlp4o q_MLast.cmo" -c clayquote.ml

ast.cmo: ast.ml
	${OCAMLC} -g -c ast.ml

arith.cmo: ast.cmo arith.ml
	${OCAMLC} -g -c arith.ml

code_gen.cmo: ast.cmo codeprinter.cmo code_gen.ml
	${OCAMLC} -g -c code_gen.ml

codeprinter.cmo: ast.cmo codeprinter.ml
	${OCAMLC} -g -c codeprinter.ml

types.cmo: ast.cmo arith.cmo types.ml presburger/presburger.cmi
	${OCAMLC} -g -I ./presburger -c types.ml

typecheck.cmo: ast.cmo arith.cmo types.cmo typecheck.ml presburger/presburger.cmi
	${OCAMLC} -g -c typecheck.ml

parse.cmi: parse.mly ast.cmo
	${OCAMLYACC} parse.mly
	${OCAMLC} -g -c parse.mli

lex.cmo: lex.mll ast.cmo parse.cmi
	${OCAMLLEX} lex.mll
	${OCAMLC} -g -c lex.ml

parse.cmo: lex.cmo parse.cmi arith.cmo
	${OCAMLC} -g -c parse.ml

syntax_gen.cmo: ast.cmo arith.cmo syntax_gen.ml 
	${OCAMLC} -g -c syntax_gen.ml

astiter.cmo: astiter.ml ast.cmo
	${OCAMLC} -g -c astiter.ml

precompiler.cmo: ast.cmo astiter.cmo arith.cmo precompiler.ml
	${OCAMLC} -g -c precompiler.ml

enum.cmo: precompiler.cmo syntax_gen.cmo enum.ml
	${OCAMLC} -g -c enum.ml

modules.cmo: precompiler.cmo clayprinter.cmo parse.cmo modules.ml 
	${OCAMLC} -g -c modules.ml

clayprinter.cmo: clayprinter.ml codeprinter.cmo ast.cmo arith.cmo 
	${OCAMLC} -g -c clayprinter.ml

cppfilebuf.cmo: cppfilebuf.ml 
	${OCAMLC} -g -c cppfilebuf.ml

presburger/presburger.cmi: presburger/presburger.mli ast.cmo arith.cmo
	${OCAMLC} -g -c presburger/presburger.mli

#presburger/presburger.o: presburger/presburger.cc presburger/presburger.cmi 
#	${GPP} -g ${GPP_FLAGS} ${CC_FLAGS} -I ${STL_DIR} -I ${STL_DIR}/stlport -I ${OCAML_DIR} -I ${GMP++_DIR} -I ${OMEGA_DIR}/omega_lib/include -I ${OMEGA_DIR}/basic/include -c presburger/presburger.cc -o presburger/presburger.o

presburger/presburger.o: presburger/presburger.cc presburger/presburger.cmi 
	${GPP} -g ${GPP_FLAGS} ${CC_FLAGS} -I ${OCAML_DIR} -I ${GMP++_DIR} -I ${OMEGA_DIR}/omega_lib/include -I ${OMEGA_DIR}/basic/include -c presburger/presburger.cc -o presburger/presburger.o

${OMEGA_DIR}/basic/src/Exit.o:
	${GPP} -g ${GPP_FLAGS} -I ${OMEGA_DIR}/basic/include -c ${OMEGA_DIR}/basic/src/Exit.c -o${OMEGA_DIR}/basic/src/Exit.o

${GMP++_DIR}/gmp++.o: ${GMP++_DIR}/gmp++.cc ${GMP++_DIR}/gmp++.h
	${GPP} -g ${GPP_FLAGS} -I ${GMP++_DIR} -c ${GMP++_DIR}/gmp++.cc -o ${GMP++_DIR}/gmp++.o

clay.cmo: ast.cmo arith.cmo types.cmo typecheck.cmo codeprinter.cmo code_gen.cmo lex.cmo parse.cmo cppfilebuf.cmo clayprinter.cmo precompiler.cmo enum.cmo modules.cmo presburger/presburger.cmi presburger/presburger.o clay.ml ${GMP++_DIR}/gmp++.o ${OMEGA_DIR}/basic/src/Exit.o
	${OCAMLC} -g -c clay.ml

clay_dynamic: clay.cmo
	cd ${OMEGA_DIR}; make libomega.a; cd ${BASE_DIR}; 
	${OCAMLC} -cc ${GPP} -custom -g -o clay unix.cma str.cma nums.cma ast.cmo arith.cmo codeprinter.cmo code_gen.cmo types.cmo typecheck.cmo lex.cmo parse.cmo cppfilebuf.cmo syntax_gen.cmo astiter.cmo precompiler.cmo clayprinter.cmo modules.cmo enum.cmo clay.cmo ${OMEGA_DIR}/omega_lib/obj/Relation.o ${OMEGA_DIR}/basic/src/Exit.o ${GMP++_DIR}/gmp++.o presburger/presburger.o -cclib -L${OMEGA_DIR}/omega_lib/obj/ -cclib -lomega -cclib -L.${OCAML_DIR} -cclib -lcamlrun -cclib -lgmp -ccopt -Wa,--32

clay_static: clay.cmo
	cd ${OMEGA_DIR}; make libomega.a; cd ${BASE_DIR}; 
	${OCAMLC} -cc ${GPP} -custom -g -o clay unix.cma str.cma nums.cma ast.cmo arith.cmo codeprinter.cmo code_gen.cmo types.cmo typecheck.cmo lex.cmo parse.cmo cppfilebuf.cmo syntax_gen.cmo astiter.cmo precompiler.cmo clayprinter.cmo modules.cmo enum.cmo clay.cmo ${OMEGA_DIR}/omega_lib/obj/Relation.o ${OMEGA_DIR}/basic/src/Exit.o ${GMP++_DIR}/gmp++.o presburger/presburger.o ${OMEGA_DIR}/omega_lib/obj/libomega.a -cclib -L${OCAML_DIR} -cclib -lcamlrun  -cclib -lgmp  -ccopt -Wa,--32;
	chmod a+rx clay


# If things fail, perhaps the stuff in omega_lib/obj needs to be recompiled.
# It does not seem to do so automatically
