
PROJECT_NAME	= sot
OS		= Linux
SUFFIX		= 
HOSTNAME	= jorasse
PROJECT_HOME	= /home/nmansard/src/StackOfTasks
PROJECT_DIR_SRC	= $(PROJECT_HOME)/src
PROJECT_DIR_INCLUDE= $(PROJECT_HOME)/src
PROJECT_DIR_LIB	= $(PROJECT_HOME)/lib
PROJECT_DIR_OBJ	= $(PROJECT_HOME)/.obj
PROJECT_DIR_DEP	= $(PROJECT_HOME)/.dep
PROJECT_DIR_BIN	= $(PROJECT_HOME)/bin
PROJECT_DIR_TESTS= $(PROJECT_HOME)/tests
PROJECT_DIR_EXPORT_INCLUDE	= $(PROJECT_HOME)/include
PROJECT_LIB_PATH = $(PROJECT_DIR_LIB)
PROJECT_PLUGIN_PATH = $(PROJECT_DIR_LIB)/plugin
PROJECT_OBJ_PATH = $(PROJECT_DIR_OBJ)/$(HOSTNAME)$(SUFFIX)
PROJECT_PLUGIN_OBJ_PATH = $(PROJECT_OBJ_PATH)/plugin
PROJECT_DEP_PATH = $(PROJECT_DIR_DEP)/$(HOSTNAME)$(SUFFIX)
PROJECT_BIN_PATH = $(PROJECT_DIR_BIN)/$(HOSTNAME)$(SUFFIX)
PROJECT_TESTS_PATH = $(PROJECT_DIR_TESTS)
PROJECT_INC_PATH = $(PROJECT_DIR_EXPORT_INCLUDE)/$(PROJECT_NAME)
PROJECT_LIBNAME	= sot-0
OPENHRP_ROOTDIR = /home/nmansard/src/OpenHRP

CXX		= g++-3.3
CXX_VERSION	= 3.3.6
CXX_FLAGS	+= -DWITH_OPENHRP -I/usr/local/3.3/include -I. -I/usr/include/boost-sandbox -pthread -I/usr/local/3.3/include -I/usr/local/3.3/include/boost_thread-sandbox -I/usr/include  -O2 -I/home/nmansard/src/StackOfTasks/include -I. -Wall -Wunused -Werror  -D__Linux_
CXXALL		= $(CXX) $(CXX_FLAGS)
AR		= ar crs
RANLIB		= ranlib
MOC		= @QT_MOC@

LDFLAGS		= -Wl,-rpath,$(PROJECT_DIR_LIB) -L/usr/local/3.3/lib -L/usr/lib/lib -L/usr/local/3.3/lib  -L/home/nmansard/src/StackOfTasks/lib
LIBS		= -lsot-0 -llapack -lblas -lboost_thread-gcc-mt -lpthread -lpthread -ldl -lm -lpthread 

# --->
# ---> CFLAGS
# --->

# ENABLE TRACES
ifeq ($(VP_DEBUG),yes)
	CXX_FLAGS += -DVP_DEBUG=yes -g
	CXX_FLAGS_TMP:=$(filter-out -O%,$(CXX_FLAGS))
	CXX_FLAGS:=$(filter-out -Werror,$(CXX_FLAGS_TMP))
endif

# LEVEL OF TRACE
VP_DMODE ?= 0
CXX_FLAGS += -DVP_DEBUG_MODE=$(VP_DMODE)

# FLAG DEFENSIF
ifeq ($(VP_DEFENSIF), yes)
  CXX_FLAGS += -DVP_DEFENSIF
endif

# --->
# ---> MAKE FLAGS
# --->

MAKE_FLAGS     =
ifeq ($(VP_DEBUG),yes)
  MAKE_FLAGS     += VP_DEBUG=yes
endif

ifeq ($(VP_DEFENSIF), yes)
  MAKE_FLAGS     += VP_DEFENSIF=yes
endif

ifdef VP_DMODE
  MAKE_FLAGS     += VP_DMODE=$(VP_DMODE)
endif




LIB		= $(PROJECT_LIB_PATH)/libsot-0.a


SOURCES		= sotSignalArray.cpp\
		  sotSignalCast.cpp
TEMPLATE_CPP	= sotSignal.t.cpp \
		  sotTimeDependancy.t.cpp \
	 	  sotSignalPtr.t.cpp
HEADERS		= sotSignalAbstract.h  \
	 	  sotSignalTimeDependant.h 

HEADERS         += $(SOURCES:%.cpp=%.h)
HEADERS         += $(TEMPLATE_CPP:.t.cpp=.h) $(TEMPLATE_CPP)

.KEEP_STATE	:
.PRECIOUS	: $(LIB)

all install	: directory $(LIB)

%_MKDIR:
	@if [ ! -d $* ] ;\
	then \
		echo "*" ; \
		echo "* Creation of the $* directory..." ; \
		echo "*" ; \
		mkdir -p $* ; \
	fi ;

directory: $(PROJECT_OBJ_PATH)_MKDIR $(PROJECT_DIR_DEP)_MKDIR $(PROJECT_DEP_PATH)_MKDIR $(PROJECT_BIN_PATH)_MKDIR $(PROJECT_PLUGIN_PATH)_MKDIR $(PROJECT_PLUGIN_OBJ_PATH)_MKDIR 

OBJECTS_TMP =$(SOURCES:%.cpp=$(PROJECT_OBJ_PATH)/%.o)
OBJECTS     =$(OBJECTS_TMP:%.c=$(PROJECT_OBJ_PATH)/%.o)

EXPORT_HEADERS = $(HEADERS:%=$(PROJECT_INC_PATH)/%)

DEPFILES_TMP=$(SOURCES:%.cpp=$(PROJECT_DEP_PATH)/%.P)
DEPFILES    =$(DEPFILES_TMP:%.c=$(PROJECT_DEP_PATH)/%.P)
DEPFILES    +=$(PLUGINS:%.cpp=$(PROJECT_DEP_PATH)/%PLUG.P)

# Be aware: with insure option -MD puts the dependency file in the same
# directory than the source file.  With classic compilators, -MD puts the
# dependency file in the target directory

ifeq ($(SUFFIX), _insure)
DEP_PATH	= 
PLUGIN_DEP_PATH = 
else
DEP_PATH	= $(PROJECT_OBJ_PATH)/
PLUGIN_DEP_PATH = $(PROJECT_PLUGIN_OBJ_PATH)/
endif
DEP_FILE	= $(DEP_PATH)$*.d
PLUGIN_DEP_FILE	= $(PLUGIN_DEP_PATH)$*PLUG.d

export-header: $(EXPORT_HEADERS) 

$(LIB) :  export-header $(OBJECTS)
	$(AR) $@ $(PROJECT_OBJ_PATH)/*.o

# Rule to generate moc files for Qt
m%.cpp: %.h
	@echo "*"
	@echo "* Construct MOC file $@ "
	@echo "*"
	$(MOC) -o $@ $<

# Rule for combining compilation and dependency generation:
# - put objects in $(PROJECT_OBJ_PATH)
# - put dependencies in $(PROJECT_DEP_PATH)

# ---> OBJECTS 
$(PROJECT_OBJ_PATH)/%.o : %.cpp
	@echo "*"
	@echo "* Build $*.o from $*.cpp "
	@echo "*"
	$(CXXALL) -MD -o $@ -c $< $($*_CXXFLAGS)
	@cp $(DEP_FILE) $(PROJECT_DEP_PATH)/$*.P; \
	sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
	    -e '/^$$/ d' -e 's/$$/ :/' < $(DEP_FILE)\
	    >> $(PROJECT_DEP_PATH)/$*.P; \
	rm -f $(DEP_FILE)


$(PROJECT_OBJ_PATH)/%.o : %.c
	@echo "*"
	@echo "* Build $@ from $<  "
	@echo "*"
	$(CXXALL) -MD -o $@ -c $< $($*_CXXFLAGS)
	@cp $(DEP_FILE) $(PROJECT_DEP_PATH)/$*.P; \
	sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
	    -e '/^$$/ d' -e 's/$$/ :/' < $(DEP_FILE)\
	    >> $(PROJECT_DEP_PATH)/$*.P; \
	rm -f $(DEP_FILE)

# ---> PLUGINS 
$(PROJECT_PLUGIN_OBJ_PATH)/%PLUG.o : %.cpp
	@echo "*"
	@echo "* Build $*PLUG.o from $*.cpp  "
	@echo "*"
	$(CXXALL) -fPIC -MD -o $@ -c $< $($*_CXXFLAGS)
	@cp $(PLUGIN_DEP_FILE) $(PROJECT_DEP_PATH)/$*PLUG.P; \
	sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
	    -e '/^$$/ d' -e 's/$$/ :/' < $(PLUGIN_DEP_FILE)\
	    >> $(PROJECT_DEP_PATH)/$*PLUG.P; \
	rm -f $(PLUGIN_DEP_FILE)

define plugin_template
$(1)_PLUGIN_PATH ?= $$(PROJECT_PLUGIN_PATH)
$(1)_OBJS = $($(1)_OBJ_FILES) $(1:%=$(PROJECT_PLUGIN_OBJ_PATH)/%PLUG.o)
PLUGINSO += $$($(1)_PLUGIN_PATH)/$(1).so
PLUGIN_OBJS += $$($(1)_OBJS)
$$($(1)_PLUGIN_PATH)/$(1).so: $$($(1)_OBJS)
	@echo "*"
	@echo "* Linking $$(@F)"
	@echo "*"
	$$(CXXALL) -shared -o $$@ $$^ $($(1)_EXT_OBJ) $($(1)_LDFLAGS) $(LDFLAGS) $(LIBS)
endef

$(foreach TARGET,$(PLUGINS:%.cpp=%),$(eval $(call plugin_template,$(TARGET))))

plugin: $(PLUGIN_OBJS) $(PLUGINSO) 

# ---> HEADERS
$(PROJECT_INC_PATH)/%.h : %.h
	@ln -snf $(shell pwd)/$< $@

$(PROJECT_INC_PATH)/%.hpp : %.hpp
	@ln -snf $(shell pwd)/$< $@

$(PROJECT_INC_PATH)/%.t.cpp : %.t.cpp
	@ln -snf $(shell pwd)/$< $@


clean:
	rm -f *%
	rm -f *~
	rm -f *.o

uninstall:
	rm -f $(OBJECTS)
	rm -f $(DEPFILES)


-include $(DEPFILES)
