From 3f6f569854504af1d7a5b293f378990d75a18b23 Mon Sep 17 00:00:00 2001 From: Lance Hartmann Date: Fri, 10 Aug 2018 14:08:56 -0400 Subject: [PATCH] shared_lib: Update shared lib build and install Updates build and install of shared lib to conform with standard naming conventions for shared libraries, including the setting of the lib's soname. Change-Id: Ib46d298ab5f77fd8c32b7c04022b546446189428 Signed-off-by: Lance Hartmann Reviewed-on: https://review.gerrithub.io/421936 Tested-by: SPDK CI Jenkins Chandler-Test-Pool: SPDK Automated Test System Reviewed-by: Ben Walker Reviewed-by: Jim Harris --- .gitignore | 1 + mk/spdk.common.mk | 45 ++++++++++++++++++++++++++++++++++++++++----- shared_lib/Makefile | 21 ++++++++++----------- 3 files changed, 51 insertions(+), 16 deletions(-) diff --git a/.gitignore b/.gitignore index bb07e034f..4319ed645 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ *.o *.pyc *.so +*.so.* *.swp *.DS_Store ut_coverage/ diff --git a/mk/spdk.common.mk b/mk/spdk.common.mk index 461961b0b..728b0f15a 100644 --- a/mk/spdk.common.mk +++ b/mk/spdk.common.mk @@ -227,6 +227,25 @@ LINK_CXX=\ $(Q)echo " LINK $S/$@"; \ $(CXX) -o $@ $(CPPFLAGS) $(LDFLAGS) $(OBJS) $(LIBS) $(SYS_LIBS) +# +# Variables to use for versioning shared libs +# +SO_VER := 1 +SO_MINOR := 0 +SO_SUFFIX_ALL := $(SO_VER).$(SO_MINOR) + +# Provide function to ease build of a shared lib +define spdk_build_realname_shared_lib + $(CC) -o $@ -shared $(CPPFLAGS) $(LDFLAGS) \ + -Wl,--soname,$(patsubst %.so.$(SO_SUFFIX_ALL),%.so.$(SO_VER),$(notdir $@)) \ + -Wl,--whole-archive $(1) -Wl,--no-whole-archive \ + -Wl,--version-script=$(2) \ + $(3) +endef + +BUILD_LINKERNAME_LIB=\ + ln -sf $(notdir $<) $@ + # Archive $(OBJS) into $@ (.a) LIB_C=\ $(Q)echo " LIB $(notdir $@)"; \ @@ -243,11 +262,27 @@ INSTALL_LIB=\ install -d -m 755 "$(DESTDIR)$(libdir)"; \ install -m 644 "$(LIB)" "$(DESTDIR)$(libdir)/" -# Install a shared library -INSTALL_SHARED_LIB=\ - $(Q)echo " INSTALL $(DESTDIR)$(libdir)/$(notdir $(SHARED_LIB))"; \ - install -d -m 755 "$(DESTDIR)$(libdir)"; \ - install -m 644 "$(SHARED_LIB)" "$(DESTDIR)$(libdir)/" +ifeq ($(OS),FreeBSD) +INSTALL_REL_SYMLINK := install -l rs +else +INSTALL_REL_SYMLINK := ln -sf -r +endif + +define spdk_install_lib_symlink + $(INSTALL_REL_SYMLINK) $(DESTDIR)$(libdir)/$(1).$(SO_SUFFIX_ALL) $(DESTDIR)$(libdir)/$(1) +endef + +# Install shared library(s) +define spdk_install_shared_libs + $(Q)echo " INSTALL $(DESTDIR)$(libdir)/$(notdir $(1))" + install -d -m 755 $(DESTDIR)$(libdir) + @for l in $(1); do \ + bln=$${l##*/}; \ + rn=$$l.$(SO_SUFFIX_ALL); \ + install -m 755 $$rn $(DESTDIR)$(libdir)/; \ + $(call spdk_install_lib_symlink,$$bln); \ + done +endef # Install an app binary INSTALL_APP=\ diff --git a/shared_lib/Makefile b/shared_lib/Makefile index ed32c45a6..7dd8e059e 100644 --- a/shared_lib/Makefile +++ b/shared_lib/Makefile @@ -37,7 +37,8 @@ include $(SPDK_ROOT_DIR)/mk/spdk.app.mk include $(SPDK_ROOT_DIR)/mk/spdk.modules.mk # Build combined libspdk.so shared library -SHARED_LIB = $(SPDK_ROOT_DIR)/build/lib/libspdk.so +COMBINED_LINKERNAME_LIB = $(SPDK_ROOT_DIR)/build/lib/libspdk.so +COMBINED_SHARED_LIB = $(COMBINED_LINKERNAME_LIB).$(SO_SUFFIX_ALL) SPDK_LIB_LIST += app_rpc SPDK_LIB_LIST += bdev @@ -85,24 +86,22 @@ LIBS += $(ENV_LINKER_ARGS) comma := , -$(SHARED_LIB): $(SPDK_LIB_FILES) $(SPDK_WHOLE_LIBS) $(BLOCKDEV_MODULES_FILES) $(COPY_MODULES_FILES) $(SOCK_MODULES_FILES) $(LINKER_MODULES) $(ENV_LIBS) $(MAKEFILE_LIST) spdk.map +$(COMBINED_SHARED_LIB): $(SPDK_LIB_FILES) $(SPDK_WHOLE_LIBS) $(BLOCKDEV_MODULES_FILES) $(COPY_MODULES_FILES) $(SOCK_MODULES_FILES) $(LINKER_MODULES) $(ENV_LIBS) $(MAKEFILE_LIST) spdk.map $(Q)echo " SO $(notdir $@)"; \ rm -f $@; \ - $(CC) -o $@ -shared $(CPPFLAGS) $(LDFLAGS) \ - -Wl,--whole-archive \ - $(filter-out -Wl$(comma)--no-whole-archive,$(LIBS)) \ - -Wl,--no-whole-archive \ - -Wl,--version-script=spdk.map \ - $(SYS_LIBS) + $(call spdk_build_realname_shared_lib,$(filter-out -Wl$(comma)--no-whole-archive,$(LIBS)),spdk.map,$(SYS_LIBS)) + +$(COMBINED_LINKERNAME_LIB) : %.so : %.so.$(SO_SUFFIX_ALL) + $(BUILD_LINKERNAME_LIB) .PHONY: all clean $(DIRS-y) -all: $(SHARED_LIB) +all: $(COMBINED_SHARED_LIB) $(COMBINED_LINKERNAME_LIB) clean: - $(CLEAN_C) $(SHARED_LIB) + $(CLEAN_C) $(COMBINED_SHARED_LIB) $(COMBINED_LINKERNAME_LIB) install: - $(INSTALL_SHARED_LIB) + $(call spdk_install_shared_libs, $(COMBINED_LINKERNAME_LIB)) include $(SPDK_ROOT_DIR)/mk/spdk.subdirs.mk