########################################################################
# Makefile for eigenvalueprogram for multiple cusps
# 
########################################################################
#FDEB=-Ddebug=true -g
#FDEB= -g
COPT=-O2
CC=gcc
# Use G95 ** Recommended **
F90=g95 
# Use Gfortran - not fully supported because of some bugs in the last version of gfortran #
#F90=/home/fredrik/install/gfortran/irun/bin/gfortran
FC=$(F90)
# If we want to use lapack routines uncomment the following lines. Otherwise make sure he following four lines are out-commented
#LAPACK=-Duse_lapack=true
#LLAPACK=-llapack3e
#LAPACKLIB= -L/usr/local/lib/liblapack3e.a 
#LAPACKDIRS=-I/usr/local/lib/lapack3e -L/usr/local/lib/lapack3e
# Base installation directory, where you uzip the files
BASEDIR=/home/fredrik/Programming/Fortran/Projects/tmp/
# default directories for in and outdata
INDATADIR=$(BASEDIR)/maasswf-src/indata
OUTDATADIR=$(BASEDIR)/maasswf-src/outdata
## Change these if you want to put your library and module files somewhere else in the system
MODDIR=$(BASEDIR)/maasswf-src/include
OBJDIR=$(BASEDIR)/maasswf-src/lib
ifeq ($(strip $(FC)),g95)
	FORTOPTS=-cpp -r8 -ffixed-form -ftrace=full -fbounds-check -fzero -fmod=$(MODDIR) -Dindatadir=$(INDATADIR) -Doutdatadir=$(OUTDATADIR) -fimplicit-none
else
	FORTOPTS= -x f95-cpp-input -fdefault-real-8 -ffixed-form -Wsurprising -fimplicit-none -fbounds-check -frange-check -lgfortran -lm -J$(MODDIR) 
endif
ifeq ($(strip $(FC)),g95)
	FLDLIB=-lf95
else
	FLDLIB=-lgfortran
endif	
ifeq ($(strip $(FC)),g95)
	FORTLIB=/opt/g95/g95-install/lib/gcc-lib/i686-suse-linux-gnu/4.0.3/libf95.a 
else
	FORTLIB=/home/fredrik/install/gfortran/irun/lib/libgfortran.a
endif	
ifeq ($(strip $(FC)),g95)
	FORTML=/opt/g95/g95-install/lib/gcc-lib/i686-suse-linux-gnu/4.0.3
else
	FORTML=/home/fredrik/install/gfortran/irun/lib  
endif
ifeq ($(strip $(FC)),g95)
	LINKER=$(CC) $(CPPFLAGS)
else
	LINKER=$(FC)
endif
#	G95OPTS=-cpp -fmod=$(MODDIR) -ftrace=full -fbounds-check -
##-Wall
LIBS=\
$(FORTLIB) \
$(OBJDIR)/libspecfn.a \
$(OBJDIR)/libmaass.a \
$(OBJDIR)/libcommon.a \
$(LAPACKLIB) 

MODLIBS= \
-L/usr/local/lib/ \
-L$(FORTML) \
-L$(BASEDIR)/lib/ \
-I$(MODDIR) \
-L$(OBJDIR) \
$(LAPACKDIRS)

#
FLAGS= ${FDEB} ${OPT} ${FORTOPTS} ${LAPACK}
FFLAGS=${FLAGS}  $(MODLIBS) 
CDLIBS= $(LIBS) $(MODLIBS) 
CPPFLAGS= $(COPT) ${CDEB} 
# %.o : %.mod
.SUFFIXES:   
.SUFFIXES: .o .f90 .f .mod
SPECDIR=./specfns/
AUXDIR= ./auxiliary/
COREDIR=./core/
EXTRADIR=./extras/
SPECFOBJ= _whittaker.o _confluent.o  _kbessel.o
SPECFSRC= _whittaker.f _confluent.f  _kbessel.f 
AUXOBJ  =_numtheory.o _matrix.o  _groups.o _interpolation.o _characters.o
AUXSRC  =_numtheory.f _matrix.f  _groups.f _interpolation.f _characters.f  
COREOBJ=   _pullback.o _system.o _sys_solve.o _coefficients.o _newton.o _phase2.o
CORESRC=   _pullback.f _system.f _sys_solve.f _coefficients.f _newton.f _phase2.f
EXTRAOBJ= _find_evs.o _grafik.o _interf_to_cpp.o
EXTRASRC= _find_evs.f _grafik.f _interf_to_cpp.f
MAASSOBJ = $(SPECOBJ) $(AUXOBJ) $(COREOBJ) $(EXTRAOBJ)
LDLIBS=  -static -lspecfn $(LLAPACK) -lmaass -larprec -lcommon $(FLDLIB) -lm $(LLAPACK) 
LDFLAGS=$(LDLIBS) 
CP=/bin/cp
TEST=/usr/bin/test
export LDLIBS FFLAGS F90 FC PREC 
export CC CPPFLAGS CDLIBS LDLIBS
export BASEDIR MODDIR OBJDIR
export SPECFSRC AUXSRC CORESRC EXTRASRC
export SPECFOBJ AUXOBJ COREOBJ  EXTRAOBJ
export CP TEST

.f:lib
	$(F90) $(FFLAGS) $(PREC) -c -o $@.o $@.f 
#|| rm -f $@.o
	$(LINKER)  -o $@ $@.o $(CDLIBS) $(LDLIBS) 
#|| rm -f $@.o 
#	$(CC) $(CPPFLAGS) -o $@ $@.o $(CDLIBS) $(LDLIBS) || rm -f $@.o 
	-rm $@.o
.f90:lib
	$(F90) $(FFLAGS) $(PREC) -c -o $@.o $@.f90
	$(LINKER) $(CPPFLAGS) -o $@ $@.o $(CDLIBS) $(LDLIBS)
	-rm $@.o
.o:
	$(F90) $(FFLAGS) $(PREC) -c  $<
all: 
	make commonvariables.o
	cd $(SPECDIR); make all 
	cd $(AUXDIR);  make all 
	cd $(COREDIR);  make all 
	cd $(EXTRADIR);  make all 
install: 
	make commonvariables.o
	-$(TEST) -e commonvariables.o && $(CP) commonvariables.o $(OBJDIR)
	cd $(SPECDIR) && $(MAKE) install 
	cd $(AUXDIR)  &&  $(MAKE) install
	-/bin/cp $(AUXDIR)/*.o $(OBJDIR)
	-/bin/mv $(AUXDIR)/*.mod $(MODDIR)
	cd $(COREDIR) &&  $(MAKE) install
	-/bin/cp $(COREDIR)/*.o $(OBJDIR)
	-/bin/mv $(COREDIR)/*.mod $(MODDIR)
	cd $(EXTRADIR) && $(MAKE) install
	-/bin/cp $(EXTRADIR)/*.o $(OBJDIR)
	-/bin/mv $(EXTRADIR)/*.mod $(MODDIR)
	-cd $(OBJDIR);	ar cru libmaass.a $(MAASSOBJ); ranlib libmaass.a
	-cd $(OBJDIR);	ar cru libcommon.a commonvariables.o; ranlib libcommon.a
clean: 
#	-$(TEST) -e *.o && /bin/rm -f *.o
#	-$(TEST) -e */*.o && /bin/rm -f */*.o
	-/bin/rm -f *.o
	-/bin/rm -f */*.o
	-/bin/rm -f $(OBJDIR)/*.o
maasswf: install maasswf.f

.DELETE_ON_ERROR: 
.PHONY: clean all lib install
