# Copyright (C) Martin Buchholz 2003

# Where to find Boost
BOOSTDIR   = ../../../boost_1_29_0

# Where to find Boehm GC
GC_INCDIR  = /usr/local/include
GC_LIBDIR  = /usr/local/lib
GC_LDFLAGS = -L$(GC_LIBDIR) -lgc -ldl '-Wl,--rpath' '-Wl,$(GC_LIBDIR)'

# Which compiler to use
CXX        = g++

INCLUDES   = -I. -I$(BOOSTDIR) -I$(GC_INCDIR)
CPPFLAGS   = $(INCLUDES)

LDFLAGS    = $(GC_LDFLAGS)

RM = rm -f

# ----------------------------------------------------------------
# Compiler-specific flags
# ----------------------------------------------------------------
ifneq (,$(findstring g++, $(CXX)))
    CXXFLAGS = -ggdb -gstabs+ -Wall -Wold-style-cast -fmessage-length=0
    NO_IMPLICIT_TEMPLATES = -fno-implicit-templates
else
  ifneq (,$(findstring icc, $(CXX)))
    CXXFLAGS = -Wall -wd488,444,869,981,279,530,1419,193,873
    NO_IMPLICIT_TEMPLATES = -Tnoauto
  else
    CXXFLAGS = -g
    NO_IMPLICIT_TEMPLATES =
  endif
endif

# -ggdb -gstabs+ -Wall -Wold-style-cast -fmessage-length=0
#LDFLAGS = -Wl,--cref -Wl,--print-map -Wl,-Map -Wl,map
COMPILE_FLAGS = $(CPPFLAGS) $(CXXFLAGS)
LINK_FLAGS    = $(CXXFLAGS) $(LDFLAGS)

PROGS = ob

all : $(PROGS)

libsources = \
	Object.cc \
	NullType.cc \
	Cons.cc \
	Int.cc \
	Double.cc \
	String.cc \

libobjects := $(libsources:%.cc=%.o)

libMObS.a : $(libobjects)
	$(RM) $@
	$(AR) cr $@ $^

#	Bool.cc \
#	IO.cc \
#	ob-template-instantiations.cc \
#	Object.cc \
#	Cons.cc \
#	Int.cc \
#	Natnum.cc \
#	Vector.cc \
#	Error.cc \
#	Errors.cc \
#	Print.cc \

#i_files := $(sources:%.cc=%.i)
#s_files := $(sources:%.cc=%.s)
#aux_files = \
#	$(sources:%.cc=%.bb) \
#	$(sources:%.cc=%.bbg) \
#	$(sources:%.cc=%.da) \
#	$(sources:%.cc=%.s) \
#	$(sources:%=%.gcov)

# ----------------------------------------------------------------
ob_OBJECTS = ob.o

ob: $(ob_OBJECTS) libMObS.a
	$(CXX) $(LINK_FLAGS) $(ob_OBJECTS) -L. -lMObS -o $@

# ----------------------------------------------------------------
demo_OBJECTS = demo.o

demo: $(demo_OBJECTS) libMObS.a
	$(CXX) $(LINK_FLAGS) $(demo_OBJECTS) -L. -lMObS -o $@

# ----------------------------------------------------------------
leaky_OBJECTS = leaky.o

leaky: $(leaky_OBJECTS) libMObS.a
	$(CXX) $(LINK_FLAGS) $(leaky_OBJECTS) -L. -lMObS -o $@

# ----------------------------------------------------------------
%.o : %.cc
	$(CXX) $(COMPILE_FLAGS) -c -o $@ $<

%.i : %.cc
	$(CXX) $(COMPILE_FLAGS) -E -c -o $@ $<

ob-template-instantiations.o : %.o : %.cc
	$(CXX) $(COMPILE_FLAGS) -c -o $@ $<

%.s : %.cc
	$(CXX) $(COMPILE_FLAGS) -ggdb -gstabs3 -S -o $@ $<

UNIT-TEST-PROGS = Cons-main Double-main Int-main Number-main Ob-main demo

$(objects) : Object.hpp IsA.hpp ObCast.hpp
ob.o      : $(wildcard *.hpp)
#Cons.o    : Cons.hpp
#Int.o     : Int.hpp
#Natnum.o  : Natnum.hpp
#Vector.o  : Vector.hpp
#ob-template-instantiations.o : $(wildcard *.hpp) Vector-tmethods.cc

# ----------------------------------------------------------------
SILENT_MAKE = $(MAKE) --silent
.PHONY: both ob-g++ ob-icc
ob-g++:
	@$(SILENT_MAKE) clean-cxx && $(SILENT_MAKE) CXX=g++ && ./ob
ob-icc:
	@$(SILENT_MAKE) clean-cxx && $(SILENT_MAKE) CXX=icc && ./ob
both: ob-g++ ob-icc

.PHONY: g++ icc
g++: ob-g++
icc: ob-icc

# ----------------------------------------------------------------
.PHONY: demo-both demo-g++ demo-icc
demo-g++:
	@$(SILENT_MAKE) clean-cxx && $(SILENT_MAKE) CXX=g++ && ./demo
demo-icc:
	@$(SILENT_MAKE) clean-cxx && $(SILENT_MAKE) CXX=icc && ./demo
demo-both : demo-g++ demo-icc

# ----------------------------------------------------------------
%.class : %.java
	javac -source 1.4 $<

.PHONY: compile-errors

compile-errors : CompileErrors.class martin/Command.class martin/CommandResults.class
	@$(SILENT_MAKE) clean-cxx;
	@$(SILENT_MAKE) libMObS.a
	java -ea CompileErrors

# ----------------------------------------------------------------
.PHONY: test-headers
test-headers:
	./test-headers
# ----------------------------------------------------------------
.PHONY: tests
tests: ob-g++ ob-icc compile-errors test-headers

# ----------------------------------------------------------------
.PHONY: clean-java clean-cxx clean

clean-java:
	$(RM) *.class martin/*.class

clean-cxx:
	$(RM) $(PROGS) $(UNIT-TEST-PROGS) demo leaky \
	libMObS.a *.o *.i *.s *.bb *.bbg *.da *.gcov core gmon.out

clean: clean-cxx clean-java

TAGS:
	etags [A-Za-z0-9_-]*.cc [A-Za-z0-9_-]*.hpp
