package/zmqpp: fix static build issues
authorJörg Krause <joerg.krause@embedded.rocks>
Mon, 23 Nov 2015 22:23:21 +0000 (23:23 +0100)
committerThomas Petazzoni <thomas.petazzoni@free-electrons.com>
Sun, 29 Nov 2015 14:09:27 +0000 (15:09 +0100)
The Makefile for zmqpp builds both shared and static libraries and the client
binary. This leads to several build issues in a pure static library context:
  * R_ARM_TLS_LE32 relocation not permitted in shared object
  * relocation R_ARC_32_ME against `_ZSt7nothrow' can not be used when making
    a shared object; recompile with -fPIC

We add a minimal patch to add some basic handling of building a shared or a
static library only.

Additionally, disable the client for static only builds as it depends on
building the shared library in zmqpp's Makefile. As there is already version
4.1.2 available which provides a CMake build file which solves this issue
(probably, not tested) we don't care for now.

Fixes:
http://autobuild.buildroot.net/results/345/345771eb488c60585e388fbbf4490df936e88e19/
http://autobuild.buildroot.net/results/21b/21b6912c70a5c300bdabde53bee6a1d9cc3bbb02/
http://autobuild.buildroot.net/results/d98/d9882d2ba00da16f76cea6d86a84cd4815ebbba2/

[Thomas:
 - don't change TARGET_CONFIGURE_OPTS, use ZMQPP_MAKE_OPTS instead.
 - simplify condition logic.]

Signed-off-by: Jörg Krause <joerg.krause@embedded.rocks>
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
package/zmqpp/0002-Allow-building-shared-or-static-library-only.patch [new file with mode: 0644]
package/zmqpp/Config.in
package/zmqpp/zmqpp.mk

diff --git a/package/zmqpp/0002-Allow-building-shared-or-static-library-only.patch b/package/zmqpp/0002-Allow-building-shared-or-static-library-only.patch
new file mode 100644 (file)
index 0000000..4eabf23
--- /dev/null
@@ -0,0 +1,81 @@
+From 4c83dd96d1f92627ecdb6b6ed80b8c278aea82f7 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?J=C3=B6rg=20Krause?= <joerg.krause@embedded.rocks>
+Date: Fri, 20 Nov 2015 19:51:50 +0100
+Subject: [PATCH] Allow building shared or static library only
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Jörg Krause <joerg.krause@embedded.rocks>
+---
+ Makefile | 19 ++++++++++++++++---
+ 1 file changed, 16 insertions(+), 3 deletions(-)
+
+diff --git a/Makefile b/Makefile
+index 7d63077..90c7059 100644
+--- a/Makefile
++++ b/Makefile
+@@ -57,6 +57,9 @@ LIBRARY_ARCHIVE = lib$(LIBRARY_NAME).a
+ CLIENT_TARGET   = $(LIBRARY_NAME)
+ TESTS_TARGET    = $(LIBRARY_NAME)-tests
++BUILD_SHARED   ?= yes
++BUILD_SHARED   ?= yes
++
+ CONFIG_FLAGS =
+ ifeq ($(CONFIG),debug)
+       CONFIG_FLAGS = -g -fno-inline -ftemplate-depth-1000
+@@ -71,7 +74,7 @@ ifneq (,$(findstring $(CONFIG),release loadtest))
+       CONFIG_FLAGS = -O3 -funroll-loops -ffast-math -finline-functions -fomit-frame-pointer -DNO_DEBUG_LOG -DNO_TRACE_LOG -DNDEBUG
+ endif
+-COMMON_FLAGS = -MMD -std=c++0x -pipe -Wall -fPIC \
++COMMON_FLAGS = -MMD -std=c++0x -pipe -Wall \
+       -DBUILD_ENV=$(CONFIG) \
+       -DBUILD_VERSION='"$(APP_VERSION)"' \
+       -DBUILD_VERSION_MAJOR=$(VERSION_MAJOR) \
+@@ -82,6 +85,15 @@ COMMON_FLAGS = -MMD -std=c++0x -pipe -Wall -fPIC \
+       -DBUILD_CLIENT_NAME='"$(CLIENT_TARGET)"' \
+       -I$(SRC_PATH)
++ifeq ($(BUILD_SHARED),yes)
++COMMON_FLAGS += -fPIC
++LIBRARY_TARGETS += $(LIBRARY_SHARED)
++endif
++
++ifeq ($(BUILD_STATIC),yes)
++LIBRARY_TARGETS += $(LIBRARY_ARCHIVE)
++endif
++
+ COMMON_LIBS = -lzmq
+ LIBRARY_LIBS =  
+@@ -125,9 +137,11 @@ check: $(LIBRARY_SHARED) $(LIBRARY_ARCHIVE) test
+ install:
+       install -m 644 $(ALL_LIBRARY_INCLUDES) $(INCLUDEDIR)/$(LIBRARY_DIR)
++ifeq ($(BUILD_SHARED),yes)
+       install -m 755 $(BUILD_PATH)/$(LIBRARY_SHARED).$(VERSION_MAJOR) $(LIBDIR)/$(LIBRARY_SHARED).$(APP_VERSION)
+       ln -sf $(LIBRARY_SHARED).$(APP_VERSION) $(LIBDIR)/$(LIBRARY_SHARED).$(VERSION_MAJOR)
+       ln -sf $(LIBRARY_SHARED).$(APP_VERSION) $(LIBDIR)/$(LIBRARY_SHARED)
++endif
+       if [ -f $(BUILD_PATH)/$(CLIENT_TARGET) ]; then install -m 755 $(BUILD_PATH)/$(CLIENT_TARGET) $(BINDIR); fi
+       $(LDCONFIG)
+       @echo "use make installcheck to test the install"
+@@ -148,7 +162,7 @@ clean:
+ client: $(CLIENT_TARGET)
+-library: $(LIBRARY_SHARED) $(LIBRARY_ARCHIVE)
++library: $(LIBRARY_TARGETS)
+ #
+ # BUILD Targets
+@@ -187,4 +201,3 @@ test: $(TESTS_TARGET)
+ $(OBJECT_PATH)/%.o: $(SRC_PATH)/%.cpp
+       -mkdir -p $(dir $@)
+       $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(COMMON_FLAGS) $(CONFIG_FLAGS) -c -o $@ $<
+-
+-- 
+2.6.2
+
index a10602f283cbf80c46dc78c866c583f595fe9f12..03792240d7f02365df3ee603049788452bf73bd0 100644 (file)
@@ -22,6 +22,7 @@ if BR2_PACKAGE_ZMQPP
 
 config BR2_PACKAGE_ZMQPP_CLIENT
        bool "zmqpp client"
+       depends on !BR2_STATIC_LIBS
        depends on BR2_TOOLCHAIN_HAS_THREADS # boost
        depends on BR2_PACKAGE_BOOST_ARCH_SUPPORTS
        select BR2_PACKAGE_BOOST
@@ -30,8 +31,8 @@ config BR2_PACKAGE_ZMQPP_CLIENT
          Build and install the zmqpp client, a command line tool that can be
          used to listen or send to zeromq sockets.
 
-comment "zmqpp client needs a toolchain w/ threads"
+comment "zmqpp client needs a toolchain w/ dynamic library, threads"
        depends on BR2_PACKAGE_BOOST_ARCH_SUPPORTS
-       depends on !BR2_TOOLCHAIN_HAS_THREADS
+       depends on BR2_STATIC_LIBS || !BR2_TOOLCHAIN_HAS_THREADS
 
 endif
index e506eaf7fffda163fa98d83d36dc35b39a0798d7..0bb6bbedca416c1e5b59e75021b597c28c41a1ed 100644 (file)
@@ -19,10 +19,18 @@ ifeq ($(BR2_PACKAGE_ZMQPP_CLIENT),y)
 ZMQPP_DEPENDENCIES += boost
 endif
 
+ifeq ($(BR2_STATIC_LIBS),y)
+ZMQPP_MAKE_OPTS += BUILD_STATIC=yes BUILD_SHARED=no
+else ifeq ($(BR2_SHARED_STATIC_LIBS),y)
+ZMQPP_MAKE_OPTS += BUILD_STATIC=yes BUILD_SHARED=yes
+else ifeq ($(BR2_SHARED_LIBS),y)
+ZMQPP_MAKE_OPTS += BUILD_STATIC=no BUILD_SHARED=yes
+endif
+
 define ZMQPP_BUILD_CMDS
        $(TARGET_MAKE_ENV) $(MAKE) $(TARGET_CONFIGURE_OPTS) \
                LDFLAGS="$(ZMQPP_LDFLAGS)" \
-               $(ZMQPP_MAKE_OPTS) $(if $(BR2_PACKAGE_ZMQPP_CLIENT),all) -C $(@D)
+               $(ZMQPP_MAKE_OPTS) $(if $(BR2_PACKAGE_ZMQPP_CLIENT),client,library) -C $(@D)
 endef
 
 define ZMQPP_INSTALL_TARGET_CMDS