################################################################################
# Parametres modifiables par l utilisateur
#-------------------------------------------------------------------------------

#  Cas ou MPI est installe sur la machine (_MPI) ou non (NONE_MPI)
# MPI=NONE_MPI
 MPI=_MPI

ifeq "$(MPI)" "NONE_MPI"
FC=gfortran
endif
ifeq "$(MPI)" "_MPI"
FC=mpif90
endif
#                                                                              #
################################################################################
#
# Le contenu des repertoires dont le nom commence par le(s) caractere(s) ci-dessous
# n'est pas pris en compte lors de la compilation.
STOPREP=_

# Le contenu des repertoires dont le nom commence par le(s) caractere(s) ci-dessous
# AINSI que le contenu de leurs sous-arborescence n'est pas pris en compte
# lors de la compilation.
STOPARBO=@

# Les bibliotheques sont construites dans le repertoire ci dessous (chemin relatif)
LIBREP=../lib

# Les repertoires de sources sont stockes dans le repertoire ci-dessous
# (chemin relatif)
SOURCES=../sources
UTI=../sources/UTI

# ----- Application construite par defaut -----
makestart: cerf uti

# Flags de compilation FORTRAN 
FFLAGS=$(OPTFFLAGS) -c -O3 -Wall -fcheck=all -g -fbacktrace -fbounds-check -cpp  -D$(MPI)

# Flags d'edition de lien pour chaque application; On commence par les flags par defaut
LDFLAGS= -O3 -o

# Bibliotheques systemes pour l'edition de liens pour chaque application
LDLIBS=  

ARFLAGS=rvU
AREXTRACT=xv

DBFFLAGS=
OPTFFLAGS=
LDDBG=-g

LINKCC=$(CC)
LINKFC=$(FC)

CP=cp
MV=mv

RANLIB=ranlib
RANLIBFLAGS=
LNKRANLIB=-t

TOUCH=touch
TOUCHFLAGS=-c -f

LN=ln
LNFLAGS=-s

RM=rm
RMFLAGS=-f

CHMOD=chmod
CHMOD_EXE=755

%.o:%.f90 
	${FC} $(FFLAGS) $<
	${MV} $(notdir $(subst .f90,.o,$<)) $@

# Liste des fichiers .o a preciser explicitement au LINK, par application
OBJ=cerf.o

# Liste des bibliotheques constituant chaque application
#
LIBS= $(LIBREP)/lib_UTI.a $(LIBREP)/lib_NUM.a $(LIBREP)/lib_GEO.a  $(LIBREP)/lib_PHY.a 

# Nom du programme executable a generer pour chaque application
EXE=cerf

# Elements constituant chaque application 
.PHONY: cerf
cerf: start __A_exe fin

.PHONY: start
start:  liens dolien

.PHONY: fin
fin: dellien

.PHONY: liens
liens: MOD 

# Extraction des .o de chaque bibliotheque
cerf.o:;
	${AR} $(AREXTRACT) $(LIBREP)/lib_NUM.a cerf.o


# Definition ici des liens logiques pour la compilation
#
MODTYP= $(LIBREP)/phy_typ.mod $(LIBREP)/phy.mod $(LIBREP)/geo_typ.mod $(LIBREP)/geo.mod $(LIBREP)/num_typ.mod $(LIBREP)/num.mod $(LIBREP)/zorder.mod $(LIBREP)/msh.mod $(LIBREP)/uti.mod $(LIBREP)/ptim.mod 

MOD: $(MODTYP)

$(LIBREP)/ptim.mod:
	${FC} $(FFLAGS) $(SOURCES)/NUM/ptim.f90
	${AR} ${ARFLAGS} $(LIBREP)/lib_NUM.a ptim.o
	${RM} ptim.o
	${CP} ptim.mod $(LIBREP)/.

$(LIBREP)/phy_typ.mod:
	${FC} $(FFLAGS) $(SOURCES)/PHY/mod_phy_typ.f90
	${AR} ${ARFLAGS} $(LIBREP)/lib_PHY.a mod_phy_typ.o
	${RM} mod_phy_typ.o
	${CP} phy_typ.mod $(LIBREP)/.
$(LIBREP)/phy.mod:
	${FC} $(FFLAGS) $(SOURCES)/PHY/mod_phy.f90
	${AR} ${ARFLAGS} $(LIBREP)/lib_PHY.a mod_phy.o
	${RM} mod_phy.o
	${CP} phy.mod $(LIBREP)/.

$(LIBREP)/geo_typ.mod:
	${FC} $(FFLAGS) $(SOURCES)/GEO/mod_geo_typ.f90
	${AR} ${ARFLAGS} $(LIBREP)/lib_GEO.a mod_geo_typ.o
	${RM} mod_geo_typ.o
	${CP} geo_typ.mod $(LIBREP)/.

$(LIBREP)/geo.mod:
	${FC} $(FFLAGS) $(SOURCES)/GEO/mod_geo.f90
	${AR} ${ARFLAGS} $(LIBREP)/lib_GEO.a mod_geo.o
	${RM} mod_geo.o
	${CP} geo.mod $(LIBREP)/.

$(LIBREP)/num_typ.mod:
	${FC} $(FFLAGS) $(SOURCES)/NUM/mod_num_typ.f90
	${AR} ${ARFLAGS} $(LIBREP)/lib_NUM.a mod_num_typ.o
	${RM} mod_num_typ.o
	${CP} num_typ.mod $(LIBREP)/.

$(LIBREP)/num.mod:
	${FC} $(FFLAGS) $(SOURCES)/NUM/mod_num.f90
	${AR} ${ARFLAGS} $(LIBREP)/lib_NUM.a mod_num.o
	${RM} mod_num.o
	${CP} num.mod $(LIBREP)/.
	
$(LIBREP)/uti.mod:
	${FC} $(FFLAGS) $(UTI)/mod_uti.f90
	${AR} ${ARFLAGS} $(LIBREP)/lib_UTI.a mod_uti.o
	${RM} mod_uti.o
	${CP} uti.mod $(LIBREP)/.

$(LIBREP)/zorder.mod:
	${FC} $(FFLAGS) $(UTI)/mod_zorder.f90
	${AR} ${ARFLAGS} $(LIBREP)/lib_UTI.a mod_zorder.o
	${RM} mod_zorder.o
	${CP} zorder.mod $(LIBREP)/.
	
$(LIBREP)/msh.mod:
	${FC} $(FFLAGS) $(UTI)/mod_msh.f90
	${AR} ${ARFLAGS} $(LIBREP)/lib_UTI.a mod_msh.o
	${RM} mod_msh.o
	${CP} msh.mod $(LIBREP)/.

.PHONY: dolien
dolien:
	-${CP}  $(LIBREP)/phy_typ.mod phy_typ.mod
	-${CP}  $(LIBREP)/phy.mod phy.mod
	-${CP}  $(LIBREP)/geo_typ.mod geo_typ.mod
	-${CP}  $(LIBREP)/geo.mod geo.mod
	-${CP}  $(LIBREP)/num_typ.mod num_typ.mod
	-${CP}  $(LIBREP)/num.mod num.mod
	-${CP}  $(LIBREP)/uti.mod uti.mod
	-${CP}  $(LIBREP)/zorder.mod zorder.mod
	-${CP}  $(LIBREP)/msh.mod msh.mod
	-${CP}  $(LIBREP)/ptim.mod ptim.mod


.PHONY: dellieninc
dellien:
	-${RM} ${RMFLAGS} phy_typ.mod
	-${RM} ${RMFLAGS} phy.mod
	-${RM} ${RMFLAGS} geo_typ.mod
	-${RM} ${RMFLAGS} geo.mod
	-${RM} ${RMFLAGS} num_typ.mod
	-${RM} ${RMFLAGS} num.mod
	-${RM} ${RMFLAGS} uti.mod
	-${RM} ${RMFLAGS} zorder.mod
	-${RM} ${RMFLAGS} msh.mod
	-${RM} ${RMFLAGS} ptim.mod


# Construction des bibliotheques des fonctions de cerf

$(LIBREP)/lib_PHY.a: $(foreach DIR, $(shell find $(SOURCES)/PHY ! -type d -o -name "$(STOPREP)*" -o \( -name "$(STOPARBO)*" -prune \) -o -print) ,$(patsubst %,$(LIBREP)/lib_PHY.a(%),$(subst .f90,.o,$(wildcard $(DIR)/*.f90))) )
	${RANLIB} $(RANLIBFLAGS) $(LIBREP)/lib_PHY.a 

$(LIBREP)/lib_GEO.a: $(foreach DIR, $(shell find $(SOURCES)/GEO ! -type d -o -name "$(STOPREP)*" -o \( -name "$(STOPARBO)*" -prune \) -o -print) ,$(patsubst %,$(LIBREP)/lib_GEO.a(%),$(subst .f90,.o,$(wildcard $(DIR)/*.f90))))
	${RANLIB} $(RANLIBFLAGS) $(LIBREP)/lib_GEO.a

$(LIBREP)/lib_NUM.a: $(foreach DIR, $(shell find $(SOURCES)/NUM ! -type d -o -name "$(STOPREP)*" -o \( -name "$(STOPARBO)*" -prune \) -o -print) ,$(patsubst %,$(LIBREP)/lib_NUM.a(%),$(subst .f90,.o,$(wildcard $(DIR)/*.f90))))
	${RANLIB} $(RANLIBFLAGS) $(LIBREP)/lib_NUM.a

$(LIBREP)/lib_UTI.a: $(foreach DIR, $(shell find $(UTI) ! -type d -o -name "$(STOPREP)*" -o \( -name "$(STOPARBO)*" -prune \) -o -print) ,$(patsubst %,$(LIBREP)/lib_UTI.a(%),$(subst .f90,.o,$(wildcard $(DIR)/*.f90))))
	${RANLIB} $(RANLIBFLAGS) $(LIBREP)/lib_UTI.a


# Edition de lien par application
.PHONY: __A_exe
__A_exe: $(LIBS) $(OBJ)
	@echo "Edition de liens..."
	-$(LINKFC) $(LDFLAGS) $(EXE) $(OBJ) $(LIBS) $(LDLIBS);
	${RM} $(RMFLAGS) $(OBJ)
	-${CHMOD} $(CHMOD_EXE) $(EXE)

.PHONY: uti
uti: start cerf2tec.exe cerf_input.exe cerf_amr.exe fin

cerf2tec.exe: $(LIBS)
	${AR} $(AREXTRACT) $(LIBREP)/lib_UTI.a cerf2tec.o
	$(LINKFC) $(LDFLAGS) cerf2tec cerf2tec.o $(LIBS) 
	${RM} cerf2tec.o

cerf_input.exe: $(LIBS)
	${AR} $(AREXTRACT) $(LIBREP)/lib_UTI.a cerf_input.o
	$(LINKFC) $(LDFLAGS) cerf_input cerf_input.o  $(LIBS) 
	${RM} cerf_input.o
	
cerf_amr.exe: $(LIBS)
	${AR} $(AREXTRACT) $(LIBREP)/lib_UTI.a cerf_amr.o
	$(LINKFC) $(LDFLAGS) cerf_amr cerf_amr.o  $(LIBS) 
	${RM} cerf_amr.o
        
# Nettoyage
clean:
	@echo "Nettoyage..."
	@rm $(LIBREP)/*

