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:
parent
69b1bb49ed
commit
cba806e07d
1
ABI_VERSION
Normal file
1
ABI_VERSION
Normal file
@ -0,0 +1 @@
|
|||||||
|
20.0
|
@ -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_']
|
||||||
|
@ -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
|
||||||
#
|
#
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
-----------------
|
-----------------
|
||||||
|
@ -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
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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,
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user