##############################################################
#  Structured Markov Chains Solver       [  SMCSolver  ]     #
#  Dario Bini, Beatrice Meini, Sergio Steffe'                #
#  bini@dm.unipi.it, meini@dm.unipi.it, steffe@dm.unipi.it   #
#  Dipartimento di Matematica "Leonida Tonelli"              # 
#  Largo Pontecorvo 5                                        #  
#  56127 Pisa                                                # 
#  Italy                                                     # 
#  Version 2.1 - June  2009                                  #
##############################################################
# 
#    Makefile 
# 
##############################################################
#
#
include ./make.inc
#
#
# Fortran compilation of included minumus set of BLAS, LAPACK and LAPACK95 routines 
#
#
#   gtk include and libs are found with pkg-config command
#
GTKINCLUDE=`pkg-config --cflags gtk+-2.0`
GTKLIBS=`pkg-config --libs gtk+-2.0`
#
#   add the treads libraries and ncurses
LIBS=${GTKLIBS} -lgthread-2.0 -lncurses -lrt
INCLUDE=${GTKINCLUDE}
#
PMOD = fft_interface.mod  fi_int.mod  is_int.mod  pi_int.mod  ponte_f_f.mod \
	 pwcr_interface.mod  roots.mod  schur_interface.mod  smc_int.mod  smc_tools.mod
#   Now the dependency tree for the compilation in C and Fortran
#   The main program must be linked by Fortran Compiler, the order of terms is important

SMCSolver:  $(BLASLIB) $(LAPACKLIB) $(LAPACK95LIB) main.o callbacks.o interface.o help.o rw.o padwrite.o examples.o edit_a.o edit_b.o view_mat.o view_pi.o ponte.o futils.o examplesf.o smc_int.o  pwcr_int.o fft_int.o pi_int.o is_int.o pwcr_fft.o  smc_sub.o pwcr_sub.o  fi_int.o fi_sub.o  is_sub.o pi_sub.o fcalls.o .SMCSolverrc
	$(FF) ${FFLAGSM} ${INCLUDE} -o SMCSolver main.o callbacks.o interface.o help.o rw.o padwrite.o examples.o edit_a.o edit_b.o view_mat.o view_pi.o ponte.o futils.o examplesf.o smc_int.o smc_sub.o  pwcr_int.o pi_int.o fft_int.o is_int.o pwcr_fft.o pwcr_sub.o  fi_int.o fi_sub.o  is_sub.o pi_sub.o fcalls.o  ${LIBS} ${FFLIBS}

main.o: main.c 	structures.h main.h 
	$(CC) ${CFLAGS} ${INCLUDE} ${LAHEY} -c main.c

callbacks.o: callbacks.c structures.h callbacks.h
	$(CC) ${CFLAGS} ${INCLUDE}  -c  callbacks.c

interface.o: interface.c structures.h interface.h examples.h
	$(CC) ${CFLAGS} ${INCLUDE}  -c  interface.c

help.o: help.c structures.h help.h doc.h
	$(CC) ${CFLAGS} ${INCLUDE}  -c  help.c

rw.o: rw.c structures.h callbacks.h interface.h
	$(CC) ${CFLAGS} ${INCLUDE}  -c rw.c

padwrite.o: padwrite.c structures.h padwrite.h
	$(CC) ${CFLAGS} ${INCLUDE}  -c padwrite.c

examples.o: examples.c structures.h examples.h
	$(CC) ${CFLAGS} ${INCLUDE}  -c examples.c

edit_a.o: edit_a.c structures.h edit_a.h
	$(CC) ${CFLAGS} ${INCLUDE}  -c edit_a.c

edit_b.o: edit_b.c structures.h edit_b.h
	$(CC) ${CFLAGS} ${INCLUDE}  -c edit_b.c

view_mat.o: view_mat.c structures.h view_mat.h
	$(CC) ${CFLAGS} ${INCLUDE}  -c view_mat.c

view_pi.o: view_pi.c structures.h view_pi.h
	$(CC) ${CFLAGS} ${INCLUDE}  -c view_pi.c

ponte.o ponte_f_f.mod smc_tools.mod: ponte.f90 
	$(FF) $(FFLAGSG)  ${NOSECOND} -c ponte.f90

examplesf.o: examplesf.f90 ponte_f_f.mod
	$(FF) $(FFLAGSG)  ${NOSECOND} -c examplesf.f90

true_print.o: true_print.f90 ponte_f_f.mod
	$(FF) $(FFLAGSG)  ${NOSECOND} -c true_print.f90

smc_int.o smc_int.mod: Fortran/smc_int.f90 
	 $(FF)  $(FFLAGSG)  -c Fortran/smc_int.f90

pwcr_int.o pwcr_interface.mod  schur_interface.mod : Fortran/pwcr_int.f90
	$(FF) $(FFLAGSG)  -c Fortran/pwcr_int.f90

fft_int.o roots.mod fft_interface.mod : Fortran/fft_int.f90 
	$(FF) $(FFLAGSG)  -c Fortran/fft_int.f90

pi_int.o pi_int.mod :Fortran/pi_int.f90
	$(FF) $(FFLAGSG)  -c Fortran/pi_int.f90

smc_sub.o: Fortran/smc_sub.f90 smc_int.mod smc_tools.mod  ponte_f_f.mod is_int.mod $(LAPACKMOD)
	$(FF) $(FFLAGSG) ${FFLIBS} -c Fortran/smc_sub.f90

is_int.o is_int.mod :Fortran/is_int.f90
	$(FF)  -c Fortran/is_int.f90

pwcr_fft.o: Fortran/pwcr_fft.f90 smc_tools.mod roots.mod
	$(FF) $(FFLAGSG) ${FFLIBS} -c Fortran/pwcr_fft.f90

pwcr_sub.o: Fortran/pwcr_sub.f90 smc_int.mod smc_tools.mod  pwcr_interface.mod schur_interface.mod is_int.mod roots.mod ponte_f_f.mod $(LAPACKMOD)
	$(FF) ${FFLIBS} -c Fortran/pwcr_sub.f90

fi_int.o fi_int.mod :Fortran/fi_int.f90
	$(FF)  -c Fortran/fi_int.f90

fi_sub.o:Fortran/fi_sub.f90 ponte_f_f.mod smc_tools.mod smc_int.mod fi_int.mod is_int.mod $(LAPACKMOD)
	$(FF) ${FFLIBS} -c Fortran/fi_sub.f90

is_sub.o:Fortran/is_sub.f90 smc_tools.mod smc_int.mod fi_int.mod is_int.mod ponte_f_f.mod $(LAPACKMOD)
	$(FF) ${FFLIBS} -c Fortran/is_sub.f90

pi_sub.o:Fortran/pi_sub.f90 smc_tools.mod smc_int.mod ponte_f_f.mod $(LAPACKMOD)
	$(FF) ${FFLIBS} -c Fortran/pi_sub.f90

fcalls.o: fcalls.f90 smc_tools.mod smc_int.mod ponte_f_f.mod  fi_int.mod pwcr_interface.mod is_int.mod pi_int.mod
	$(FF) $(FFLAGSG)  ${NOSECOND} -c fcalls.f90

futils.o: futils.f90 ponte_f_f.mod
	$(FF) $(FFLAGSG) ${FFLIBS} ${NOSECOND} -c futils.f90

test-lib.o: test-lib.f90 smc_tools.mod smc_int.mod ponte_f_f.mod  fi_int.mod pwcr_interface.mod is_int.mod pi_int.mod
	$(FF) $(FFLAGSG) ${FFLIBS} ${NOSECOND} -c test-lib.f90

blas $(BLASLIB): 
	(cd min_blas_lapack/blas;  $(MAKE) blas)

lapack $(LAPACKLIB): 
	(cd min_blas_lapack/lapack; $(MAKE) lapack)

lapack95 $(LAPACK95LIB) $(LAPACKMOD) :
	(cd min_blas_lapack/lapack95;  $(MAKE) lapack95)

libsmcsolver.a:   ponte.o smc_int.o smc_sub.o pwcr_int.o pwcr_sub.o fft_int.o \
	pi_int.o pi_sub.o is_int.o is_sub.o pwcr_fft.o pwcr_sub.o fi_int.o \
	fi_sub.o is_sub.o pi_sub.o  true_print.o $(PMOD)
	rm -f libsmcsolver.a
	ar cr libsmcsolver.a ponte.o smc_int.o smc_sub.o pwcr_int.o pwcr_sub.o \
	fft_int.o pi_int.o pi_sub.o is_int.o is_sub.o pwcr_fft.o pwcr_sub.o \
	fi_int.o fi_sub.o is_sub.o pi_sub.o  true_print.o

.SMCSolverrc:	.SMCSolverrc-10	
	sed s%LOCATIO%`pwd`% .SMCSolverrc.default > .SMCSolverrc

test-lib: libsmcsolver.a test-lib.o $(BLASLIB) $(LAPACKLIB) $(LAPACK95LIB)
	$(FF) ${FFLAGSM} ${INCLUDE} -o test-lib test-lib.o libsmcsolver.a  ${FFLIBS}	

clean:
	rm -f SMCSolver  main.o callbacks.o interface.o help.o rw.o padwrite.o examples.o edit_a.o edit_b.o \
	view_mat.o view_pi.o ponte.o examplesf.o smc_int.o pwcr_int.o fft_int.o smc_sub.o pwcr_fft.o pwcr_sub.o \
	fcalls.o fi_int.o is_int.o fi_sub.o is_sub.o pi_int.o pi_sub.o fft_interface.mod  ponte_f_f.mod  \
	pwcr_interface.mod  roots.mod  schur_interface.mod  smc_int.mod  smc_tools.mod  fi_int.mod  \
	is_int.mod pi_int.mod true_print.o test-lib.o futils.o test-lib .SMCSolverrc

cleanlib:
	(cd min_blas_lapack/blas; $(MAKE) clean )
	(cd min_blas_lapack/lapack; $(MAKE) clean )
	(cd min_blas_lapack/lapack95; $(MAKE) clean)
	rm -f libsmcsolver.a

cleanall: clean cleanlib
	
dist: cleanall
	cp make.inc.default make.inc
	date>TIMESTAMP; 
	cd ..; tar czvf SMCSolver_2.1-$(DATESTRING).tgz ./SMCSolver_2.1

