@@ -8,6 +8,26 @@ check_symbols = find_program('check-symbols.sh')
ldflags_ibverbs_static = find_program('options-ibverbs-static.sh')
binutils_avx512_check = find_program('binutils-avx512-check.sh')
+abi_checks = get_option('abi_checks')
+abi_dir = ''
+# If abi checks enabled setup abi dump directory
+if abi_checks!=''
+ message('ABI Checks are being setup, If DPDK_ABI_TAR_URI has not been set these checks may be need to be generated this could take several minutes')
+ setup_check = run_command('abi-setup.py','-t',abi_checks,'-d',meson.source_root()).stdout().strip()
+ # Check if error returned from script
+ if setup_check.startswith('ERROR')
+ error('ABI checks setup failed: '+setup_check)
+ # No error then set abi directory
+ else
+ abi_dir=setup_check
+ endif
+endif
+abidiff = find_program('abidiff', required: abi_checks!='')
+if abidiff.found()==false and abi_checks!=''
+ error('ABI checks require abidiff to to be completed')
+endif
+abignore = files(meson.source_root()+'/devtools/libabigail.abignore')
+
# set up map-to-win script using python, either built-in or external
python3 = import('python').find_installation(required: false)
if python3.found()
@@ -47,6 +47,15 @@ else
dpdk_conf.set('RTE_VER_RELEASE', 99)
endif
+# abi checks cannot be run on windows
+if is_windows and abi_checks!=''
+ error('ABI checks cannot be run on windows')
+endif
+# abi checks can only be run on a debug build
+if not get_option('debug') and abi_checks!=''
+ error('Build type must have debug symbols when abi_checks=enabled')
+endif
+
pmd_subdir_opt = get_option('drivers_install_subdir')
if pmd_subdir_opt.contains('<VERSION>')
pmd_subdir_opt = abi_version.join(pmd_subdir_opt.split('<VERSION>'))
@@ -208,6 +208,21 @@ foreach subpath:subdirs
include_directories: includes,
dependencies: static_deps)
+ # If abidiff found, abi checks are enabled and the abi dump files for the library are available run abi check
+ dump_name = abi_dir+'/lib' + lib_name + '.dump'
+ if abidiff.found() and abi_checks!='' and run_command('[', '-f', dump_name, ']').returncode() == 0
+ custom_target('lib' + lib_name + '.abi_chk',
+ command: [abidiff, '--no-added-syms',
+ '--suppr', abignore,
+ files(dump_name),
+ '@INPUT@'],
+ input: shared_lib,
+ output: 'lib' + lib_name + '.abi_chk',
+ capture: true,
+ install: false,
+ build_by_default: true)
+ endif
+
dpdk_drivers += static_lib
set_variable('shared_@0@'.format(lib_name), shared_dep)
@@ -190,6 +190,21 @@ foreach l:libraries
include_directories: includes,
dependencies: shared_deps)
+ # If abidiff found, abi checks are enabled and the abi dump files for the library are available run abi check
+ dump_name = abi_dir+'/' + dir_name + '.dump'
+ if abidiff.found() and abi_checks!='' and run_command('[', '-f', dump_name, ']').returncode() == 0
+ custom_target(dir_name + '.abi_chk',
+ command: [abidiff, '--no-added-syms',
+ '--suppr', abignore,
+ files(dump_name),
+ '@INPUT@'],
+ input: shared_lib,
+ output: dir_name + '.abi_chk',
+ capture: true,
+ install: false,
+ build_by_default: true)
+ endif
+
dpdk_libraries = [shared_lib] + dpdk_libraries
dpdk_static_libraries = [static_lib] + dpdk_static_libraries
endif # sources.length() > 0
@@ -1,5 +1,7 @@
# Please keep these options sorted alphabetically.
+option('abi_checks', type: 'string', value: '',
+ description: 'Enable abi compatibility checks to run during the build. This requires debug build to be enabled. Input is latest or git tag e.g. v20.11')
option('armv8_crypto_dir', type: 'string', value: '',
description: 'path to the armv8_crypto library installation directory')
option('disable_drivers', type: 'string', value: '',