build: change ABI versioning to global

As per new ABI policy [1], all of the libraries are now versioned using
one global ABI version. Stable libraries use the MAJOR.MINOR ABI
version for their shared objects, while experimental libraries
use the 0.MAJORMINOR convention for their versioning.
Experimental library versioning is managed globally. Changes in this
patch implement the necessary steps to enable that.

The CONFIG_RTE_MAJOR_ABI option was introduced to permit multiple
DPDK versions installed side by side. The problem is now addressed
through the new ABI policy, and thus can be removed.

[David] For external libraries relying on Makefile, LIBABIVER is
preserved to avoid using DPDK global ABI version.

[1] https://doc.dpdk.org/guides/contributing/abi_policy.html

Signed-off-by: Marcin Baran <marcinx.baran@intel.com>
Signed-off-by: Pawel Modrak <pawelx.modrak@intel.com>
Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
Signed-off-by: David Marchand <david.marchand@redhat.com>
Acked-by: Thomas Monjalon <thomas@monjalon.net>
This commit is contained in:
Marcin Baran 2019-11-20 17:23:28 +00:00 committed by David Marchand
parent 69b1bb49ed
commit cba806e07d
10 changed files with 48 additions and 44 deletions

1
ABI_VERSION Normal file
View File

@ -0,0 +1 @@
20.0

View File

@ -14,3 +14,6 @@ if python3.found()
else else
map_to_def_cmd = ['meson', 'runpython', files('map_to_def.py')] map_to_def_cmd = ['meson', 'runpython', files('map_to_def.py')]
endif endif
# stable ABI always starts with "DPDK_"
is_experimental_cmd = [find_program('grep', 'findstr'), '^DPDK_']

View File

@ -64,11 +64,6 @@ CONFIG_RTE_BUILD_SHARED_LIB=n
# #
CONFIG_RTE_NEXT_ABI=y CONFIG_RTE_NEXT_ABI=y
#
# Major ABI to overwrite library specific LIBABIVER
#
CONFIG_RTE_MAJOR_ABI=
# #
# Machine's cache line size # Machine's cache line size
# #

View File

@ -18,6 +18,11 @@ endforeach
# depending on the configuration options # depending on the configuration options
pver = meson.project_version().split('.') 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'),
files('../ABI_VERSION')).stdout().strip()
# experimental libraries are versioned as 0.majorminor versions, e.g. 0.201
ever = abi_version.split('.')
experimental_abi_version = '0.@0@@1@'.format(ever.get(0), ever.get(1))
# 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())
@ -37,7 +42,7 @@ endif
pmd_subdir_opt = get_option('drivers_install_subdir') pmd_subdir_opt = get_option('drivers_install_subdir')
if pmd_subdir_opt.contains('<VERSION>') if pmd_subdir_opt.contains('<VERSION>')
pmd_subdir_opt = major_version.join(pmd_subdir_opt.split('<VERSION>')) pmd_subdir_opt = abi_version.join(pmd_subdir_opt.split('<VERSION>'))
endif endif
driver_install_path = join_paths(get_option('libdir'), pmd_subdir_opt) driver_install_path = join_paths(get_option('libdir'), pmd_subdir_opt)
eal_pmd_path = join_paths(get_option('prefix'), driver_install_path) eal_pmd_path = join_paths(get_option('prefix'), driver_install_path)

View File

@ -111,16 +111,17 @@ how this may be done.
... ...
At the same time, the major ABI version is changed atomically across all At the same time, the major ABI version is changed atomically across all
libraries by incrementing the major version in individual library's soname, e.g. libraries by incrementing the major version in the ABI_VERSION file. This is
``libacl.so.21``. This is done by bumping the LIBABIVER number in the libraries done globally for all libraries that declare a stable ABI. For libraries marked
Makefile to indicate to dynamic linking applications that this is a later, and as EXPERIMENTAL, their major ABI version is always set to 0.
possibly incompatible library version:
.. code-block:: c Minor ABI versions
~~~~~~~~~~~~~~~~~~
-LIBABIVER := 20
+LIBABIVER := 21
Each non-LTS release will also increment minor ABI version, to permit multiple
DPDK versions being installed alongside each other. Both stable and
experimental ABI's are versioned using the global version file that is updated
at the start of each release cycle, and are managed at the project level.
Versioning Macros Versioning Macros
----------------- -----------------

View File

@ -803,9 +803,8 @@ lpm, etc. For drivers, the same format of Makefile is used.
CFLAGS += -O3 CFLAGS += -O3
CFLAGS += $(WERROR_FLAGS) CFLAGS += $(WERROR_FLAGS)
# the symbol version information for the library, and .so version # the symbol version information for the library
EXPORT_MAP := rte_<name>_version.map EXPORT_MAP := rte_<name>_version.map
LIBABIVER := 1
# all source filenames are stored in SRCS-y # all source filenames are stored in SRCS-y
SRCS-$(CONFIG_RTE_LIBRTE_<NAME>) += rte_<name>.c SRCS-$(CONFIG_RTE_LIBRTE_<NAME>) += rte_<name>.c
@ -955,11 +954,6 @@ use_function_versioning
twice with suitable parameters for each of shared or static library twice with suitable parameters for each of shared or static library
builds. builds.
version
**Default Value = 1**.
Specifies the ABI version of the library, and is used as the major
version number of the resulting ``.so`` library.
Meson Build File Contents - Drivers Meson Build File Contents - Drivers
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@ -41,7 +41,6 @@ foreach class:dpdk_driver_classes
build = true # set to false to disable, e.g. missing deps build = true # set to false to disable, e.g. missing deps
reason = '<unknown reason>' # set if build == false to explain reason = '<unknown reason>' # set if build == false to explain
name = drv name = drv
version = 1
allow_experimental_apis = false allow_experimental_apis = false
sources = [] sources = []
objs = [] objs = []
@ -124,12 +123,19 @@ foreach class:dpdk_driver_classes
output: out_filename, output: out_filename,
depends: [pmdinfogen, tmp_lib]) depends: [pmdinfogen, tmp_lib])
if get_option('per_library_versions') version_map = '@0@/@1@/@2@_version.map'.format(
lib_version = '@0@.1'.format(version) meson.current_source_dir(),
so_version = '@0@'.format(version) drv_path, lib_name)
is_experimental = run_command(is_experimental_cmd,
files(version_map)).returncode()
if is_experimental != 0
lib_version = experimental_abi_version
so_version = experimental_abi_version
else else
lib_version = major_version lib_version = abi_version
so_version = major_version so_version = abi_version
endif endif
# now build the static driver # now build the static driver

View File

@ -47,7 +47,6 @@ foreach l:libraries
build = true build = true
reason = '<unknown reason>' # set if build == false to explain why reason = '<unknown reason>' # set if build == false to explain why
name = l name = l
version = 1
allow_experimental_apis = false allow_experimental_apis = false
use_function_versioning = false use_function_versioning = false
sources = [] sources = []
@ -106,12 +105,18 @@ foreach l:libraries
cflags += '-DRTE_USE_FUNCTION_VERSIONING' cflags += '-DRTE_USE_FUNCTION_VERSIONING'
endif endif
if get_option('per_library_versions') version_map = '@0@/@1@/rte_@2@_version.map'.format(
lib_version = '@0@.1'.format(version) meson.current_source_dir(), dir_name, name)
so_version = '@0@'.format(version)
is_experimental = run_command(is_experimental_cmd,
files(version_map)).returncode()
if is_experimental != 0
lib_version = experimental_abi_version
so_version = experimental_abi_version
else else
lib_version = major_version lib_version = abi_version
so_version = major_version so_version = abi_version
endif endif
# first build static lib # first build static lib

View File

@ -28,8 +28,6 @@ option('max_lcores', type: 'integer', value: 128,
description: 'maximum number of cores/threads supported by EAL') description: 'maximum number of cores/threads supported by EAL')
option('max_numa_nodes', type: 'integer', value: 4, option('max_numa_nodes', type: 'integer', value: 4,
description: 'maximum number of NUMA nodes supported by EAL') description: 'maximum number of NUMA nodes supported by EAL')
option('per_library_versions', type: 'boolean', value: true,
description: 'true: each lib gets its own version number, false: DPDK version used for each lib')
option('tests', type: 'boolean', value: true, option('tests', type: 'boolean', value: true,
description: 'build unit tests') description: 'build unit tests')
option('use_hpet', type: 'boolean', value: false, option('use_hpet', type: 'boolean', value: false,

View File

@ -11,20 +11,16 @@ EXTLIB_BUILD ?= n
# VPATH contains at least SRCDIR # VPATH contains at least SRCDIR
VPATH += $(SRCDIR) VPATH += $(SRCDIR)
ifneq ($(CONFIG_RTE_MAJOR_ABI),) ifneq ($(shell grep -s "^DPDK_" $(SRCDIR)/$(EXPORT_MAP)),)
ifneq ($(LIBABIVER),) LIBABIVER := $(shell cat $(RTE_SRCDIR)/ABI_VERSION)
LIBABIVER := $(CONFIG_RTE_MAJOR_ABI) else ifeq ($(LIBABIVER),)
endif # 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 '.')
endif endif
ifeq ($(CONFIG_RTE_BUILD_SHARED_LIB),y) ifeq ($(CONFIG_RTE_BUILD_SHARED_LIB),y)
LIB := $(patsubst %.a,%.so.$(LIBABIVER),$(LIB)) LIB := $(patsubst %.a,%.so.$(LIBABIVER),$(LIB))
ifeq ($(EXTLIB_BUILD),n) ifeq ($(EXTLIB_BUILD),n)
ifeq ($(CONFIG_RTE_MAJOR_ABI),)
ifeq ($(CONFIG_RTE_NEXT_ABI),y)
LIB := $(LIB).1
endif
endif
CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP) CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP)
endif endif
endif endif