From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id D2A7EA04F1; Fri, 13 Dec 2019 15:03:35 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id AC9E51BF7E; Fri, 13 Dec 2019 15:03:35 +0100 (CET) Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by dpdk.org (Postfix) with ESMTP id 913A01BF7C for ; Fri, 13 Dec 2019 15:03:33 +0100 (CET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 13 Dec 2019 06:03:32 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,309,1571727600"; d="scan'208";a="204329894" Received: from silpixa00399838.ir.intel.com (HELO silpixa00399838.ger.corp.intel.com) ([10.237.222.157]) by orsmga007.jf.intel.com with ESMTP; 13 Dec 2019 06:03:30 -0800 From: Kevin Laatz To: dev@dpdk.org Cc: thomas@monjalon.net, david.marchand@redhat.com, bruce.richardson@intel.com, ray.kinsella@intel.com, tdu@semihalf.com, zr@semihalf.com, cernay@netcope.com, Kevin Laatz Date: Fri, 13 Dec 2019 14:03:01 +0000 Message-Id: <20191213140302.4252-3-kevin.laatz@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20191213140302.4252-1-kevin.laatz@intel.com> References: <20191211182147.19355-1-kevin.laatz@intel.com> <20191213140302.4252-1-kevin.laatz@intel.com> Subject: [dpdk-dev] [PATCH v5 2/3] build: add abi checks to meson X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" 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 Signed-off-by: Bruce Richardson --- 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 diff --git a/buildtools/dpdk.abignore b/buildtools/dpdk.abignore new file mode 100644 index 000000000..b866b7f26 --- /dev/null +++ b/buildtools/dpdk.abignore @@ -0,0 +1,2 @@ +[suppress_function] + symbol_version = EXPERIMENTAL diff --git a/buildtools/meson.build b/buildtools/meson.build index 6ef2c5721..378f8d07e 100644 --- a/buildtools/meson.build +++ b/buildtools/meson.build @@ -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() diff --git a/config/meson.build b/config/meson.build index 01911ecf9..ea680af33 100644 --- a/config/meson.build +++ b/config/meson.build @@ -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()) diff --git a/devtools/gen-abi-dump.sh b/devtools/gen-abi-dump.sh new file mode 100755 index 000000000..bc6eac8c8 --- /dev/null +++ b/devtools/gen-abi-dump.sh @@ -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 diff --git a/drivers/meson.build b/drivers/meson.build index 4b17662b7..db58a67b9 100644 --- a/drivers/meson.build +++ b/drivers/meson.build @@ -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) diff --git a/lib/meson.build b/lib/meson.build index 0af3efab2..f0aba6635 100644 --- a/lib/meson.build +++ b/lib/meson.build @@ -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 diff --git a/meson.build b/meson.build index b7ae9c8d9..e840ccea7 100644 --- a/meson.build +++ b/meson.build @@ -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 diff --git a/meson_options.txt b/meson_options.txt index bc369d06c..0c651cef3 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -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-', -- 2.17.1