TGZUNPACK = tar xzf
PATCHPROG = patch -p0 

MKOCTFILE ?= mkoctfile

FFLAGS := $(shell $(MKOCTFILE) -p FFLAGS)
MKF77FILE = $(MKOCTFILE)

EXTERNALDIRS  = hairer cash daskr
EXTERNALPACKS = $(patsubst %, %.tgz,  $(EXTERNALDIRS))
EXTERNALDIFFS = $(patsubst %, %.diff, $(EXTERNALDIRS))

SOLVERSOURCES = odepkg_octsolver_mebdfdae.cc odepkg_octsolver_mebdfi.cc \
		odepkg_octsolver_ddaskr.cc \
		odepkg_octsolver_radau.cc odepkg_octsolver_radau5.cc \
		odepkg_octsolver_rodas.cc odepkg_octsolver_seulex.cc

SOLVERDEPENDS = odepkg_auxiliary_functions.cc

SOLVEREXTERNS = cash/mebdfdae.f cash/mebdfi.f \
		daskr/ddaskr.f daskr/dlinpk.f \
		hairer/decsol.f hairer/dc_decsol.f \
		hairer/radau.f hairer/radau5.f hairer/rodas.f hairer/seulex.f

SOLVERDEPENDSOBJ = $(patsubst %.cc, %.o, $(SOLVERDEPENDS))
SOLVERSOURCESOBJ = $(patsubst %.cc, %.o, $(SOLVERSOURCES))
SOLVEREXTERNSOBJ = $(patsubst %.f, %.o,  $(SOLVEREXTERNS))

SOLVEROBJECTS = $(SOLVERSOURCESOBJ) \
	 	$(SOLVERDEPENDSOBJ) \
		$(SOLVEREXTERNSOBJ) __taylor__.o

SOLVEROCTFILES = odekdi.oct odebda.oct odebdi.oct \
		ode2r.oct ode5r.oct oders.oct odesx.oct \
		__taylor__.oct 

%.o : %.f ; $(MKF77FILE) -c $< -o $@
%.o : %.cc ; $(MKOCTFILE) -c $< -o $@

all : $(SOLVEROCTFILES)


odekdi.oct : $(EXTERNALDIRS) $(SOLVEROBJECTS)
	$(MKOCTFILE) $(SOLVERDEPENDSOBJ) odepkg_octsolver_ddaskr.o \
	$(SOLVEREXTERNSOBJ) -o $@ $(shell $(MKOCTFILE) -p FLIBS) \
	$(shell $(MKOCTFILE) -p LAPACK_LIBS) \
	$(shell $(MKOCTFILE) -p BLAS_LIBS) \
	$(shell $(MKOCTFILE) -p LIBS)

odebda.oct : $(EXTERNALDIRS) $(SOLVEROBJECTS)
	$(MKOCTFILE) $(SOLVERDEPENDSOBJ) odepkg_octsolver_mebdfdae.o \
	$(SOLVEREXTERNSOBJ) -o $@ $(shell $(MKOCTFILE) -p FLIBS) \
	$(shell $(MKOCTFILE) -p LAPACK_LIBS) \
	$(shell $(MKOCTFILE) -p BLAS_LIBS) \
	$(shell $(MKOCTFILE) -p LIBS)

odebdi.oct : $(EXTERNALDIRS) $(SOLVEROBJECTS)
	$(MKOCTFILE) $(SOLVERDEPENDSOBJ) odepkg_octsolver_mebdfi.o \
	$(SOLVEREXTERNSOBJ) -o $@ $(shell $(MKOCTFILE) -p FLIBS) \
	$(shell $(MKOCTFILE) -p LAPACK_LIBS) \
	$(shell $(MKOCTFILE) -p BLAS_LIBS) \
	$(shell $(MKOCTFILE) -p LIBS)

ode2r.oct : $(EXTERNALDIRS) $(SOLVEROBJECTS)
	$(MKOCTFILE) $(SOLVERDEPENDSOBJ) odepkg_octsolver_radau.o \
	$(SOLVEREXTERNSOBJ) -o $@ $(shell $(MKOCTFILE) -p FLIBS) \
	$(shell $(MKOCTFILE) -p LAPACK_LIBS) \
	$(shell $(MKOCTFILE) -p BLAS_LIBS) \
	$(shell $(MKOCTFILE) -p LIBS)

ode5r.oct : $(EXTERNALDIRS) $(SOLVEROBJECTS)
	$(MKOCTFILE) $(SOLVERDEPENDSOBJ) odepkg_octsolver_radau5.o \
	$(SOLVEREXTERNSOBJ) -o $@ $(shell $(MKOCTFILE) -p FLIBS) \
	$(shell $(MKOCTFILE) -p LAPACK_LIBS) \
	$(shell $(MKOCTFILE) -p BLAS_LIBS) \
	$(shell $(MKOCTFILE) -p LIBS)

oders.oct : $(EXTERNALDIRS) $(SOLVEROBJECTS)
	$(MKOCTFILE) $(SOLVERDEPENDSOBJ) odepkg_octsolver_rodas.o \
	$(SOLVEREXTERNSOBJ) -o $@ $(shell $(MKOCTFILE) -p FLIBS) \
	$(shell $(MKOCTFILE) -p LAPACK_LIBS) \
	$(shell $(MKOCTFILE) -p BLAS_LIBS) \
	$(shell $(MKOCTFILE) -p LIBS)

odesx.oct : $(EXTERNALDIRS) $(SOLVEROBJECTS)
	$(MKOCTFILE) $(SOLVERDEPENDSOBJ) odepkg_octsolver_seulex.o \
	$(SOLVEREXTERNSOBJ) -o $@ $(shell $(MKOCTFILE) -p FLIBS) \
	$(shell $(MKOCTFILE) -p LAPACK_LIBS) \
	$(shell $(MKOCTFILE) -p BLAS_LIBS) \
	$(shell $(MKOCTFILE) -p LIBS)

__taylor__.oct : __taylor__.cc
	$(MKOCTFILE) __taylor__.cc


.NOTPARALLEL:
$(EXTERNALDIRS) :
	@for i in $(EXTERNALPACKS); do \
	  echo "Unpacking external packages: $$i"; \
	  $(TGZUNPACK) $$i; \
	done
	@for j in $(EXTERNALDIFFS); do \
	  echo "Applying patches from file: $$j"; \
	  $(PATCHPROG) < $$j; \
	done

clean :
	$(RM) -rf *~ $(EXTERNALDIRS) $(SOLVEROBJECTS)

distclean : clean
	$(RM) -rf $(SOLVEROCTFILES)

dist : all
