This patch adds a script to generate ABI dump files. These files will be
required to perform ABI compatibility checks during the build later in the
patchset. This script should be run on a DPDK version with a stable ABI.
Since this is a tool designed for human use, we simplify it to just work
off a whole build directory, taking the parameter of the builddir and
generating the lib|drivers/abi dir. This is hardcoded into the script since
the meson build expects the .dump files in these directories.
The running of the scripts can be enabled/disabled using the new meson
option added in this patch. If enabled, the lib and drivers .so files will
be compared against any existing ABI dump files in lib|drivers/abi of the
source directory. If there are any incompatibilities, the build will fail
and display the incompatibility.
Signed-off-by: Kevin Laatz <kevin.laatz@intel.com>
Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
---
v2:
- fixed conditional around abi check custom target
- fixed conditional around abi check custom target
v3:
- fix typo in meson option name
v4:
- squash commits 3,4,5,6 into a single commit
- changes meson option from type boolean to feature
- update travis packages
- move check for windows to earlier in build
- add abignore file to suppress experimental functions
- make the directories we store dump files in hidden
v5:
- remove travis build with abi checks. This can be added as a separate
patch once the issue are fixed.
---
buildtools/dpdk.abignore | 2 ++
buildtools/meson.build | 3 +++
config/meson.build | 10 ++++++++++
devtools/gen-abi-dump.sh | 24 ++++++++++++++++++++++++
drivers/meson.build | 13 +++++++++++++
lib/meson.build | 13 +++++++++++++
meson.build | 4 ++++
meson_options.txt | 2 ++
8 files changed, 71 insertions(+)
create mode 100644 buildtools/dpdk.abignore
create mode 100755 devtools/gen-abi-dump.sh
new file mode 100644
@@ -0,0 +1,2 @@
+[suppress_function]
+ symbol_version = EXPERIMENTAL
@@ -7,6 +7,9 @@ pmdinfo = find_program('gen-pmdinfo-cfile.sh')
check_experimental_syms = find_program('check-experimental-syms.sh')
+abidiff = find_program('abidiff', required: compat_checks)
+abignore = files('dpdk.abignore')
+
# set up map-to-def script using python, either built-in or external
python3 = import('python').find_installation(required: false)
if python3.found()
@@ -34,6 +34,16 @@ stable_so_version = abi_va.length() == 2 ? abi_va[0] : abi_va[0] + '.' + abi_va[
experimental_abi_version = '0.' + ''.join(abi_va)
experimental_so_version = '0.' + ''.join(stable_so_version.split('.'))
+# compatibility checks not available on windows
+compat_checks = disabler()
+if not is_windows
+ compat_checks = get_option('compat_checks')
+endif
+
+if not get_option('debug') and compat_checks.enabled()
+ error('Build type must have debug symbols when compat_checks=enabled')
+endif
+
# extract all version information into the build configuration
dpdk_conf.set('RTE_VER_YEAR', pver.get(0).to_int())
dpdk_conf.set('RTE_VER_MONTH', pver.get(1).to_int())
new file mode 100755
@@ -0,0 +1,24 @@
+#!/bin/sh
+
+builddir=$1
+
+if [ -z "$builddir" ] ; then
+ echo "Usage: $(basename $0) build_dir"
+ exit 1
+fi
+
+if [ ! -d "$builddir" ] ; then
+ echo "Error: build directory, '$builddir', doesn't exist"
+ exit 1
+fi
+
+for d in lib drivers ; do
+ mkdir -p $d/.abi
+
+ for f in $builddir/$d/*.so* ; do
+ test -L "$f" && continue
+
+ libname=$(basename $f)
+ abidw --out-file $d/.abi/${libname%.so*}.dump $f || exit 1
+ done
+done
@@ -196,6 +196,19 @@ foreach class:dpdk_driver_classes
include_directories: includes,
dependencies: static_deps)
+ if abidiff.found()
+ custom_target('lib' + lib_name + '.abi_chk',
+ command: [abidiff, '--no-added-syms',
+ '--suppr', abignore,
+ files('.abi/lib' + lib_name + '.dump'),
+ '@INPUT@'],
+ input: shared_lib,
+ output: 'lib' + lib_name + '.abi_chk',
+ capture: true,
+ install: false,
+ build_by_default: is_experimental == 0)
+ endif
+
dpdk_drivers += static_lib
set_variable('shared_@0@'.format(lib_name), shared_dep)
@@ -180,6 +180,19 @@ foreach l:libraries
include_directories: includes,
dependencies: shared_deps)
+ if abidiff.found()
+ custom_target(dir_name + '.abi_chk',
+ command: [abidiff, '--no-added-syms',
+ '--suppr', abignore,
+ files('.abi/' + dir_name + '.dump'),
+ '@INPUT@'],
+ input: shared_lib,
+ output: dir_name + '.abi_chk',
+ capture: true,
+ install: false,
+ build_by_default: is_experimental == 0)
+ endif
+
dpdk_libraries = [shared_lib] + dpdk_libraries
dpdk_static_libraries = [static_lib] + dpdk_static_libraries
endif # sources.length() > 0
@@ -128,3 +128,7 @@ foreach drv:dpdk_drvs_disabled
output_message += drv + ':\t' + reason + '\n\t'
endforeach
message(output_message + '\n')
+
+if compat_checks.auto() and not get_option('debug')
+ warning('Build type must be have debug symbols to run compatibility checks!\n')
+endif
@@ -1,5 +1,7 @@
# Please keep these options sorted alphabetically.
+option('compat_checks', type: 'feature', value: 'auto',
+ description: 'Enable abi compatibility checks and experimental syms checks to run during the build. This requires debug build to be enabled.')
option('disable_drivers', type: 'string', value: '',
description: 'Comma-separated list of drivers to explicitly disable.')
option('drivers_install_subdir', type: 'string', value: 'dpdk/pmds-<VERSION>',