# Assuming that the headers are in /usr/include/openblas and the
# libraries are in /usr/lib64, build using make -f makefile.openblas

# Code that uses the library (e.g. prog.cpp) is compiled using
# g++ -c -I/usr/local/lib/libscl/cblas prog.cpp
# g++ -o prog prog.o -L/usr/local/lib/libscl/cblas -lsclcb -lm -lopenblas
# The ordering of these libraries is important.
        
# To use a cblas other than openblas, edit makefile.openblas appropriately.

CXX      = g++
SDIR     = ../src
CXXFLAGS = -O2 -c -Wall -I/usr/include/openblas -I./ -DUSE_CBLAS

OBJECTS  = sclerror.o intvec.o realmat.o kronprd.o \
		hermite.o dcnd.o dgmpnt.o heapsort.o \
		dsolve.o dsweep.o dginv.o hquad.o edf.o edfobj.o \
		dsvd.o dpsdsol.o psdsol.o gchirv.o ran.o pnorm.o \
		solve.o starbox.o unsk.o svd.o gammln.o \
		nleqns.o nlsolve.o iran.o poly.o fmt.o linesrch.o \
		nlopt.o cutstr.o dgmprd.o dgmcpy.o vecstrbuf.o \
		eigen.o quantreg.o gaussq.o nlroot.o multi.o \
		csvread.o istype.o eatwhite.o futil.o julian.o \
		cholesky.o mvn.o stopwatch.o gmm.o particles.o

HEADER0 = scltypes.h sclerror.h sclfuncs.h
HEADER1 = $(HEADER0) intvec.h realmat.h libscl.h
HEADER2 = $(HEADER1) particles.h

libsclcb.a	: $(OBJECTS)
	rm -f libsclcb.a
	ar -rsv libsclcb.a $(OBJECTS)

scltypes.h		: $(SDIR)/scltypes.tpl
	(cd $(SDIR) ; make)
	cp $(SDIR)/scltypes.gpp scltypes.h

sclerror.h	: $(SDIR)/sclerror.h
	cp $(SDIR)/sclerror.h sclerror.h

sclfuncs.h		: $(SDIR)/sclfuncs.h scltypes.h sclerror.h 
	cp $(SDIR)/sclfuncs.h sclfuncs.h

intvec.h	: $(SDIR)/intvec.h scltypes.h sclerror.h sclfuncs.h 
	cp $(SDIR)/intvec.h intvec.h

realmat.h	: $(SDIR)/realmat.h scltypes.h sclerror.h sclfuncs.h \
		  intvec.h
	cp $(SDIR)/realmat.h realmat.h

kronprd.h	: $(SDIR)/kronprd.h scltypes.h sclerror.h sclfuncs.h \
		  intvec.h realmat.h
	cp $(SDIR)/kronprd.h kronprd.h

vclmat.h	: $(SDIR)/vclmat.h scltypes.h sclerror.h sclfuncs.h \
		  intvec.h realmat.h
	cp $(SDIR)/vclmat.h vclmat.h

particles.h	: $(SDIR)/particles.h scltypes.h sclerror.h sclfuncs.h \
		  intvec.h realmat.h
	cp $(SDIR)/particles.h particles.h

libscl.h	: $(SDIR)/libscl.h scltypes.h sclerror.h sclfuncs.h \
		  intvec.h realmat.h kronprd.h vclmat.h
	cp $(SDIR)/libscl.h libscl.h

sclerror.o	: $(SDIR)/sclerror.cpp scltypes.h sclerror.h
	$(CXX) $(CXXFLAGS)  $(SDIR)/sclerror.cpp

intvec.o	: $(SDIR)/intvec.cpp scltypes.h sclerror.h sclfuncs.h intvec.h 
	$(CXX) $(CXXFLAGS)  $(SDIR)/intvec.cpp

realmat.o	: $(SDIR)/realmat.cpp scltypes.h sclerror.h sclfuncs.h \
		  intvec.h realmat.h 
	$(CXX) $(CXXFLAGS)  $(SDIR)/realmat.cpp

kronprd.o	: $(SDIR)/kronprd.cpp scltypes.h sclerror.h sclfuncs.h \
		  intvec.h realmat.h kronprd.h
	$(CXX) $(CXXFLAGS)  $(SDIR)/kronprd.cpp

hermite.o	: $(SDIR)/hermite.cpp $(HEADER0)
	$(CXX) $(CXXFLAGS)  $(SDIR)/hermite.cpp

dcnd.o	: $(SDIR)/dcnd.cpp $(HEADER0)
	$(CXX) $(CXXFLAGS)  $(SDIR)/dcnd.cpp

dgmpnt.o	: $(SDIR)/dgmpnt.cpp $(HEADER0)
	$(CXX) $(CXXFLAGS)  $(SDIR)/dgmpnt.cpp

heapsort.o	: $(SDIR)/heapsort.cpp $(HEADER0)
	$(CXX) $(CXXFLAGS)  $(SDIR)/heapsort.cpp

dsolve.o	: $(SDIR)/dsolve.cpp $(HEADER0)
	$(CXX) $(CXXFLAGS)  $(SDIR)/dsolve.cpp

dpsdsol.o	: $(SDIR)/dpsdsol.cpp $(HEADER0)
	$(CXX) $(CXXFLAGS)  $(SDIR)/dpsdsol.cpp

dsweep.o	: $(SDIR)/dsweep.cpp $(HEADER0)
	$(CXX) $(CXXFLAGS)  $(SDIR)/dsweep.cpp

dginv.o	: $(SDIR)/dginv.cpp $(HEADER0)
	$(CXX) $(CXXFLAGS)  $(SDIR)/dginv.cpp

dsvd.o	: $(SDIR)/dsvd.cpp $(HEADER0)
	$(CXX) $(CXXFLAGS)  $(SDIR)/dsvd.cpp

gammln.o	: $(SDIR)/gammln.cpp $(HEADER0)
	$(CXX) $(CXXFLAGS)  $(SDIR)/gammln.cpp

gchirv.o	: $(SDIR)/gchirv.cpp $(HEADER0)
	$(CXX) $(CXXFLAGS)  $(SDIR)/gchirv.cpp

ran.o	: $(SDIR)/ran.cpp $(HEADER0)
	$(CXX) $(CXXFLAGS)  $(SDIR)/ran.cpp

pnorm.o	: $(SDIR)/pnorm.cpp $(HEADER0)
	$(CXX) $(CXXFLAGS)  $(SDIR)/pnorm.cpp

hquad.o	: $(SDIR)/hquad.cpp $(HEADER1)
	$(CXX) $(CXXFLAGS)  $(SDIR)/hquad.cpp

edf.o	: $(SDIR)/edf.cpp $(HEADER1)
	$(CXX) $(CXXFLAGS)  $(SDIR)/edf.cpp

edfobj.o	: $(SDIR)/edfobj.cpp $(HEADER1)
	$(CXX) $(CXXFLAGS)  $(SDIR)/edfobj.cpp

solve.o	: $(SDIR)/solve.cpp $(HEADER1)
	$(CXX) $(CXXFLAGS)  $(SDIR)/solve.cpp

psdsol.o	: $(SDIR)/psdsol.cpp $(HEADER1)
	$(CXX) $(CXXFLAGS)  $(SDIR)/psdsol.cpp

starbox.o	: $(SDIR)/starbox.cpp $(HEADER0)
	$(CXX) $(CXXFLAGS)  $(SDIR)/starbox.cpp

unsk.o	: $(SDIR)/unsk.cpp $(HEADER0)
	$(CXX) $(CXXFLAGS)  $(SDIR)/unsk.cpp

svd.o	: $(SDIR)/svd.cpp $(HEADER1)
	$(CXX) $(CXXFLAGS)  $(SDIR)/svd.cpp

nleqns.o	: $(SDIR)/nleqns.cpp $(HEADER0)
	$(CXX) $(CXXFLAGS)  $(SDIR)/nleqns.cpp

nlsolve.o	: $(SDIR)/nlsolve.cpp $(HEADER0)
	$(CXX) $(CXXFLAGS)  $(SDIR)/nlsolve.cpp

iran.o	: $(SDIR)/iran.cpp $(HEADER0)
	$(CXX) $(CXXFLAGS)  $(SDIR)/iran.cpp

poly.o	: $(SDIR)/poly.cpp $(HEADER1)
	$(CXX) $(CXXFLAGS)  $(SDIR)/poly.cpp

fmt.o   : $(SDIR)/fmt.cpp $(HEADER0)
	$(CXX) $(CXXFLAGS)  $(SDIR)/fmt.cpp

linesrch.o   : $(SDIR)/linesrch.cpp $(HEADER1)
	$(CXX) $(CXXFLAGS)  $(SDIR)/linesrch.cpp

nlopt.o   : $(SDIR)/nlopt.cpp $(HEADER1)
	$(CXX) $(CXXFLAGS)  $(SDIR)/nlopt.cpp

cutstr.o   : $(SDIR)/cutstr.cpp $(HEADER0)
	$(CXX) $(CXXFLAGS)  $(SDIR)/cutstr.cpp

dgmprd.o   : $(SDIR)/dgmprd.cpp $(HEADER1)
	$(CXX) $(CXXFLAGS)  $(SDIR)/dgmprd.cpp

dgmcpy.o   : $(SDIR)/dgmcpy.cpp $(HEADER1)
	$(CXX) $(CXXFLAGS)  $(SDIR)/dgmcpy.cpp

vecstrbuf.o   : $(SDIR)/vecstrbuf.cpp $(HEADER0)
	$(CXX) $(CXXFLAGS)  $(SDIR)/vecstrbuf.cpp

eigen.o   : $(SDIR)/eigen.cpp $(HEADER1)
	$(CXX) $(CXXFLAGS)  $(SDIR)/eigen.cpp

quantreg.o   : $(SDIR)/quantreg.cpp $(HEADER1)
	$(CXX) $(CXXFLAGS)  $(SDIR)/quantreg.cpp

gaussq.o   : $(SDIR)/gaussq.cpp $(HEADER1)
	$(CXX) $(CXXFLAGS)  $(SDIR)/gaussq.cpp

nlroot.o   : $(SDIR)/nlroot.cpp $(HEADER0)
	$(CXX) $(CXXFLAGS)  $(SDIR)/nlroot.cpp

multi.o   : $(SDIR)/multi.cpp $(HEADER1)
	$(CXX) $(CXXFLAGS)  $(SDIR)/multi.cpp

csvread.o	: $(SDIR)/csvread.cpp $(HEADER1)
	$(CXX) $(CXXFLAGS)  $(SDIR)/csvread.cpp

istype.o	: $(SDIR)/istype.cpp $(HEADER0)
	$(CXX) $(CXXFLAGS)  $(SDIR)/istype.cpp

eatwhite.o	: $(SDIR)/eatwhite.cpp $(HEADER0)
	$(CXX) $(CXXFLAGS)  $(SDIR)/eatwhite.cpp

futil.o	: $(SDIR)/futil.cpp $(HEADER0)
	$(CXX) $(CXXFLAGS)  $(SDIR)/futil.cpp

julian.o	: $(SDIR)/julian.cpp $(HEADER0)
	$(CXX) $(CXXFLAGS)  $(SDIR)/julian.cpp

cholesky.o	: $(SDIR)/cholesky.cpp $(HEADER1)
	$(CXX) $(CXXFLAGS)  $(SDIR)/cholesky.cpp

mvn.o	: $(SDIR)/mvn.cpp $(HEADER0)
	$(CXX) $(CXXFLAGS)  $(SDIR)/mvn.cpp

stopwatch.o	: $(SDIR)/stopwatch.cpp $(HEADER0)
	$(CXX) $(CXXFLAGS)  $(SDIR)/stopwatch.cpp

gmm.o	: $(SDIR)/gmm.cpp $(HEADER0)
	$(CXX) $(CXXFLAGS)  $(SDIR)/gmm.cpp

particles.o	: $(SDIR)/particles.cpp $(HEADER2)
	$(CXX) $(CXXFLAGS)  $(SDIR)/particles.cpp

clean	:
	rm -f *.o core core.*

veryclean	:
	rm -f *.o core core.*
	rm -f libsclcb.a
	rm -f *.h
