CXX ?= g++
CFLAGS = -Wall -Wconversion -O3 -fPIC
SHVER = 4
export SHVER
OS = $(shell uname)
MAKE = make
DOT_LIBS=.
LIBS= -L${DOT_LIBS} -lsvm
export LIBSVM_VER
IS_64:=$(shell /bin/uname -i | awk '/64/ {print 64}')

PREFIXDIR?= /usr
export PREFIXDIR

DATADIR?=${PREFIXDIR}/share
export DATADIR

BINDIR?=${PREFIXDIR}/bin
export BINDIR

INCLUDEDIR_INSTALL:=${DESTDIR}/${PREFIXDIR}/include
export INCLUDEDIR_INSTALL

LIBDIR_INSTALL:=${DESTDIR}/${LIBDIR}
export LIBDIR_INSTALL

DATADIR_INSTALL:=${DESTDIR}/${DATADIR}
export DATA_INSTALL

BINDIR_INSTALL:=${DESTDIR}/${BINDIR}
export BINDIR_INSTALL

ifeq ($(OS),Darwin)
	SHARED_LIB_FLAG = -dynamiclib -Wl,-install_name,libsvm.so.$(SHVER)
else
	SHARED_LIB_FLAG = -shared -Wl,-soname,libsvm.so.$(SHVER)
endif

# Uncomment the following lines to enable parallelization with OpenMP
# CFLAGS += -fopenmp
# SHARED_LIB_FLAG += -fopenmp

all: lib svm-train svm-predict svm-scale # svm-python svm-java svm-toy-qt

lib: libsvm.so.$(SHVER) libsvm.so
libsvm.so: libsvm.so.$(SHVER)
	ln -sf libsvm.so.$(SHVER) libsvm.so
libsvm.so.$(SHVER): svm.o
	$(CXX) $(CFLAGS) $(SHARED_LIB_FLAG) svm.o -o libsvm.so.$(SHVER)
svm-predict: svm-predict.c svm.o
	$(CXX) $(CFLAGS) svm-predict.c $(LIBS) -o svm-predict -lm
svm-train: svm-train.c svm.o
	$(CXX) $(CFLAGS) svm-train.c $(LIBS) -o svm-train -lm
svm-scale: svm-scale.c
	$(CXX) $(CFLAGS) svm-scale.c -o svm-scale
svm.o: svm.cpp svm.h
	$(CXX) $(CFLAGS) -c svm.cpp
clean:
	rm -f *~ svm.o svm-train svm-predict svm-scale svm-toy/qt/svm-toy-qt
	${MAKE} -C python clean
	${MAKE} -C java clean

svm-python:
	${MAKE} -C python

svm-java:
	${MAKE} -C java all javadoc

svm-toy-gtk:
	${MAKE} -C svm-toy/gtk

svm-toy-qt:
	${MAKE} -C svm-toy/qt

install: all #install-java install-python install-toy-gtk install-toy-qt
	mkdir -p ${BINDIR_INSTALL}
	install -m 755 svm-train ${BINDIR_INSTALL}
	install -m 755 svm-predict ${BINDIR_INSTALL}
	install -m 755 svm-scale ${BINDIR_INSTALL}
	mkdir -p ${LIBDIR_INSTALL}
	install -m 755 libsvm.so.$(SHVER) ${LIBDIR_INSTALL}
# install package libsvm-devel
	mkdir -p ${INCLUDEDIR_INSTALL}/libsvm
	install -m 644 svm.h ${INCLUDEDIR_INSTALL}/libsvm
	mkdir -p ${DATADIR_INSTALL}/libsvm/src/java/libsvm
	install -m 644 *.h ${DATADIR_INSTALL}/libsvm/src
	install -m 644 *.c ${DATADIR_INSTALL}/libsvm/src
	install -m 644 *.cpp ${DATADIR_INSTALL}/libsvm/src
	install -m 644 Makefile ${DATADIR_INSTALL}/libsvm/src
# install examples
	mkdir -p ${DATADIR_INSTALL}/libsvm/examples
	install -m 644 heart_scale ${DATADIR_INSTALL}/libsvm/examples

# install package libsvm-python
install-python:
	${MAKE} -C python install

# install package libsvm-java
install-java:
	install -m 644 java/*.java ${DATADIR_INSTALL}/libsvm/src/java
	install -m 644 java/Makefile ${DATADIR_INSTALL}/libsvm/src/java
	install -m 644 java/libsvm/*.java ${DATADIR_INSTALL}/libsvm/src/java/libsvm
	install -m 644 java/libsvm/*.m4 ${DATADIR_INSTALL}/libsvm/src/java/libsvm
	${MAKE} -C java install

# install package svm-toy
install-toy-gtk:
	install -m 755 svm-toy/gtk/svm-toy-gtk ${BINDIR_INSTALL}

install-toy-qt:
	install -m 755 svm-toy/qt/svm-toy-qt ${BINDIR_INSTALL}

uninstall:
	rm -f ${BINDIR_INSTALL}/svm-train
	rm -f ${BINDIR_INSTALL}/svm-predict
	rm -f ${BINDIR_INSTALL}/svm-scale
	rm -fr ${DATADIR_INSTALL}/libsvm
	rm -f ${INCLUDEDIR_INSTALL}/libsvm/svm.h
	rm -f ${LIBDIR_INSTALL}/libsvm.so*
	${MAKE} -C python uninstall
#ifneq ("${NO_JAVA}","NO_JAVA")
	${MAKE} -C java uninstall
#endif
#	rm -f ${BINDIR_INSTALL}/svm-toy-gtk
	rm -f ${BINDIR_INSTALL}/svm-toy-qt


