# 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)

# Variante der Cubecom-Bibliothek
archi = OMPI64

# Name eines oder mehrerer zu erzeugender ausfuehrbaren Programme
FPROGMPI = zeitf_mpi
CPROGMPI = zeitc_mpi

# Liste aller Objektfiles 

FOBJ = zeitf.o
COBJ = zeitc.o

# erste Target-Zeile (mit ':') gilt als Standard-Target (hier 'fzeit'), 
# sonst z.B.: 'make -f Make_zeit czeit' oder 'make -f Make_zeit clean', 
# die eigentlichen Aktionen stehen weiter unten 

fzeit :    $(FPROGMPI) 

czeit :    $(CPROGMPI) 

# wichtige Pfade:
SFB = /afs/tu-chemnitz.de/project/sfb393
MPILIBDIR  = $(SFB)/FEM/libs/$(archi)
INCDIR  = $(SFB)/FEM/libs/headers
FINCDIR  = $(SFB)/FEM/libs/include
FINCLUDE = include/trnet.inc

SFBLIBS = -lGraf -lMPIcubecom -lvbasmod -lTools
XLIB    = -lX11

# MPIHOME = /usr/local/lam-7.1.4
#MPIDIR  = $(MPIHOME)/lib/
#MPIBIN  = $(MPIHOME)/bin/
MPICUBE = -L$(MPILIBDIR) $(SFBLIBS) 

# Name des Fortran-Compilers (ggf. mit vollem Pfad):
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) -Wno-globals -fno-globals -ffast-math -fexpensive-optimizations  -fomit-frame-pointer
#

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

# Womit wird das Programm zusammengelinkt
LDMPI = $(FC)

# systemunabhängige Kommunikationsbibliothek


# zusätzliche Linker-Optionen
# z.B. Angabe zusätzlich benötigter Programmbibliotheken
LDFLAGS = $(MPICUBE) $(XLIB)
#


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


$(FPROGMPI):  $(FINCLUDE) $(FOBJ) 
	$(LDMPI) -o $@ $(FOBJ) $(LDFLAGS)
	-@echo "Programmstart mittels $(MPIBIN)mpirun:"
	-@echo "   mpirun -np <anzahl>  ./$(FPROGMPI)"

$(CPROGMPI):  $(COBJ)
	$(LDMPI) -o $@ $(COBJ) $(LDFLAGS)
	-@echo "Programmstart mittels $(MPIBIN)mpirun:"
	-@echo "   mpirun -np <anzahl>  ./$(CPROGMPI)"

# Bei Bedarf wird hier erst noch der symbolische Link angelegt, der
# zu Uebersetzen des Fortranprogramms benoetigt wird

$(FINCLUDE): $(FINCDIR)/trnet.inc
	ln -s $(FINCDIR) .

# 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 $(FPROGMPI) $(CPROGMPI) *.o
