From 1f625ec4339d9fa9a5dd72be2943b562ae8edc23 Mon Sep 17 00:00:00 2001 From: nguenthe Date: Wed, 13 May 2015 19:30:56 -0400 Subject: [PATCH 1/3] Clean up the makefile - use make's features to get the platform detection out of the shell script - make the library file a real target: now use 'make libsvm.so.2' instead of 'make lib' (but the latter is still there for backwards compatibility) - don't explicitly embed -soname (Linux) or -install_name (OS X); rather, let the platform decide. Because of this, the target is built with its final name and then linked to its versioned name, instead of the other way around. --- Makefile | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/Makefile b/Makefile index db6ab346..3362d2ff 100644 --- a/Makefile +++ b/Makefile @@ -1,25 +1,34 @@ CXX ?= g++ CFLAGS = -Wall -Wconversion -O3 -fPIC SHVER = 2 -OS = $(shell uname) +OS := $(shell uname) all: svm-train svm-predict svm-scale -lib: svm.o - if [ "$(OS)" = "Darwin" ]; then \ - SHARED_LIB_FLAG="-dynamiclib -Wl,-install_name,libsvm.so.$(SHVER)"; \ - else \ - SHARED_LIB_FLAG="-shared -Wl,-soname,libsvm.so.$(SHVER)"; \ - fi; \ - $(CXX) $${SHARED_LIB_FLAG} svm.o -o libsvm.so.$(SHVER) +ifeq ($(OS),Darwin) + LIBEXT := dylib + SHARED_LIB_FLAG = -dynamiclib +else + LIBEXT := so + SHARED_LIB_FLAG = -shared +endif + +libsvm.$(LIBEXT): svm.o + $(CXX) $(SHARED_LIB_FLAG) $^ -o $@ + +libsvm.$(LIBEXT).$(SHVER): libsvm.$(LIBEXT) + ln $< $@ + +.PHONY: lib +lib: libsvm.$(LIBEXT).$(SHVER) svm-predict: svm-predict.c svm.o - $(CXX) $(CFLAGS) svm-predict.c svm.o -o svm-predict -lm + $(CXX) $(CFLAGS) $^ -o $@ -lm svm-train: svm-train.c svm.o - $(CXX) $(CFLAGS) svm-train.c svm.o -o svm-train -lm + $(CXX) $(CFLAGS) $^ -o $@ -lm svm-scale: svm-scale.c - $(CXX) $(CFLAGS) svm-scale.c -o svm-scale + $(CXX) $(CFLAGS) $^ -o svm-scale svm.o: svm.cpp svm.h - $(CXX) $(CFLAGS) -c svm.cpp + $(CXX) $(CFLAGS) -c $< clean: - rm -f *~ svm.o svm-train svm-predict svm-scale libsvm.so.$(SHVER) + rm -f *~ svm.o svm-train svm-predict svm-scale libsvm.$(LIBEXT).$(SHVER) From eb5f762aec83098cc81ae03e630de563a06740e5 Mon Sep 17 00:00:00 2001 From: nguenthe Date: Wed, 13 May 2015 19:45:58 -0400 Subject: [PATCH 2/3] Build the static library and build both libs by default. static library lines via MacPorts: https://trac.macports.org/browser/trunk/dports/math/libsvm/files/patch-Makefile.diff --- Makefile | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index 3362d2ff..2809f09d 100644 --- a/Makefile +++ b/Makefile @@ -3,24 +3,28 @@ CFLAGS = -Wall -Wconversion -O3 -fPIC SHVER = 2 OS := $(shell uname) -all: svm-train svm-predict svm-scale +all: svm-train svm-predict svm-scale lib ifeq ($(OS),Darwin) - LIBEXT := dylib + DLLEXT := dylib SHARED_LIB_FLAG = -dynamiclib else - LIBEXT := so + DLLEXT := so SHARED_LIB_FLAG = -shared endif -libsvm.$(LIBEXT): svm.o +libsvm.$(DLLEXT): svm.o $(CXX) $(SHARED_LIB_FLAG) $^ -o $@ -libsvm.$(LIBEXT).$(SHVER): libsvm.$(LIBEXT) - ln $< $@ +libsvm.$(DLLEXT).$(SHVER): libsvm.$(DLLEXT) + ln $< $@ + +libsvm.a: svm.o + ar rc $@ $^ + ranlib $@ .PHONY: lib -lib: libsvm.$(LIBEXT).$(SHVER) +lib: libsvm.$(DLLEXT).$(SHVER) libsvm.a svm-predict: svm-predict.c svm.o $(CXX) $(CFLAGS) $^ -o $@ -lm @@ -31,4 +35,4 @@ svm-scale: svm-scale.c svm.o: svm.cpp svm.h $(CXX) $(CFLAGS) -c $< clean: - rm -f *~ svm.o svm-train svm-predict svm-scale libsvm.$(LIBEXT).$(SHVER) + rm -f *~ svm.o svm-train svm-predict svm-scale libsvm.$(DLLEXT).$(SHVER) libsvm.a From 0afd460a98da1c6a01a615a514589a6dd1235fba Mon Sep 17 00:00:00 2001 From: Nick Date: Wed, 13 May 2015 21:55:32 -0400 Subject: [PATCH 3/3] Follow the Windows DLL naming convention of .lib MinGW describes the differences well: http://www.mingw.org/wiki/Specify_the_libraries_for_the_linker_to_use By following this convention, libsvm should be compatible with MinGW. --- Makefile.win | 7 +++++-- svm.def | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Makefile.win b/Makefile.win index 1c34d51b..ec66fd82 100644 --- a/Makefile.win +++ b/Makefile.win @@ -25,8 +25,11 @@ $(TARGET)\svm-toy.exe: svm.h svm.obj svm-toy\windows\svm-toy.cpp svm.obj: svm.cpp svm.h $(CXX) $(CFLAGS) -c svm.cpp -lib: svm.cpp svm.h svm.def - $(CXX) $(CFLAGS) -LD svm.cpp -Fe$(TARGET)\libsvm -link -DEF:svm.def +$(TARGET)\svm.dll $(TARGET)\svm.lib $(TARGET)\svm.exp: svm.cpp svm.h svm.def + $(CXX) $(CFLAGS) -LD svm.obj -Fe$(TARGET)\svm -link -DEF:svm.def + +.PHONY: lib +lib: $(TARGET)\svm.dll $(TARGET)\svm.lib $(TARGET)\svm.exp clean: -erase /Q *.obj $(TARGET)\. diff --git a/svm.def b/svm.def index 6bd1750e..5294fa36 100644 --- a/svm.def +++ b/svm.def @@ -1,4 +1,4 @@ -LIBRARY libsvm +LIBRARY svm EXPORTS svm_train @1 svm_cross_validation @2