This patch adds the ability to run ABI breakage checks to meson. To do this the developer needs to set the meson build type to debug and set the version of DPDK that they want to check the ABI against. The option "abi_checks" has been added to meson for this, the option accepts DPDK tags e.g. "latest" or "v20.11". Example meson command: "meson -Dbuildtype=debug -Dabi_checks=v20.11 build" When the build is done using ninja the ABI checks will be performed if any breakages are present the build will fail.
Signed-off-by: Conor Walsh <conor.wa...@intel.com> --- buildtools/meson.build | 20 ++++++++++++++++++++ config/meson.build | 9 +++++++++ drivers/meson.build | 15 +++++++++++++++ lib/meson.build | 15 +++++++++++++++ meson_options.txt | 2 ++ 5 files changed, 61 insertions(+) diff --git a/buildtools/meson.build b/buildtools/meson.build index 04808dabc..63513a273 100644 --- a/buildtools/meson.build +++ b/buildtools/meson.build @@ -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() diff --git a/config/meson.build b/config/meson.build index 6996e5cbe..65f8ea4d7 100644 --- a/config/meson.build +++ b/config/meson.build @@ -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>')) diff --git a/drivers/meson.build b/drivers/meson.build index 5f9526557..c82fbc250 100644 --- a/drivers/meson.build +++ b/drivers/meson.build @@ -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) diff --git a/lib/meson.build b/lib/meson.build index 3852c0156..e864e0440 100644 --- a/lib/meson.build +++ b/lib/meson.build @@ -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 diff --git a/meson_options.txt b/meson_options.txt index 9bf18ab6b..26ac48f45 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -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: '', -- 2.25.1