From: Christian Kastner <debian@kvr.at>
Date: Thu, 17 Jun 2010 15:39:15 +0200
Subject: Properly build shared and static libraries, programs

Modify upstream's Makefile to properly build shared and static libraries, and
link upstream's programs to the shared libraries. Furthermore, provide an
install target.

Forwarded: not-needed
Last-Update: 2016-04-22
---
 Makefile | 75 ++++++++++++++++++++++++++++++++++++++++++++++++----------------
 1 file changed, 57 insertions(+), 18 deletions(-)

diff --git a/Makefile b/Makefile
index f847bf9..51d2b5b 100644
--- a/Makefile
+++ b/Makefile
@@ -3,12 +3,29 @@ MEX := mex
 MEXFLAGS := $(shell if uname -m | grep -q x86_64 ; then echo -largeArrayDims ; fi)
 MEXSUFFIX := $(shell if uname -m | grep -q x86_64 ; then echo mexa64 ; else echo mexglx ; fi)
 CC := gcc
-#CFLAGS := -g -lm -Wall -pthread
-CFLAGS := -msse -O3 -fPIC -fstrict-aliasing -fomit-frame-pointer -Wall -pthread
-CLIBS := -lm
-#CFLAGS := -lm -msse -O3 -fPIC -fstrict-aliasing -fomit-frame-pointer -Wall
-#CFLAGS := -lm -msse -O3 -fPIC -fopenmp -fstrict-aliasing -fomit-frame-pointer -Wall
 
+CFLAGS +=
+LDFLAGS +=
+LIBS += -lm
+
+# Libraries must not be compiled/linked with -pie, -fpie or -FPIE
+LIB_CFLAGS = $(filter-out -fPIE,$(CFLAGS)) -fPIC
+LIB_LDFLAGS = $(filter-out -fPIE, $(filter-out -pie,$(LDFLAGS)))
+LIB_LIBS = $(LIBS)
+
+PROG_CFLAGS = $(CFLAGS)
+PROG_LDFLAGS = $(LDFLAGS) -L.
+PROG_LIBS = $(LIBS) -lpthread -locas
+
+# The real LVER/LSUBVER should be passed on by debian/rules
+LVER ?= 0
+LSUBVER ?= 0
+LIBFILE = libocas.so.$(LVER).$(LSUBVER)
+
+bindir ?= /usr/bin/
+libdir ?= /usr/lib/
+bindest = $(DESTDIR)$(bindir)
+libdest = $(DESTDIR)$(libdir)
 
 ifeq (yes,$(MEXDETECTED))
 all: svmocas_nnw.$(MEXSUFFIX) svmocas.$(MEXSUFFIX) svmocas_light.$(MEXSUFFIX) linclassif_light.$(MEXSUFFIX) libocas.so svmocas msvmocas linclassif msvmocas.$(MEXSUFFIX) msvmocas_light.$(MEXSUFFIX) compute_auc.$(MEXSUFFIX) svmocas_lbp.$(MEXSUFFIX) svmocas_bool.$(MEXSUFFIX) lbppyr_features.$(MEXSUFFIX) load_svmlight_file.$(MEXSUFFIX)
@@ -53,21 +70,43 @@ load_svmlight_file.$(MEXSUFFIX): load_svmlight_file.c lib_svmlight_format.c lib_
 		$(MEX) $(MEXFLAGS) -DLIBOCAS_MATLAB -O -output load_svmlight_file.$(MEXSUFFIX) load_svmlight_file.c lib_svmlight_format.c
 
 else 
-all: libocas.so svmocas msvmocas linclassif
+all: $(LIBFILE) svmocas msvmocas linclassif libocas.a
 endif
 
-svmocas:	svmocas.c svmocas.c lib_svmlight_format.c sparse_mat.c ocas_helper.c ocas_helper.h libocas.h sparse_mat.h libocas.c features_double.h features_double.c version.h
-		$(CC) $(CFLAGS) -o $@ svmocas.c lib_svmlight_format.c sparse_mat.c ocas_helper.c features_double.c libocas.c libqp_splx.c $(CLIBS)
+svmocas:	svmocas.c lib_svmlight_format.c sparse_mat.c ocas_helper.c ocas_helper.h libocas.h sparse_mat.h features_double.h features_double.c version.h $(LIBFILE)
+		$(CC) $(CPPFLAGS) $(PROG_CFLAGS) $(PROG_LDFLAGS) -o $@ svmocas.c lib_svmlight_format.c sparse_mat.c ocas_helper.c features_double.c $(PROG_LIBS)
 
-msvmocas:	msvmocas.c lib_svmlight_format.c sparse_mat.c ocas_helper.c ocas_helper.h libocas.h sparse_mat.h libocas.c features_double.h features_double.c version.h
-		$(CC) $(CFLAGS) -o $@ msvmocas.c lib_svmlight_format.c sparse_mat.c ocas_helper.c features_double.c libocas.c libqp_splx.c $(CLIBS)
+msvmocas:	msvmocas.c lib_svmlight_format.c sparse_mat.c ocas_helper.c ocas_helper.h libocas.h sparse_mat.h features_double.h features_double.c version.h $(LIBFILE)
+		$(CC) $(CPPFLAGS) $(PROG_CFLAGS) $(PROG_LDFLAGS) -o $@ msvmocas.c lib_svmlight_format.c sparse_mat.c ocas_helper.c features_double.c $(PROG_LIBS)
 
 linclassif:	linclassif.c lib_svmlight_format.c libocas.h version.h
-		$(CC) $(CFLAGS) -o $@ linclassif.c lib_svmlight_format.c $(CLIBS)
-
-
-libocas.so:	libocas.c libocas.h libqp_splx.c libqp.h
-		$(CC) $(CFLAGS) -shared -o $@ libocas.c libqp_splx.c $(CLIBS)
-
-clean: 
-		rm -f *~ svmocas.$(MEXSUFFIX) svmocas_nnw.$(MEXSUFFIX) svmocas_bool.$(MEXSUFFIX) svmocas_light.$(MEXSUFFIX) linclassif_light.$(MEXSUFFIX) svmocas msvmocas linclassif libocas.so msvmocas.$(MEXSUFFIX) msvmocas_light.$(MEXSUFFIX) lbppyr_features.$(MEXSUFFIX) svmocas_lbp.$(MEXSUFFIX) compute_auc.$(MEXSUFFIX) load_svmlight_file.$(MEXSUFFIX)
+		$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ linclassif.c lib_svmlight_format.c $(LIBS)
+
+
+$(LIBFILE):	libocas.c libocas.h libqp_splx.c libqp.h
+		$(CC) $(CPPFLAGS) $(LIB_CFLAGS) $(LIB_LDFLAGS) -shared \
+			-Wl,-soname,libocas.so.$(LVER) \
+			-o $@ libocas.c libqp_splx.c $(LIB_LIBS)
+		ln -s $@ libocas.so.$(LVER)
+		ln -s libocas.so.$(LVER) libocas.so
+
+libocas.a:
+	$(CXX) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -c -o libocas-static.o libocas.c
+	$(CXX) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -c -o libqp_splx-static.o libqp_splx.c
+	ar cru libocas.a libocas-static.o libqp_splx-static.o
+
+install: all
+	install -d $(bindest) $(libdest)
+	install svmocas msvmocas linclassif -m 755 $(bindest)
+	install libocas.a -m 644 $(libdest)
+	install $(LIBFILE) -m 644 $(libdest)
+	cd $(libdest) && ln -s $(LIBFILE) libocas.so.$(LVER)
+	cd $(libdest) && ln -s libocas.so.$(LVER) libocas.so
+
+clean:
+	rm -f *~ *.o
+	rm -f svmocas.$(MEXSUFFIX) svmocas_nnw.$(MEXSUFFIX) svmocas_bool.$(MEXSUFFIX) svmocas_light.$(MEXSUFFIX)
+	rm -f linclassif_light.$(MEXSUFFIX)
+	rm -f svmocas msvmocas linclassif libocas.so* libocas.a
+	rm -f msvmocas.$(MEXSUFFIX) msvmocas_light.$(MEXSUFFIX)
+	rm -f lbppyr_features.$(MEXSUFFIX) svmocas_lbp.$(MEXSUFFIX) compute_auc.$(MEXSUFFIX) load_svmlight_file.$(MEXSUFFIX)
