--- Makefile.orig	2012-04-12 03:37:14.000000000 +0900
+++ Makefile	2012-11-10 08:41:14.000000000 +0900
@@ -1,28 +1,67 @@
-CXX ?= g++
-CFLAGS = -Wall -Wconversion -O3 -fPIC
-SHVER = 4
-OS = $(shell uname)
-ifeq ($(OS),Darwin)
-	SHARED_LIB_FLAG = -dynamiclib -Wl,-install_name,libsvm.so.$(SHVER)
-else
-	SHARED_LIB_FLAG = -shared -Wl,-soname,libsvm.so.$(SHVER)
-endif
+CC ?= clang
+CXX ?= clang++
 
-# Uncomment the following lines to enable parallelization with OpenMP
-# CFLAGS += -fopenmp
-# SHARED_LIB_FLAG += -fopenmp
+CPPFLAGS +=
+CFLAGS +=
+LDFLAGS += -L.
+LIBS +=
 
-all: svm-train svm-predict svm-scale
+VMAJOR := $(shell echo $(VERSION) | sed -rne 's/([0-9]*)\.[0-9].*/\1/p')
+VMINOR := $(shell echo $(VERSION) | sed -rne 's/[0-9]\.([0-9]*)\..*/\1/p')
+VPATCH := $(shell echo $(VERSION) | sed -rne 's/[0-9]*\.[0-9]*\.([0-9]*).*/\1/p')
+SHVER = $(VMAJOR)
 
-lib: svm.o
-	$(CXX) $(SHARED_LIB_FLAG) svm.o -o libsvm.so.$(SHVER)
-svm-predict: svm-predict.c svm.o
-	$(CXX) $(CFLAGS) svm-predict.c svm.o -o svm-predict -lm
-svm-train: svm-train.c svm.o
-	$(CXX) $(CFLAGS) svm-train.c svm.o -o svm-train -lm
+DYLIBFILE = libsvm.$(VERSION).dylib
+
+LIB_LIBS += $(LIBS)
+LIB_CFLAGS += $(CFLAGS)
+LIB_LDFLAGS += $(LIBS) -fPIC
+
+EXE_CFLAGS += $(CFLAGS)
+EXE_LDFLAGS += $(LDFLAGS)
+
+incdir ?= $(PREFIX)/include
+bindir ?= $(PREFIX)/bin
+libdir ?= $(PREFIX)/lib
+incdest = $(DESTDIR)$(incdir)
+bindest = $(DESTDIR)$(bindir)
+libdest = $(DESTDIR)$(libdir)
+
+all: svm-train svm-predict svm-scale libsvm.a
+
+svm-predict: svm-predict.c $(DYLIBFILE)
+	$(CC) $(CPPFLAGS) $(EXE_CFLAGS) $(EXE_LDFLAGS) svm-predict.c -o $@ -lm -lsvm -lstdc++
+
+svm-train: svm-train.c $(DYLIBFILE)
+	$(CC) $(CPPFLAGS) $(EXE_CFLAGS) $(EXE_LDFLAGS) svm-train.c -o $@ -lm -lsvm -lstdc++
+
 svm-scale: svm-scale.c
-	$(CXX) $(CFLAGS) svm-scale.c -o svm-scale
-svm.o: svm.cpp svm.h
-	$(CXX) $(CFLAGS) -c svm.cpp
+	$(CC) $(CPPFLAGS) $(EXE_CFLAGS) $(EXE_LDFLAGS) svm-scale.c -o $@ 
+
+$(DYLIBFILE): svm.cpp svm.h
+	$(CXX) $(CPPFLAGS) $(LIB_CFLAGS) $(LIB_LDFLAGS) -dynamiclib \
+		-install_name $(libdir)/$@ \
+		-current_version $(VERSION) \
+		-compatibility_version $(SHVER).$(VMINOR) \
+		-o $@ svm.cpp
+	rm -f libsvm.$(SHVER).dylib libsvm.dylib
+	ln -s $@ libsvm.$(SHVER).dylib
+	ln -s libsvm.$(SHVER).dylib libsvm.dylib
+
+libsvm.a:
+	$(CXX) $(CPPFLAGS) $(LIB_CFLAGS) -c -o svm.o svm.cpp
+	ar rc libsvm.a svm.o
+	ranlib -c libsvm.a
+
+install: all
+	$(INSTALL) -d $(bindest) $(libdest)
+	$(INSTALL) -m 755 svm-train svm-predict svm-scale $(bindest)
+	$(INSTALL) -m 644 libsvm.a $(libdest)
+	$(INSTALL) -m 644 $(DYLIBFILE) $(libdest)
+	$(INSTALL) -m 644 svm.h $(incdest)
+	cd $(libdest) && ln -s $(DYLIBFILE) libsvm.$(SHVER).dylib
+	cd $(libdest) && ln -s libsvm.$(SHVER).dylib libsvm.dylib
+
 clean:
-	rm -f *~ svm.o svm-train svm-predict svm-scale libsvm.so.$(SHVER)
+	rm -f *~ svm.o svm-train svm-predict svm-scale
+	rm -f *.a *.dylib
