# Beispiel eines Makefiles
# ------------------------
# Vorteil bei Verwendung solcher Makefiles: 
#    man tippt nur noch 'make' ein und das Programm mit allen 
#    Unterprogrammen wird automatisch übersetzt und zwar nur
#    die Teile, die seit dem letzten Mal geändert wurden.

# Zeilen mit # sind Kommentar
# Man definiert sich einige Variable (=Zeichenketten)

# Name eines oder mehrerer zu erzeugender ausfuehrbaren Programme
MPIFPROG = hellof_mpi
MPICPROG = helloc_mpi

# Liste aller Objektfiles 
# ERLÄUTERUNG:
#   Wird ein gleichnamiges File mit Endung .c gefunden, so tritt
#   die Regel '.c.o' in Kraft (siehe unten). 
#   Gibt es die Datei mit Endung .f, tritt Regel '.f.o' in Kraft
#   Wenn beide Quellen existieren, wird die C-Quelle verwendet.

MPIFOBJ = hellof_mpi.o
MPICOBJ = helloc_mpi.o

# erste Target-Zeile (mit ':') gilt als Standard-Target, 
# sonst: 'make -f Make_mpi mpif' oder 'make -f Make_mpi mpic', 
# die eigentlichen Aktionen stehen weiter unten 

mpi MPI : mpif mpic

mpif MPIF : $(MPIFPROG)

mpic MPIC : $(MPICPROG)

# wichtige Pfade:

MPIHOME = /usr/local/openmpi
MPIDIR  = $(MPIHOME)/lib/
MPIBIN  = $(MPIHOME)/bin/

# Name des Fortran-Compilers ( ggf. mit vollem Pfad $(MPIBIN)/mpif77 ):
FC = mpif77

# Name des C-Compilers
CC = mpicc

# Fortran-Compiler-Optionen (hier keine)
FFLAGS =
# oder aber z.B. allerlei Optimierungsflags
#CPU = i686
#FFLAGS = -O2 -mcpu=$(CPU) -ffast-math -fexpensive-optimizations -fomit-frame-pointer

# C-Compiler-Optionen
CFLAGS = -DUNDER 
# oder z.B.
#CFLAGS = -DUNDER -O2 -mcpu=$(CPU) -ffast-math -fexpensive-optimizations -fomit-frame-pointer 

# Womit wird das Programm zusammengelinkt
LDMPI = $(MPIHOME)/bin/mpif77

# zusätzliche Linker-Optionen (hier keine)
LDFLAGS =
# oder z.B. Angabe zusätzlich benötigter Programmbibliotheken


# Definition der Aktionen
# WICHTIG:  Einrückung durch Tabulator, nicht Leerzeichen

$(MPIFPROG):  $(MPIFOBJ)
	$(LDMPI) -o $@ $(MPIFOBJ) $(LDFLAGS)
	-@echo "Programmstart mittels $(MPIBIN)mpirun:"
	-@echo "   mpirun -np <anzahl>  ./$(MPIFPROG)"
	-@echo "oder"
	-@echo "   mpirun N ./$(MPIFPROG)"

$(MPICPROG):  $(MPICOBJ)
	$(LDMPI) -o $@ $(MPICOBJ) $(LDFLAGS)
	-@echo "Programmstart mittels $(MPIBIN)mpirun:"
	-@echo "   mpirun -np <anzahl>  ./$(MPICPROG)"
	-@echo "oder"
	-@echo "   mpirun N ./$(MPICPROG)"

# Standardregeln zum Erzeugen bestimmter Files
#  ".f.o" definiert, was zu tun ist, wenn ein .o-File
# gebraucht wird, und ein gleichnamiges File mit der
# Endung .f vorhanden ist.

.SUFFIXES: .c .f .o

.f.o:
	$(FC) -c $(FFLAGS) $<
.c.o:
	$(CC) -c $(CFLAGS) $<

# Oft möchte man eine einfache Möglichkeit haben, ein
# Verzeichnis wieder aufzuräumen - das geht z.B. mit 
# "make clean"

clean:
	rm -f $(MPIFPROG) $(MPICPROG) *.o
