CXX ?= g++
CC ?= gcc
CFLAGS = -Wall -Wconversion -O3 -fPIC
LIBS = blas/blas.a
SHVER = 1
#LIBS = -lblas

all: train predict train-innersh train-outersh train-nosh

lib: linear.o tron.o blas/blas.a
	$(CXX) -shared -dynamiclib linear.o tron.o blas/blas.a -o liblinear.so.$(SHVER)

train: tron.o linear.o train.c blas/blas.a
	$(CXX) $(CFLAGS) -o train train.c tron.o linear.o $(LIBS)
train-innersh: tron.o linear-innersh.o train.c blas/blas.a
	$(CXX) $(CFLAGS) -o train-innersh train.c tron.o linear-innersh.o $(LIBS)
train-outersh: tron.o linear-outersh.o train.c blas/blas.a
	$(CXX) $(CFLAGS) -o train-outersh train.c tron.o linear-outersh.o $(LIBS)
train-nosh: tron.o linear-nosh.o train.c blas/blas.a
	$(CXX) $(CFLAGS) -o train-nosh train.c tron.o linear-nosh.o $(LIBS)

predict: tron.o linear.o predict.c blas/blas.a
	$(CXX) $(CFLAGS) -o predict predict.c tron.o linear.o $(LIBS)

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

linear.o: linear.cpp linear.h
	$(CXX) $(CFLAGS) -c -o linear.o linear.cpp
linear-innersh.o: linear.cpp linear.h
	$(CXX) $(CFLAGS) -DNOL1SH -c -o linear-innersh.o linear.cpp
linear-outersh.o: linear.cpp linear.h
	$(CXX) $(CFLAGS) -DNOL2SH -c -o linear-outersh.o linear.cpp
linear-nosh.o: linear.cpp linear.h
	$(CXX) $(CFLAGS) -DNOL1SH -DNOL2SH -c -o linear-nosh.o linear.cpp

blas/blas.a:
	cd blas; make OPTFLAGS='$(CFLAGS)' CC='$(CC)';

clean:
	cd blas;	make clean
	rm -f *~ tron.o linear.o train predict liblinear.so.$(SHVER)
	rm -f linear-*sh.o train-*sh
