#-----------------------------------------------------------------------
# Makefile for rocotlib and associated programs
# P. Robert, ScientiDev, February 2020
#-----------------------------------------------------------------------


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

 FC = gcc

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

#MODE=O
 MODE=D

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


# Compilateur Linux gcc
ifeq ($(FC),gcc)
    ifeq ($(MODE),D)
      FCOMP = -c -fbounds-check  -Wall 
      LDFLAGS= -Wl,--no-undefined  
    else
      FCOMP = -c
      LDFLAGS= -Wl,--no-undefined 
    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) $(LDFLAGS) $^   -lm -lf2c  -o $@
# _______________________________
$(BIN_DIR)rocot_example.exe :	 	$(OBJ_DIR)rocot_example.o \
									$(OBJ_DIR)rocotlib_V3p2.o 
									$(FC) $(LDFLAGS) $^   -lm -lf2c  -o $@
# _______________________________
$(BIN_DIR)rocot_info.exe :	     	$(OBJ_DIR)rocot_info.o \
									$(OBJ_DIR)rocotlib_V3p2.o 
									$(FC) $(LDFLAGS) $^   -lm -lf2c  -o $@
# _______________________________
$(BIN_DIR)rocot_utility.exe :	 	$(OBJ_DIR)rocot_utility.o \
									$(OBJ_DIR)rocotlib_V3p2.o 
									$(FC) $(LDFLAGS) $^   -lm -lf2c  -o $@
# _______________________________
$(BIN_DIR)rocot_check_mva.exe :	 	$(OBJ_DIR)rocot_check_mva.o \
									$(OBJ_DIR)rocotlib_V3p2.o 
									$(FC) $(LDFLAGS) $^   -lm -lf2c  -o $@
# _______________________________
$(BIN_DIR)test_day_in_week.exe : 	$(OBJ_DIR)test_day_in_week.o \
									$(OBJ_DIR)rocotlib_V3p2.o 
									$(FC) $(LDFLAGS) $^   -lm -lf2c  -o $@
# _______________________________
$(BIN_DIR)test_week.exe :	    	$(OBJ_DIR)test_week.o \
									$(OBJ_DIR)rocotlib_V3p2.o 
									$(FC) $(LDFLAGS) $^   -lm -lf2c  -o $@
# _______________________________
$(BIN_DIR)co_mag_time.exe :	    	$(OBJ_DIR)co_mag_time.o \
									$(OBJ_DIR)rocotlib_V3p2.o 
									$(FC) $(LDFLAGS) $^   -lm -lf2c  -o $@
# _______________________________
$(BIN_DIR)latlon_to_xyz.exe :	    $(OBJ_DIR)latlon_to_xyz.o \
									$(OBJ_DIR)rocotlib_V3p2.o 
									$(FC) $(LDFLAGS) $^   -lm -lf2c  -o $@
# _______________________________
$(BIN_DIR)vdh_to_gse.exe :	    	$(OBJ_DIR)vdh_to_gse.o \
									$(OBJ_DIR)rocotlib_V3p2.o 
									$(FC) $(LDFLAGS) $^   -lm -lf2c  -o $@
# _______________________________
$(BIN_DIR)co_julday_table.exe :	    $(OBJ_DIR)co_julday_table.o \
									$(OBJ_DIR)rocotlib_V3p2.o 
									$(FC) $(LDFLAGS) $^   -lm -lf2c  -o $@
# _______________________________
$(BIN_DIR)co_sunset.exe :	    	$(OBJ_DIR)co_sunset.o \
									$(OBJ_DIR)rocotlib_V3p2.o 
									$(FC) $(LDFLAGS) $^ -lm -lf2c -o $@
# _______________________________
$(BIN_DIR)co_seasons.exe :	    	$(OBJ_DIR)co_seasons.o \
									$(OBJ_DIR)rocotlib_V3p2.o 
									$(FC) $(LDFLAGS) $^ -lm -lf2c -o $@
# _______________________________
$(BIN_DIR)co_sunset_year.exe :	    $(OBJ_DIR)co_sunset_year.o \
									$(OBJ_DIR)rocotlib_V3p2.o 
									$(FC) $(LDFLAGS) $^ -lm -lf2c -o $@
# _______________________________
$(BIN_DIR)test_modulo.exe :	    	$(OBJ_DIR)test_modulo.o \
									$(OBJ_DIR)rocotlib_V3p2.o 
									$(FC) $(LDFLAGS) $^ -lm -lf2c -o $@
# _______________________________
$(BIN_DIR)test_dir_sun.exe :	    $(OBJ_DIR)test_dir_sun.o  \
									$(OBJ_DIR)rocotlib_V3p2.o 
									$(FC) $(LDFLAGS) $^ -lm -lf2c -o $@
# _______________________________
$(BIN_DIR)test_format.exe :	    	$(OBJ_DIR)test_format.o 
									$(FC) $(LDFLAGS) $^  -lm -lf2c -o $@
# _______________________________


# ==========================
# Compilation des librairies
# ==========================
 
# On definit ici le nom de chaque cible (le .o de chaque librairy) 
# et sa source (le .c)
# 
# 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.c
	  $(FC) $(FCOMP) $< -o $@
# _______________________________


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

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