CXX      = g++
SDIR     = .
OCLDIR   = /System/Library/Frameworks/OpenCL.framework/Versions/Current
IOCL     = $(OCLDIR)/Headers
LOCL     = $(OCLDIR)/Libraries
ISCL     = ../libscl_float/gpp
LSCL     = ../libscl_float/gpp
IVCL     = ../viennacl
CXXFLAGS = -O2 -Wall -c -shared -I$(SDIR) -I$(ISCL) -I$(IOCL) -I$(IVCL)
LDFLAGS  = -lm -L$(LSCL) -lscl -L$(LOCL) -framework OpenCL

OBJECTS  = 

LIBRARIES = libscl.a

PROGRAMS = hello devices matrixvecmult vecmatmult matmatmult \
	   viennacl vclmat regr

all : $(LIBRARIES) $(PROGRAMS)

libscl.a :
	make -C $(LSCL)

hello : hello.o $(OBJECTS)
	$(CXX) -o hello hello.o $(OBJECTS) $(LDFLAGS) 

devices : devices.o $(OBJECTS)
	$(CXX) -o devices devices.o $(OBJECTS) $(LDFLAGS) 

matrixvecmult : matrixvecmult.o $(OBJECTS)
	$(CXX) -o matrixvecmult matrixvecmult.o $(OBJECTS) $(LDFLAGS) 

vecmatmult : vecmatmult.o $(OBJECTS)
	$(CXX) -o vecmatmult vecmatmult.o $(OBJECTS) $(LDFLAGS) 

matmatmult : matmatmult.o $(OBJECTS)
	$(CXX) -o matmatmult matmatmult.o $(OBJECTS) $(LDFLAGS) 

viennacl : viennacl.o $(OBJECTS)
	$(CXX) -o viennacl viennacl.o $(OBJECTS) $(LDFLAGS) 

vclmat : vclmat.o $(OBJECTS)
	$(CXX) -o vclmat vclmat.o $(OBJECTS) $(LDFLAGS) 

regr : regr.o $(OBJECTS)
	$(CXX) -o regr regr.o $(OBJECTS) $(LDFLAGS) 

hello.o : $(SDIR)/hello.cpp
	$(CXX) $(CXXFLAGS) $(SDIR)/hello.cpp

devices.o : $(SDIR)/devices.cpp
	$(CXX) $(CXXFLAGS) $(SDIR)/devices.cpp

matrixvecmult.o : $(SDIR)/matrixvecmult.cpp
	$(CXX) $(CXXFLAGS) $(SDIR)/matrixvecmult.cpp

vecmatmult.o : $(SDIR)/vecmatmult.cpp
	$(CXX) $(CXXFLAGS) $(SDIR)/vecmatmult.cpp

matmatmult.o : $(SDIR)/matmatmult.cpp
	$(CXX) $(CXXFLAGS) $(SDIR)/matmatmult.cpp

viennacl.o : $(SDIR)/viennacl.cpp
	$(CXX) $(CXXFLAGS) $(SDIR)/viennacl.cpp

vclmat.o : $(SDIR)/vclmat.cpp
	$(CXX) $(CXXFLAGS) $(SDIR)/vclmat.cpp

regr.o : $(SDIR)/regr.cpp
	$(CXX) $(CXXFLAGS) $(SDIR)/regr.cpp

clean :
	make -C $(LSCL) clean
	rm -f *.o
	rm -f core core.*

veryclean :
	make -C $(LSCL) veryclean
	rm -f *.o
	rm -f core core.*
	rm -f $(PROGRAMS)

dirclean :
	rm -f *.o
	rm -f core core.*
	rm -f $(PROGRAMS)

