From 5c152fc2966cad01dc403ebfa4137a589b415cac Mon Sep 17 00:00:00 2001
From: yangfl <yangfl@users.noreply.github.com>
Date: Mon, 22 Feb 2021 00:24:45 +0800
Subject: [PATCH] Make C++ shared lib

Origin: Debian
Upstream-Status: Unknown
[ismael@sourcemage.org: Removed compatibility code, added .pc file to the
 "all" target, removed static lib support, and simplified the makefile]
Signed-off-by: Ismael Luceno <ismael@sourcemage.org>
---
 cpp/Makefile           |   39 +++++++++++++++++++++++++++++++++------
 cpp/qrcodegencpp.pc.in |   10 ++++++++++
 2 files changed, 43 insertions(+), 6 deletions(-)

diff --git a/cpp/Makefile b/cpp/Makefile
index 57dc0bf..d95c7e2 100644
--- a/cpp/Makefile
+++ b/cpp/Makefile
@@ -51,29 +51,56 @@ CXXFLAGS += -std=c++11 -O
 # ---- Targets to build ----
 
 LIB = qrcodegencpp
-LIBFILE = lib$(LIB).a
+LIBFILE = lib$(LIB).so
+SO_NAME = $(LIBFILE).1
+REAL_NAME = $(LIBFILE).$(VERSION)
+PCFILE := $(LIB).pc
+HEADERS = qrcodegen.hpp
 LIBOBJ = qrcodegen.o
 MAINS = QrCodeGeneratorDemo
 
+MULTIARCH = $(shell $(CC) --print-multiarch)
+
+PREFIX = /usr
+INCLUDEDIR = include/qrcodegen
+LIBDIR = lib/$(MULTIARCH)
+
 # Build all binaries
-all: $(LIBFILE) $(MAINS)
+all: $(LIBFILE) $(PCFILE)
 
 # Delete build output
 clean:
-	rm -f -- $(LIBOBJ) $(LIBFILE) $(MAINS:=.o) $(MAINS)
+	rm -f -- $(LIBOBJ) $(LIBFILE) $(MAINS:=.o) $(MAINS) $(PCFILE)
 	rm -rf .deps
 
+.PHONY: install-shared install-header install
+install: install-shared install-header
+
+install-shared: $(LIBFILE)
+	install -d $(DESTDIR)$(PREFIX)/$(LIBDIR)
+	install -m 444 $< $(DESTDIR)$(PREFIX)/$(LIBDIR)/$(REAL_NAME)
+	ln -sf $(REAL_NAME) $(DESTDIR)$(PREFIX)/$(LIBDIR)/$(SO_NAME)
+	ln -sf $(SO_NAME) $(DESTDIR)$(PREFIX)/$(LIBDIR)/$(LIBFILE)
+
+install-header: $(HEADERS) $(PCFILE)
+	install -d $(DESTDIR)$(PREFIX)/$(INCLUDEDIR) $(DESTDIR)$(PREFIX)/$(LIBDIR)/pkgconfig
+	install -m 444 $(HEADERS) $(DESTDIR)$(PREFIX)/$(INCLUDEDIR)/
+	install -m 444 $(PCFILE) $(DESTDIR)$(PREFIX)/$(LIBDIR)/pkgconfig/
+
 # Executable files
 %: %.o $(LIBFILE)
-	$(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $< -L . -l $(LIB)
+	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ $< -L . -l $(LIB) $(LDFLAGS)
 
 # The library
 $(LIBFILE): $(LIBOBJ)
+	$(CXX) -shared -Wl,-soname,$(SO_NAME) $(LDFLAGS) -o $@ $^
-	$(AR) -crs $@ -- $^
 
+$(PCFILE): $(PCFILE).in
+	sed 's|@prefix@|$(PREFIX)|; s|@libdir@|$(LIBDIR)|; s|@includedir@|$(INCLUDEDIR)|; s|@version@|$(VERSION)|' $< > $@
+
 # Object files
 %.o: %.cpp .deps/timestamp
-	$(CXX) $(CXXFLAGS) -c -o $@ -MMD -MF .deps/$*.d $<
+	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -fPIC -c -o $@ -MMD -MF .deps/$*.d $< 
 
 # Have a place to store header dependencies automatically generated by compiler
 .deps/timestamp:
diff --git a/cpp/qrcodegencpp.pc.in b/cpp/qrcodegencpp.pc.in
new file mode 100644
index 0000000..6c170ba
--- /dev/null
+++ b/cpp/qrcodegencpp.pc.in
@@ -0,0 +1,10 @@
+prefix=@prefix@
+libdir=${prefix}/@libdir@
+includedir=${prefix}/@includedir@
+
+Name: qrcodegencpp
+Description: QR Code generator library in multiple languages - C++ version
+Version: @version@
+URL: https://github.com/nayuki/QR-Code-generator
+Libs: -L${libdir} -lqrcodegencpp
+Cflags: -I${includedir}
