CXX ?= g++
CFLAGS = -Wall -Wconversion -O3 -fPIC -fopenmp
CBLAS = blas/blas.a
ifeq ($(USE_MKL), 1)
	CFLAGS += -I$(MKL_HEADER_DIR) -DUSE_MKL
	MKLLIBS = mkl_intel_thread mkl_core mkl_intel_lp64 mkl_core mkl_gnu_thread mkl_rt iomp5
	CFLAGS += -L$(MKL_COMPILER_LIB_DIR) -L$(MKL_LIB_DIR) $(addprefix -l,$(MKLLIBS)) -fopenmp 
	CBLAS = 
endif

LOGFLAGS=-DLOG

all: svm-train svm-predict  svm-train-log svm-train-log-time 

svm-predict: svm-predict.c svm.o tron.o selectiontree.o $(CBLAS)
	$(CXX) $(CFLAGS) $+ -o svm-predict -lm
svm-train: svm-train.c svm.o tron.o selectiontree.o $(CBLAS)
	$(CXX) $(CFLAGS) $+ -o svm-train -lm

svm.o: svm.cpp svm.h
	$(CXX) $(CFLAGS) -c svm.cpp 
tron.o: tron.cpp tron.h
	$(CXX) $(CFLAGS) -c -o tron.o tron.cpp

svm-log.o: svm.cpp svm.h
	$(CXX) $(CFLAGS) $(LOGFLAGS) -c -o $@ $<

tron-log.o: tron.cpp tron.h
	$(CXX) $(CFLAGS) $(LOGFLAGS) -c -o $@ $<

log.o : log.cpp log.h
	$(CXX) $(CFLAGS) $(LOGFLAGS) -c -o $@ $<

log-time.o : log.cpp log.h
	$(CXX) $(CFLAGS) $(LOGFLAGS) -DLOG_TIME_ONLY -c -o $@ $<

svm-train-log-time:  svm-train.c log-time.o svm-log.o tron-log.o selectiontree.o $(CBLAS)
	$(CXX) $(CFLAGS) $(LOGFLAGS) -o $@ $+

svm-train-log: svm-train.c log.o svm-log.o tron-log.o selectiontree.o $(CBLAS)
	$(CXX) $(CFLAGS) $(LOGFLAGS) -o $@ $+

selectiontree.o: selectiontree.cpp selectiontree.h
	$(CXX) $(CFLAGS) -c -o selectiontree.o selectiontree.cpp
blas/blas.a: blas/*.c blas/*.h
	make -C blas OPTFLAGS='$(CFLAGS)' CC='$(CC)';
clean:
	make -C blas clean
	rm -f *.o svm-train svm-predict svm-train-log svm-train-log-time libsvm.so.$(SHVER)
