build: fix soname info for 19.11 compatibility

The soname for each stable ABI version should be just the ABI version major
number without the minor number. Unfortunately both major and minor were
used causing version 20.1 to be incompatible with 20.0.

This patch fixes the issue by switching from 2-part to 3-part ABI version
numbers so that we can keep 20.0 as soname and using the final digits to
identify the 20.x releases which are ABI compatible. This requires changes
to both make and meson builds to handle the three-digit version and shrink
it to 2-digit for soname.

The final fix needed in this patch is to adjust the library version number
for the ethtool example library, which needs to be upped to 2-digits, as
external libraries using the DPDK build system also use the logic in this
file.

Fixes: cba806e07d ("build: change ABI versioning to global")

Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Tested-by: Ray Kinsella <mdr@ashroe.eu>
Tested-by: Ferruh Yigit <ferruh.yigit@intel.com>
Tested-by: Kevin Laatz <kevin.laatz@intel.com>
Tested-by: David Marchand <david.marchand@redhat.com>
This commit is contained in:
Bruce Richardson 2019-12-12 11:58:26 +00:00 committed by Thomas Monjalon
parent 924e55fb34
commit f26c2b39b2
6 changed files with 27 additions and 14 deletions

View File

@ -1 +1 @@
20.1 20.0.1

View File

@ -20,9 +20,19 @@ pver = meson.project_version().split('.')
major_version = '@0@.@1@'.format(pver.get(0), pver.get(1)) major_version = '@0@.@1@'.format(pver.get(0), pver.get(1))
abi_version = run_command(find_program('cat', 'more'), abi_version = run_command(find_program('cat', 'more'),
abi_version_file).stdout().strip() abi_version_file).stdout().strip()
# experimental libraries are versioned as 0.majorminor versions, e.g. 0.201
ever = abi_version.split('.') # Regular libraries have the abi_version as the filename extension
experimental_abi_version = '0.@0@@1@'.format(ever.get(0), ever.get(1)) # and have the soname be all but the final part of the abi_version.
# Experimental libraries have soname with '0.major'
# and the filename suffix as 0.majorminor versions,
# e.g. v20.1 => librte_stable.so.20.1, librte_experimental.so.0.201
# sonames => librte_stable.so.20, librte_experimental.so.0.20
# e.g. v20.0.1 => librte_stable.so.20.0.1, librte_experimental.so.0.2001
# sonames => librte_stable.so.20.0, librte_experimental.so.0.200
abi_va = abi_version.split('.')
stable_so_version = abi_va.length() == 2 ? abi_va[0] : abi_va[0] + '.' + abi_va[1]
experimental_abi_version = '0.' + ''.join(abi_va)
experimental_so_version = '0.' + ''.join(stable_so_version.split('.'))
# extract all version information into the build configuration # extract all version information into the build configuration
dpdk_conf.set('RTE_VER_YEAR', pver.get(0).to_int()) dpdk_conf.set('RTE_VER_YEAR', pver.get(0).to_int())

View File

@ -132,10 +132,10 @@ foreach class:dpdk_driver_classes
if is_experimental != 0 if is_experimental != 0
lib_version = experimental_abi_version lib_version = experimental_abi_version
so_version = experimental_abi_version so_version = experimental_so_version
else else
lib_version = abi_version lib_version = abi_version
so_version = abi_version so_version = stable_so_version
endif endif
# now build the static driver # now build the static driver

View File

@ -18,7 +18,7 @@ endif
# library name # library name
LIB = librte_ethtool.a LIB = librte_ethtool.a
LIBABIVER := 1 LIBABIVER := 0.1
# all source are stored in SRC-Y # all source are stored in SRC-Y
SRCS-y := rte_ethtool.c SRCS-y := rte_ethtool.c

View File

@ -113,10 +113,10 @@ foreach l:libraries
if is_experimental != 0 if is_experimental != 0
lib_version = experimental_abi_version lib_version = experimental_abi_version
so_version = experimental_abi_version so_version = experimental_so_version
else else
lib_version = abi_version lib_version = abi_version
so_version = abi_version so_version = stable_so_version
endif endif
# first build static lib # first build static lib

View File

@ -11,14 +11,16 @@ EXTLIB_BUILD ?= n
# VPATH contains at least SRCDIR # VPATH contains at least SRCDIR
VPATH += $(SRCDIR) VPATH += $(SRCDIR)
ifneq ($(shell grep -s "^DPDK_" $(SRCDIR)/$(EXPORT_MAP)),) LIBABIVER ?= $(shell cat $(RTE_SRCDIR)/ABI_VERSION)
LIBABIVER := $(shell cat $(RTE_SRCDIR)/ABI_VERSION) SOVER := $(basename $(LIBABIVER))
else ifeq ($(LIBABIVER),) ifeq ($(shell grep -s "^DPDK_" $(SRCDIR)/$(EXPORT_MAP)),)
# EXPERIMENTAL ABI is versioned as 0.major+minor, e.g. 0.201 for 20.1 ABI # EXPERIMENTAL ABI is versioned as 0.major+minor, e.g. 0.201 for 20.1 ABI
LIBABIVER := 0.$(shell cat $(RTE_SRCDIR)/ABI_VERSION | tr -d '.') LIBABIVER := 0.$(shell echo $(LIBABIVER) | tr -d '.')
SOVER := 0.$(shell echo $(SOVER) | tr -d '.')
endif endif
ifeq ($(CONFIG_RTE_BUILD_SHARED_LIB),y) ifeq ($(CONFIG_RTE_BUILD_SHARED_LIB),y)
SONAME := $(patsubst %.a,%.so.$(SOVER),$(LIB))
LIB := $(patsubst %.a,%.so.$(LIBABIVER),$(LIB)) LIB := $(patsubst %.a,%.so.$(LIBABIVER),$(LIB))
ifeq ($(EXTLIB_BUILD),n) ifeq ($(EXTLIB_BUILD),n)
CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP) CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP)
@ -74,7 +76,7 @@ NO_UNDEFINED := -z defs
endif endif
O_TO_S = $(LD) -L$(RTE_SDK_BIN)/lib $(_CPU_LDFLAGS) $(EXTRA_LDFLAGS) \ O_TO_S = $(LD) -L$(RTE_SDK_BIN)/lib $(_CPU_LDFLAGS) $(EXTRA_LDFLAGS) \
-shared $(OBJS-y) $(NO_UNDEFINED) $(LDLIBS) -Wl,-soname,$(LIB) -o $(LIB) -shared $(OBJS-y) $(NO_UNDEFINED) $(LDLIBS) -Wl,-soname,$(SONAME) -o $(LIB)
O_TO_S_STR = $(subst ','\'',$(O_TO_S)) #'# fix syntax highlight O_TO_S_STR = $(subst ','\'',$(O_TO_S)) #'# fix syntax highlight
O_TO_S_DISP = $(if $(V),"$(O_TO_S_STR)"," LD $(@)") O_TO_S_DISP = $(if $(V),"$(O_TO_S_STR)"," LD $(@)")
O_TO_S_DO = @set -e; \ O_TO_S_DO = @set -e; \
@ -133,6 +135,7 @@ $(RTE_OUTPUT)/lib/$(LIB): $(LIB)
$(Q)cp -f $(LIB) $(RTE_OUTPUT)/lib $(Q)cp -f $(LIB) $(RTE_OUTPUT)/lib
ifeq ($(CONFIG_RTE_BUILD_SHARED_LIB),y) ifeq ($(CONFIG_RTE_BUILD_SHARED_LIB),y)
$(Q)ln -s -f $< $(shell echo $@ | sed 's/\.so.*/.so/') $(Q)ln -s -f $< $(shell echo $@ | sed 's/\.so.*/.so/')
$(Q)ln -s -f $< $(shell echo $@ | sed 's/\.so.*/.so.$(SOVER)/')
endif endif
# #