CXX      = g++
SDIR     = .
OCLDIR   = /System/Library/Frameworks/OpenCL.framework/Versions/Current
IOCL     = $(OCLDIR)/Headers
LOCL     = $(OCLDIR)/Libraries
ISCL     = ../libscl_float/cblas
LSCL     = ../libscl_float/cblas
LATLAS   = /usr/local/lib/atlas/lib
IVCL     = ../viennacl
CXXFLAGS = -O2 -Wall -c -shared -I$(SDIR) -I$(ISCL) -I$(IOCL) -I$(IVCL)
LDFLAGS  = -L$(LSCL) -lsclcb -lm -L$(LATLAS) -lcblas -latlas \
	    -L$(LOCL) -framework OpenCL

OBJECTS  = 

LIBRARIES = libscl.a

PROGRAMS = hello devices matrixvecmult vecmatmult matmatmult \
	   viennacl vclmat

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) 

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

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)

