HOME = /cs/musser/public.html/gsd

GC_DIR		= $(HOME)/gc6.6
#BOOST_ROOT	= $(HOME)/boost_1_33_1
BOOST_ROOT	= /software/boost-1.32.0-0/pkg
SWIG_DIR        = $(HOME)/swig-1.3.29

# MLC		= ocamlc
# MLC_OUT	= cmo
# ML_LIB		= cma
# MLC_FLAGS	= -g
MLC		= ocamlopt 
MLC_OUT		= cmx
ML_LIB		= cmxa
MLC_FLAGS	= 

LEX		= ocamllex
YACC		= ocamlyacc

LEXSOURCES	= lexer.mll
YACCSOURCES	= parser.mly
MLHEADERS	= parser.mli 
LSOURCES	= $(LEXSOURCES:.mll=.ml)
YSOURCES	= $(YACCSOURCES:.mly=.ml)
MLSOURCES	= list_set.ml support.ml \
		union_find.ml \
		prim.ml \
		cpp_ast.ml \
		g_ast.ml  \
		 $(YSOURCES) $(LSOURCES) g2str.ml \
		parser_misc.ml \
		lower_fun.ml \
		cpp2str.ml \
		congruence_closure.ml \
		type_check.ml \
		g.ml


#lower_poly.ml \
#		lower_lambda.ml fwd_decl.ml topo_sort.ml lower_misc.ml  g.ml
MLOBJECTS	= $(MLSOURCES:.ml=.$(MLC_OUT)) 
MLHDROBJ	= $(MLHEADERS:.mli=.cmi)

STL_TESTS = \
	test/advance0.g \
	test/distance0.g \
	test/for_each.g \
	test/find.g \
	test/find_if.g \
	test/adjacent_find.g \
	test/count.g \
	test/find_subsequence.g \
	test/find_last_subsequence.g \
	test/find_last_subsequence1.g \
	test/find_n_consecutive.g \
	test/mismatch.g \
	test/copy.g \
	test/swap_ranges.g \
	test/reverse.g \
	test/rotate.g \
	test/inplace_merge.g \
	\
	test/slist0.g \
	test/vector0.g\
	test/vector1.g


TESTS	= test/add.g \
	test/mult.g  \
	test/ops.g \
	test/var.g \
	test/var1.g \
	test/var2.g \
	test/var3.g \
	test/var4.g \
	test/pass_by_value.g \
	test/destructor.g \
	\
	test/destructor1.g \
	test/class0.g \
	test/poly_class2.g \
	test/poly_fun.g \
	test/poly_fun2.g \
	test/poly_fun3.g \
	test/poly_fun4.g \
	test/lambda.g \
	test/struct0.g \
	test/struct1.g \
	test/struct2.g \
	\
	test/struct.g \
	test/fun.g \
	test/fun2.g \
	test/funptr.g \
	test/hi_fun.g \
	test/hi_fun2.g \
	test/poly_hi_fun.g \
	test/poly_hi_fun2.g \
	test/poly_hi_fun3.g \
	test/poly_hi_fun4.g \
	test/poly_hi_fun5.g \
	test/poly_hi_fun6.g \
	\
	test/poly_copy.g \
	test/factorial.g \
	test/even_odd.g \
	test/cast.g \
	test/string0.g \
	test/string1.g \
	test/hello_world.g \
	test/string_cvt.g \
	test/init_rvalue.g \
	test/overload0.g \
	test/overload1.g \
	\
	test/overload2.g \
	test/apply_global.g \
	test/many_constr.g \
	test/union0.g \
	test/union1.g \
	test/union2.g \
	test/union3.g \
	test/union4.g \
	test/if-expr.g \
	test/operator0.g \
	\
	test/operator1.g \
	test/array0.g \
	test/array1.g \
	test/array2.g \
	test/poly_struct.g \
	test/poly_struct2.g \
	test/poly_struct3.g \
	test/poly_struct4.g \
	test/poly_struct5.g \
	test/poly_struct6.g \
	test/poly_fun_struct.g \
	\
	test/linked_list.g \
	test/linked_list2.g \
	test/poly_union0.g \
	test/model0.g \
	test/model1.g \
	test/concept0.g \
	test/concept0b.g \
	test/isalpha.g \
	test/atoi.g \
	test/str.g \
	\
	test/refinement0.g \
	test/destructor2.g \
	test/refinement1.g \
	test/refinement2.g \
	test/same-type.g \
	test/assoc_type0.g \
	test/assoc_type1.g \
	test/accumulate.g \
	test/poly_constr.g \
	test/poly_ptr_fun.g \
	\
	test/model2.g \
	test/poly_class.g \
	test/model3.g \
	test/model4.g \
	test/model7.g \
	test/assign0.g \
	test/assign1.g \
	test/assign2.g \
	test/assign3.g \
	test/assign4.g \
	test/delete0.g \
	\
	test/delete1.g \
	test/placement_new.g \
	test/default_concept_op0.g \
	test/apples.g \
	test/implicit_inst1.g \
	test/implicit_inst2.g \
	test/first_class_poly1.g \
	test/concept_add.g \
	test/power.g \
	\
	${STL_TESTS}\

NON_COMPILING_TESTS = \
	test/placement_new0.g \
	test/placement_new2.g \

EXTRA_TESTS = \
	test/explicit_inst.g \
	test/implicit_inst3.g \
	test/model5.g \
	test/model6.g \
	test/stable_sort_error.g\ # suppose to fail

BGL =   bgl/property_map_concepts.g	\
	bgl/graph_concepts.g		\
	bgl/queue_concepts.g		\
	bgl/simple_adjacency_list.g	\
	bgl/adjacency_list_advanced.g	\
	bgl/adjacency_list_advanced.g	\
	bgl/queue.g			\
	bgl/breadth_first_search.g	\
	bgl/dijkstra.g			\
	bgl/vector_as_graph.g		\

BGL_TESTS = \
	bgl/adjacency_list_test.g	\
	bgl/queue_test.g		\
	bgl/breadth_first_search_test.g	\
	bgl/dijkstra_test.g		\


STL = 	stl/basic_concepts.g \
	stl/iterator_concepts.g \
	stl/pair.g \
	stl/basic_models.g \
	stl/iterator_functions.g \
	stl/basic_algo_impl.g \
	stl/basic_algorithms.g \
	stl/iterator_models.g \
	stl/reverse_iterator.g \
	stl/sequence_queries.g \
	stl/sequence_mutation.g \
	stl/sorting.g \
	stl/slist.g \
	stl/list.g \
	stl/numeric.g \
	stl/vector.g \


FUTURE_TESTS =  

SHOULD_FAIL = test/assoc_type2.g test/return_copy.g


.SUFFIXES: .ml .mll .mly .mli .cmo .cmx .cmi .g .c .cpp .o .exe .prof .ok

TESTS_CPP = $(TESTS:.g=.cpp)
TESTS_OBJ = $(TESTS_CPP:.cpp=.o)
TESTS_EXE = $(TESTS_OBJ:.o=.exe)
TESTS_OK = $(TESTS_EXE:.exe=.ok)

STL_TESTS_CPP = $(STL_TESTS:.g=.cpp)
STL_TESTS_OBJ = $(STL_TESTS_CPP:.cpp=.o)
STL_TESTS_EXE = $(STL_TESTS_OBJ:.o=.exe)
STL_TESTS_OK = $(STL_TESTS_EXE:.exe=.ok)

STL_CPP = $(STL:.g=.cpp)
STL_OBJ = $(STL_CPP:.cpp=.o)

BGL_CPP = $(BGL:.g=.cpp)
BGL_OBJ = $(BGL_CPP:.cpp=.o)

CC = gcc3
CXX = g++3
CFLAGS =  -I$(GC_DIR)/include -g -DDEBUG -DGC_DEBUG
CPPFLAGS = -I./ -I$(BOOST_ROOT) -I$(GC_DIR)/include -g
#  -DDEBUG -DGC_DEBUG

SRC_PROF = $(MLSOURCES:.ml=.prof)

G_INCLUDES = -I ./stl -I ./bgl

.g.cpp:
	m4 -s $*.g > $*.tmp
	./g ${G_INCLUDES} --swig $(SWIG_DIR) $*.tmp
#	vim -e -s -u $(HOME)/.vimrc '+normal 1G=G' '+w!' '+q' $*.cpp

.ml.$(MLC_OUT):
	$(MLC) $(MLC_FLAGS) -c $<

.mli.cmi:
	$(MLC) -c $<

.mll.ml:
	$(LEX) $<

.mly.ml:
	$(YACC) -v $<	

.mly.mli:
	$(YACC) -v $<	

#.c.o:
#	$(CC) $(CFLAGS) -c $< -o $*.o

.cpp.o:
	$(CXX) $(CPPFLAGS) -c $< -o $*.o


%.exe: %.o libgslib.a libgc.a
	$(CXX) -L. $< -o $@ -lgslib -lgc 

.exe.ok:
	if ( $*.exe ); then touch $*.ok; else touch $*.bad; false; fi

.ml.prof:
	ocamlprof $< > $*.prof

default: g g_stdlib.o stl tests

OCAMLLIB 	= `$(MLC) -where`

test_union_find: test_union_find.ml
	$(MLC) $(MLC_FLAGS) -g -o test_union_find $(OCAMLLIB)/unix.$(ML_LIB) $(MLOBJECTS)

g: $(MLOBJECTS)
	$(MLC) $(MLC_FLAGS) -o g $(OCAMLLIB)/unix.$(ML_LIB) $(OCAMLLIB)/str.$(ML_LIB) $(MLOBJECTS)

lexer.cmx: lexer.ml

parser.cmi: parser.mli
parser.$(MLC_OUT): support.$(MLC_OUT) parser.cmi parser.ml

prof: $(SRC_PROF)

libgc.a: $(GC_DIR)/gc.a
	cp $< $@  
	ranlib $@

libgslib.a: g_stdlib.o $(STL_OBJ)
	ar -r $@ $^
	ranlib $@

parse_tests: $(TESTS_CPP)

#$(STL_OBJ)
tests: g g_stdlib.o g_stdio.o $(TESTS_OK) 

stltests: g g_stdlib.o g_stdio.o $(STL_TESTS_OK) 

stl: g $(STL_OBJ)

bgl: g $(BGL_OBJ)

rmtests:
	rm -rf  $(TESTS_CPP) $(TESTS_OBJ) $(TESTS_EXE)

clean:
	rm -rf g *.o *.cmo *.cmx *.mli d *.cmi parser.ml lexer.ml *~ *.output tmp.i tmp_wrap.g 

stlclean:
	rm -rf $(STL_CPP) $(STL_OBJ) stl/*.tmp stl/*.fwd stl/*.cpp

bglclean:
	rm -rf $(BGL_CPP) $(BGL_OBJ) bgl/*.tmp bgl/*.fwd bgl/*.o bgl/*.cpp bgl/*.exe

testclean:
	rm -rf $(TESTS_CPP) $(TESTS_OBJ) $(TESTS_EXE) $(TESTS_OK) test/*.tmp test/*.bad test/*.fwd

stltestclean:
	rm -rf $(STL_TESTS_CPP) $(STL_TESTS_OBJ) $(STL_TESTS_EXE) $(STL_TESTS_OK) test/*.tmp test/*.bad test/*.fwd

squeaky: clean stlclean bglclean testclean

bgl/queue_test.exe: bgl/queue_test.o bgl/queue.o g_stdlib.o
	$(CXX) g_stdlib.o $(STL_OBJ) $(GC_DIR)/gc.a bgl/queue.o bgl/queue_test.o $< -o $*.exe

bgl/adjacency_list_test.exe: bgl/adjacency_list_test.o g_stdlib.o $(STL_OBJ) $(BGL_OBJ)
	$(CXX) g_stdlib.o $(STL_OBJ) $(BGL_OBJ) $(GC_DIR)/gc.a bgl/adjacency_list_test.o -o $*.exe

bgl/breadth_first_search_test.exe: bgl/breadth_first_search_test.o $(STL_OBJ) $(BGL_OBJ) g_stdlib.o
	$(CXX) g_stdlib.o $(STL_OBJ) $(BGL_OBJ) $(GC_DIR)/gc.a bgl/breadth_first_search_test.o -o $*.exe
