# The library is built within libcpp/gpp using 
# make -f makefile.gpp

# Code that uses the library (e.g. prog.cpp) is compiled using 
# g++ -c -I/usr/local/lib/libscl/gpp prog.cpp
# g++ -o prog prog.o -L/usr/local/lib/libscl/gpp -lscl -lm

# If a cblas is available, the library built within libpp/cblas
# is faster.

CXX      = g++
SDIR     = ../src
CXXFLAGS = -O2 -Wall -I./ -c

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 \
		rb2.o simple.o varcov.o varcoef.o rwtable.o \
		wishart.o dcfyld.o mvnquad.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 libscl.a
	ar -rsv libscl.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

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

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

libscl.h	: $(SDIR)/libscl.h scltypes.h sclerror.h sclfuncs.h \
		  intvec.h realmat.h kronprd.h vclmat.h particles.h \
		  linear_interpolator.h spline_interpolator.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 $(HEADER1)
	$(CXX) $(CXXFLAGS)  $(SDIR)/mvn.cpp

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

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

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

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

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

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

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

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

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

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

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

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

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