CXX ?= g++
CC ?= gcc
CFLAGS = -Wall -O3 -fPIC
LIBS = blas/blas.a -lm
#LIBS = -lblas -lm
SHVER = 3
OS = $(shell uname)
CLUSTER = skmeans.o kmeans.o kmedians.o
# ==============

all: lsvm nksvm p2svm instancewise featurewise featurewise2

instancewise: instancewise.cpp
	g++ -O3 -Wall -o instancewise instancewise.cpp -lm
	
featurewise: featurewise.cpp
	g++ -O3 -Wall -o featurewise featurewise.cpp -lm

featurewise2: featurewise2.cpp
	g++ -O3 -Wall -o featurewise2 featurewise2.cpp -lm

lib: linear.o tron.o blas/blas.a
	if [ "$(OS)" = "Darwin" ]; then \
		SHARED_LIB_FLAG="-dynamiclib -Wl,-install_name,liblinear.so.$(SHVER)"; \
	else \
		SHARED_LIB_FLAG="-shared -Wl,-soname,liblinear.so.$(SHVER)"; \
	fi; \
	$(CXX) $${SHARED_LIB_FLAG} linear.o tron.o blas/blas.a -o liblinear.so.$(SHVER)

%svm: $(CLUSTER) various_svm.cpp blas/blas.a
	if [ "$@" = "lsvm" ]; then \
		DEFS="-DSVM"; \
	elif [ "$@" = "p2svm" ]; then \
		DEFS="-DPOLY2"; \
	else \
		DEFS="-DNKSVM"; \
	fi; \
	$(CXX) $(CFLAGS) $${DEFS} -o $@ various_svm.cpp $(CLUSTER) tron.cpp linear.cpp $(LIBS)

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

blas/blas.a: blas/*.c blas/*.h
	make -C blas OPTFLAGS='$(CFLAGS)' CC='$(CC)';

clean:
	make -C blas clean
	rm -f *~ tron_m.o linear_m.o tron.o linear.o liblinear.so.$(SHVER)
	rm -f $(CLUSTER)
	rm -f *svm *svm_m
	rm -f instancewise featurewise featurewise2
