#-----------------------------------------------------------------------
# Makefile for rocotlib and associated programs
# P. Robert, LPP, 2010 november 16
#-----------------------------------------------------------------------


# ======================
# Select used compilator
# ======================

#FC = ifort
#FC = f90
#FC = f95
#FC = fort77
 FC = gfortran
#FC = gfortran-4.4
#FC = g95

# ======================
# optimize or debug mode
# ======================

 MODE=O
#MODE=D

# ================================
# Choix des options de compilation
# ================================

# Compilateur Intel

ifeq ($(FC),ifort)
    ifeq ($(MODE),D)
# remplacement du check all par tous les checks sauf le check arg_temp_created
      FCOMP = -c -CB -g -check format -check uninit -check output_conversion -traceback -align all -module mod
      FLINK =    -CB -g -check format -check uninit -check output_conversion -traceback -align all -module mod
    else
      FCOMP = -c -CB -fast -module mod -diag-disable 8290
      FLINK =    -CB -fast -module mod -diag-disable 8290
    endif
endif

# Compilateur SUN f90

ifeq ($(FC),f90)
    ifeq ($(MODE),D)
      FCOMP = -c -C -xs
      FLINK =    -C -xs
    else
      FCOMP = -c
      FLINK =
    endif
endif

# Compilateur SUN f95 

ifeq ($(FC),f95)
    ifeq ($(MODE),D)
      FCOMP = -c -C  -xs
      FLINK = -Bstatic -C -xs
    else
      FCOMP = -c
      FLINK =
    endif
endif

# Compilateur fort77

ifeq ($(FC),fort77)
    ifeq ($(MODE),D)
      FCOMP = -c   -O0
      FLINK = -static -O0
    else
      FCOMP = -c -O1
      FLINK = -static -O1
    endif
endif

# Compilateur gfortran linux et Windows/MinGW gfortran

#ifeq ($(FC),gfortran)
#    ifeq ($(MODE),D)
#      FCOMP = -c -g -static -fbounds-check -Wconversion -Wall -Wunderflow -W -fno-automatic -J mod
#      FLINK =    -g -static -fbounds-check -Wconversion -Wall -Wunderflow -W -fno-automatic -J mod
#    else
#      FCOMP = -c -melf_x86_64 -J mod
#      FLINK =    -melf_x86_64 -J mod
#    endif
#endif

# Compilateur Linux gfortran
ifeq ($(FC),gfortran)
    ifeq ($(MODE),D)
#     FCOMP = -c -fbounds-check -Wconversion -Wall -g -fbacktrace -ffpe-trap=invalid,zero,overflow,underflow,denormal
      FCOMP = -c -fbounds-check -Wconversion -Wall -g 
      FLINK =    -fbounds-check -Wconversion -Wall -g
    else
      FCOMP = -c
      FLINK =
    endif
endif


# Compilateur Windows/MinGW g95

ifeq ($(FC),g95)
    ifeq ($(MODE),D)
      FCOMP = -c -ftrace=full -i4 -fbounds-check -Wall
      FLINK =    -ftrace=full -i4 -fbounds-check -Wall
    else
      FCOMP = -c
      FLINK =
    endif
endif


# ==========================
# Definition des directories
# ==========================

SRC_DIR = src/
OBJ_DIR = obj/
BIN_DIR = bin/

# =====================
# Liste des executables 
# =====================

EXEC = $(BIN_DIR)rocot_check.exe \
       $(BIN_DIR)rocot_example.exe \
       $(BIN_DIR)rocot_info.exe \
       $(BIN_DIR)rocot_utility.exe \
       $(BIN_DIR)rocot_check_mva.exe \
       $(BIN_DIR)test_dir_sun.exe \
       $(BIN_DIR)test_format.exe \
       $(BIN_DIR)test_day_in_week.exe \
       $(BIN_DIR)test_week.exe \
       $(BIN_DIR)co_mag_time.exe \
       $(BIN_DIR)latlon_to_xyz.exe \
       $(BIN_DIR)vdh_to_gse.exe \
       $(BIN_DIR)co_julday_table.exe \
       $(BIN_DIR)co_sunset.exe \
       $(BIN_DIR)co_seasons.exe \
       $(BIN_DIR)co_sunset_year.exe \
       $(BIN_DIR)test_modulo.exe 


# ========
# make all
# ========

# Creation de tous les executables et des link vers bin

all :  $(EXEC)

	@echo "-> Compilation done."
	@echo "-> Read lines above to check success."


# ===================================================
# Definition des dependances pour la creation des exe
# ===================================================

# Les objets sont pris dans $(OBJ_DIR), 
# Les executables sont mis dans $(BIN_DIR)
#
# On definit ici le nom de chaque cible (le .exe) et la liste
# de ses dependances.
# Ensuite, on lance le compilateur pour linker toutes les dependances
# (le $^) et fabriquer la cible (le $@ qui est l' .exe).

# _______________________________
$(BIN_DIR)rocot_check.exe :	     $(OBJ_DIR)rocot_check.o \
				    $(OBJ_DIR)rocotlib_V3p2.o
	$(FC) $(FLINK) $^ -o $@
# _______________________________
$(BIN_DIR)rocot_example.exe :	 $(OBJ_DIR)rocot_example.o \
				    $(OBJ_DIR)rocotlib_V3p2.o
	$(FC) $(FLINK) $^ -o $@
# _______________________________
$(BIN_DIR)rocot_info.exe :	     $(OBJ_DIR)rocot_info.o \
				    $(OBJ_DIR)rocotlib_V3p2.o
	$(FC) $(FLINK) $^ -o $@
# _______________________________
$(BIN_DIR)rocot_utility.exe :	 $(OBJ_DIR)rocot_utility.o \
				    $(OBJ_DIR)rocotlib_V3p2.o
	$(FC) $(FLINK) $^ -o $@
# _______________________________
$(BIN_DIR)rocot_check_mva.exe :	 $(OBJ_DIR)rocot_check_mva.o \
				    $(OBJ_DIR)rocotlib_V3p2.o
	$(FC) $(FLINK) $^ -o $@
# _______________________________
$(BIN_DIR)test_day_in_week.exe : $(OBJ_DIR)test_day_in_week.o \
				    $(OBJ_DIR)rocotlib_V3p2.o
	$(FC) $(FLINK) $^ -o $@
# _______________________________
$(BIN_DIR)test_week.exe :	     $(OBJ_DIR)test_week.o \
				    $(OBJ_DIR)rocotlib_V3p2.o
	$(FC) $(FLINK) $^ -o $@
# _______________________________
$(BIN_DIR)co_mag_time.exe :	     $(OBJ_DIR)co_mag_time.o \
				    $(OBJ_DIR)rocotlib_V3p2.o
	$(FC) $(FLINK) $^ -o $@
# _______________________________
$(BIN_DIR)latlon_to_xyz.exe :	 $(OBJ_DIR)latlon_to_xyz.o \
				    $(OBJ_DIR)rocotlib_V3p2.o
	$(FC) $(FLINK) $^ -o $@
# _______________________________
$(BIN_DIR)vdh_to_gse.exe :	     $(OBJ_DIR)vdh_to_gse.o \
				    $(OBJ_DIR)rocotlib_V3p2.o
	$(FC) $(FLINK) $^ -o $@
# _______________________________
$(BIN_DIR)co_julday_table.exe : 	$(OBJ_DIR)co_julday_table.o \
				    $(OBJ_DIR)rocotlib_V3p2.o
	$(FC) $(FLINK) $^ -o $@
# _______________________________
$(BIN_DIR)co_sunset.exe :	     $(OBJ_DIR)co_sunset.o \
				    $(OBJ_DIR)rocotlib_V3p2.o
	$(FC) $(FLINK) $^ -o $@
# _______________________________
$(BIN_DIR)co_seasons.exe :	     $(OBJ_DIR)co_seasons.o \
				    $(OBJ_DIR)rocotlib_V3p2.o
	$(FC) $(FLINK) $^ -o $@
# _______________________________
$(BIN_DIR)co_sunset_year.exe :	 $(OBJ_DIR)co_sunset_year.o \
				    $(OBJ_DIR)rocotlib_V3p2.o
	$(FC) $(FLINK) $^ -o $@
# _______________________________
$(BIN_DIR)test_modulo.exe :	     $(OBJ_DIR)test_modulo.o \
				    $(OBJ_DIR)rocotlib_V3p2.o
	$(FC) $(FLINK) $^ -o $@
# _______________________________
$(BIN_DIR)test_dir_sun.exe :	 $(OBJ_DIR)test_dir_sun.o  \
				    $(OBJ_DIR)rocotlib_V3p2.o
	$(FC) $(FLINK) $^ -o $@
# _______________________________
$(BIN_DIR)test_format.exe :	     $(OBJ_DIR)test_format.o 
	$(FC) $(FLINK) $^ -o $@
# _______________________________


# ==========================
# Compilation des librairies
# ==========================
 
# On definit ici le nom de chaque cible (le .o de chaque librairy) 
# et sa source (le .f)
# 
# Ensuite, on lance le compilateur pour compiler le source 
# (qui est la premiere dependance $<)
# et fabriquer la cible ("@" = l'objet .o)
# Attention: les librairies qui ne sont pas utilisees par les .exe
# ne seront pas compilees.

# _______________________________
$(OBJ_DIR)rocotlib_V3p2.o :            $(SRC_DIR)rocotlib_V3p2.f90
	  $(FC) $(FCOMP) $< -o $@
# _______________________________


# ==========================
# Compilation des programmes
# ==========================

# _______________________________
$(OBJ_DIR)rocot_check.o :           $(SRC_DIR)rocot_check.f90
	  $(FC) $(FCOMP) $< -o $@
# _______________________________
$(OBJ_DIR)rocot_example.o :         $(SRC_DIR)rocot_example.f90
	  $(FC) $(FCOMP) $< -o $@
# _______________________________
$(OBJ_DIR)rocot_info.o :            $(SRC_DIR)rocot_info.f90
	  $(FC) $(FCOMP) $< -o $@
# _______________________________
$(OBJ_DIR)rocot_utility.o :         $(SRC_DIR)rocot_utility.f90
	  $(FC) $(FCOMP) $< -o $@
# _______________________________
$(OBJ_DIR)test_day_in_week.o :      $(SRC_DIR)test_day_in_week.f90
	  $(FC) $(FCOMP) $< -o $@
# _______________________________
$(OBJ_DIR)test_week.o :             $(SRC_DIR)test_week.f90
	  $(FC) $(FCOMP) $< -o $@
# _______________________________
$(OBJ_DIR)co_mag_time.o :           $(SRC_DIR)co_mag_time.f90
	  $(FC) $(FCOMP) $< -o $@
# _______________________________
$(OBJ_DIR)latlon_to_xyz.o :         $(SRC_DIR)latlon_to_xyz.f90
	  $(FC) $(FCOMP) $< -o $@
# _______________________________
$(OBJ_DIR)vdh_to_gse.o :            $(SRC_DIR)vdh_to_gse.f90
	  $(FC) $(FCOMP) $< -o $@
# _______________________________
$(OBJ_DIR)co_julday_table.o :       $(SRC_DIR)co_julday_table.f90
	  $(FC) $(FCOMP) $< -o $@
# _______________________________
$(OBJ_DIR)co_sunset.o :             $(SRC_DIR)co_sunset.f90
	  $(FC) $(FCOMP) $< -o $@
# _______________________________
$(OBJ_DIR)co_seasons.o :            $(SRC_DIR)co_seasons.f90
	  $(FC) $(FCOMP) $< -o $@
# _______________________________
$(OBJ_DIR)co_sunset_year.o :        $(SRC_DIR)co_sunset_year.f90
	  $(FC) $(FCOMP) $< -o $@
# _______________________________
$(OBJ_DIR)test_modulo.o :           $(SRC_DIR)test_modulo.f90
	  $(FC) $(FCOMP) $< -o $@
# _______________________________
$(OBJ_DIR)test_dir_sun.o :          $(SRC_DIR)test_dir_sun.f90
	  $(FC) $(FCOMP) $< -o $@
# _______________________________
$(OBJ_DIR)test_format.o :           $(SRC_DIR)test_format.f90
	  $(FC) $(FCOMP) $< -o $@
# _______________________________
$(OBJ_DIR)rocot_check_mva.o :       $(SRC_DIR)rocot_check_mva.f90
	  $(FC) $(FCOMP) $< -o $@
# _______________________________

       
# ==========
# make clean
# ==========

# Efface les .exe et les .o de ./bin et ./obj
# Efface les .tmp, *.core, *.~
# Garde les .in, .out, .resu et .old

clean :
	@echo "*** Removing *.exe *.o, .tmp, *~, *.out & core files..."

	@find ./bin -name "*.exe"  -exec rm -f {}  \;
	@find ./obj -name "*.o"    -exec rm -f {}  \;
	@find ./out -name "*.out"  -exec rm -f {}  \;
	@find . -name ".tmp"       -exec rm -f {}  \;
	@find . -name "*~"         -exec rm -f {}  \;
	@find . -name "*core*"     -exec rm -f {}  \;

	@echo "*** Done."

#-----------------------------------------------------------------------
# End of Makefile
#-----------------------------------------------------------------------
