APPNAME		= test
QDIR            = ../libquantum
SHELL		= /bin/bash
CXX		= g++-3.2
LD		= ld
NICE		= nice
STRIP		= strip
OPTIMISE        = -O9
CXXWARNINGS	= -Wall -Wtraditional -Wpointer-arith -Wwrite-strings       \
		  -Wcast-qual -Wcast-align -Wconversion -Wstrict-prototypes \
		  -Wmissing-prototypes -Wmissing-declarations               \
		  -Wnested-externs -Woverloaded-virtual
ifneq ($(CXX),g++-2.95)
CXXWARNINGS     += -Wredundant-decls
endif
CXXFLAGS	= -I. -I$(QDIR)/ -L. $(OPTIMISE) \
		  -felide-constructors -fno-rtti -ffast-math
LIBS		= -lm
ifeq ($(PTHREADS),yes)
CXXFLAGS	+= -DQINTERFACE_USES_PTHREADS -pthread #-D_REENTRANT
LIBS		+= -pthread #-lpthread
endif
OBJ_DIR		= .Objects
DEP_DIR		= .Dependencies
OBJ		= concurrence.o test.o 
DEP		= $(OBJ:.o=.dep)
OBJECTS		= $(addprefix $(OBJ_DIR)/,$(OBJ))
DEPENDENCIES	= $(addprefix $(DEP_DIR)/,$(DEP))
QLIBS		= $(QDIR)/lib*.so.0

# sed will build dependencies' dependencies for us on the fly
SEDTRANS	= | sed 's/\(.*\)\.o:/$(OBJ_DIR)\/\1.o $(DEP_DIR)\/\1.dep :/'

.PHONY: all clean flags

all     : flags $(APPNAME)

# how to build the main executable
$(APPNAME) : $(OBJECTS)
	@echo "====== Creating the test executable ======"
	@$(NICE) $(CXX) $(OPTIMISE) $(OBJECTS) \
		 $(LIBS) $(QLIBS) -o $(APPNAME)
	$(STRIP) $(APPNAME)

# object file creation from generic C++ sources
$(OBJECTS) :
	@if [ ! -d $(OBJ_DIR) ]; then mkdir $(OBJ_DIR); fi
	@echo Compiling $@
	@$(NICE) $(CXX) $(CXXFLAGS) $(CXXWARNINGS) -o $@ -c $<

# How to build a dependency file. "sed" creates dependencies' dependencies!
$(DEPENDENCIES) : $(DEP_DIR)/%.dep : %.cc
	@if [ ! -d $(DEP_DIR) ]; then mkdir $(DEP_DIR); fi
	@echo "Creating dependency " $@
	@$(NICE) $(SHELL) -c "$(CXX) $(CXXFLAGS) -M -w $< $(SEDTRANS)" > $@

# include dependencies (build them if absent)
ifneq ($(MAKECMDGOALS),clean)
-include $(DEPENDENCIES)
endif

# show compilation flags
flags 	: 
	@echo C++ compiler version is `$(CXX) --version`;
	@#echo Warning flags are $(CXXWARNINGS);
	@echo Compilation flags are $(CXXFLAGS);

# remove everything which can be rebuilt
clean   :
	rm -f *~ core gmon.out $(APPNAME);
	rm -rf $(DEP_DIR) $(OBJ_DIR);

