

CXX		=	g++
CPPFLAGS		=	-Imatrix -Itools -Ispectral \
			-DWITH_MATRIX -DWITH_SYMMATRIX \
			-DWITH_SPARSESYM -DWITH_SPARSEMAT

GCCWARN		=#	-W -Wall
DEBU		=#	-g -DDEBUG
OPTI		=	-pipe -O6
LINK		=	-lm
OBJDIR		=	Object

# # TARGET		=	SDP_S res2Plot
TARGET		=	sdps sdps_res2Plot

CXXFLAGS		= 	$(OPTI) $(WARN) $(DEBU)
LDFLAGS		=	$(LINK)

VPATH	        =       matrix tools spectral SDP_SOLVER


# Fichiers sources
SRCS_matrix 			= $(wildcard   matrix/*.c matrix/*.cc )
SRCS_spectral 			= $(wildcard   spectral/*.c spectral/*.cc )
SRCS_SDP_SOLVER 			= $(wildcard   SDP_SOLVER/*.c SDP_SOLVER/*.cc )
# SRCS_tools			= $(wildcard   tools/*.c tools/*.cc )
SRCS			= $(SRCS_matrix) $(SRCS_spectral) $(SRCS_SDP_SOLVER)

# Fichiers objets
# transfome "	xxx/popo.cc"  en "Objects/popo.o"
ALL_OBJ = $(addsuffix .o, $(addprefix $(OBJDIR)/, $(notdir $(basename $(SRCS)))))


# Fichiers de dépendance
DPDS = $(ALL_OBJ:.o=.d)

########################################################################

all:		$(TARGET)

sdps:		$(ALL_OBJ)
		$(CXX) $(CXXFLAGS) $(ALL_OBJ) $(LDFLAGS) -o $@
sdps_res2Plot: 	tools/res2Plot.o
		$(CXX) -lm tools/res2Plot.c -o $@

# various cleaning
clean:
		-rm -f Object/*.o tools/*.o  core
dc:	distclean
distclean:
		$(MAKE) clean
		@rm -f $(TARGET)
		

$(OBJDIR)/%.o:	%.cc
		$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@

$(OBJDIR)/%.o:	%.c
		$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@



# Creation des fichiers de dépendance 
# 
# Dans le but de générer une dépendance correcte des fichiers de 
# dépendance eux-même, la doc gmake (page 30) conseille d'utiliser 
# la commande ci -dessous.
# 
# Le sed a pour but de transforme les lignes du ".d" suivantes :
#    log.o:    log.cc log.h external.h
# en :
#    log.o log.d:    log.cc log.h external.h
# 
# NOTA : on peut utiliser l'option -M a la place de -MM pour lister 
# TOUTES les dépendances (pour vérifier le path des fichier systèmes 
# inclus par exemple).
# 
# On affiche (grace a la variable automatique $? dans la commande @echo)
# le (ou les) fichiers recents,  responsables de la mise a jour du ".d",
# mais seul le  ".cc" est utilisé pour la reconstruction du ".d" : 
# 
# Exemple : si fichier a reconstruire est toto.d, la variable $?
# peut tres bien valoir titi.h si titi.h fait partie des dépendance de 
# toto.cc  !
# 
# 
$(OBJDIR)/%.d: %.cc
	@echo '=> Refait .d "$@" car inexistant ou plus ancien que : $?'
	@if [ ! -d $(OBJDIR) ]; then mkdir $(OBJDIR); fi
	@set -e; rm -f $@; \
	$(CXX) -MM $(CPPFLAGS) $< > $@.$$$$; \
	sed  's,\($*\)\.o[ :]*,$(OBJDIR:/=)/\1.o $@ : ,g' < $@.$$$$ > $@; \
	rm -f $@.$$$$ 
$(OBJDIR)/%.d: %.c
	@echo '=> Refait .d "$@" car inexistant ou plus ancien que : $?'
	@if [ ! -d $(OBJDIR) ]; then mkdir $(OBJDIR); fi
	@set -e; rm -f $@; \
	$(CXX) -MM $(CPPFLAGS) $< > $@.$$$$; \
	sed  's,\($*\)\.o[ :]*,$(OBJDIR:/=)/\1.o $@ : ,g' < $@.$$$$ > $@; \
	rm -f $@.$$$$ 
	
deps: $(DPDS)

include $(DPDS)

########################################################################
# Visualisation des dependances completes de toutes les sources
visudep : 
	@echo 
	@for file in $(SRCS) ; \
	do \
	   echo ;\
	   echo "=> visu dependance de : $$file" ;\
	   echo ;\
	   $(CXX) -M $(DFLAGS) $(CPPFLAGS) $$file ;\
	done;

## Pour deboguage
trace_files:
	@echo "Nb de fichier dans variable SRCS" 
	@echo $(SRCS) | wc 
	@echo "Nb de fichier dans variable ALL_OBJ" 
	@echo $(ALL_DIR) | wc 
	@echo "Nb de fichier dans variable SRCS" 
	@echo  
	@echo $(sort $(notdir $(SRCS)))
	@echo "Nb de fichier dans variable ALL_OBJ" 
	@echo  
	@echo $(sort $(notdir $(ALL_OBJ))) 

########################################################################
# Archivage du répertoire courant dans le répertoire parent
# avec la date dans le nom du .zip créé
# 
# Description des options de zip utilisées :
#    -r   recurse into directories
#    -y   store symbolic links as the link instead of the referenced file
#    -9   compress better (-1 compress faster)
#    -v   verbose operation/print version info
#    -q   quiet operation
#    -o   make zipfile as old as latest entry
# Decompression par :
#    unzip leFichier.zip
#    le répertoire "projet" d'origine est alors recréé (ATTENTION
#    s'il existe déja)
arc: zip
zip:
	$(MAKE) distclean
	date=`date +%Y%m%d-%Hh%Mmn`                     && \
	lpath=`pwd`                                     && \
	bname=`basename $$lpath`                        && \
	datename=$$bname-$$date                         && \
	cd ..                                           && \
	cp -Rp $$bname $$datename                       && \
	zip -r -y -o -q -9  $$datename.zip $$datename   && \
	\rm -rf $$datename                              && \
	cd $$lpath
	
tgz:
	$(MAKE) distclean
	date=`date +%Y%m%d-%Hh%Mmn`                     && \
	lpath=`pwd`                                     && \
	bname=`basename $$lpath`                        && \
	datename=$$bname-$$date                         && \
	cd ..                                           && \
	cp -Rp $$bname $$datename                       && \
	tar cf - $$datename | gzip > $$datename.tgz     && \
	\rm -rf $$datename                              && \
	cd $$lpath
	
tbz:
	$(MAKE) distclean
	date=`date +%Y%m%d-%Hh%Mmn`                     && \
	lpath=`pwd`                                     && \
	bname=`basename $$lpath`                        && \
	datename=$$bname-$$date                         && \
	cd ..                                           && \
	cp -Rp $$bname $$datename                       && \
	tar cf - $$datename | bzip2 > $$datename.tbz    && \
	\rm -rf $$datename                              && \
	cd $$lpath

## ./
