From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by dpdk.org (Postfix) with ESMTP id B1C6A181 for ; Fri, 13 Mar 2015 12:57:02 +0100 (CET) Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga102.fm.intel.com with ESMTP; 13 Mar 2015 04:57:01 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.11,394,1422950400"; d="scan'208";a="679630804" Received: from irsmsx153.ger.corp.intel.com ([163.33.192.75]) by fmsmga001.fm.intel.com with ESMTP; 13 Mar 2015 04:57:00 -0700 Received: from irsmsx155.ger.corp.intel.com (163.33.192.3) by IRSMSX153.ger.corp.intel.com (163.33.192.75) with Microsoft SMTP Server (TLS) id 14.3.195.1; Fri, 13 Mar 2015 11:57:00 +0000 Received: from irsmsx105.ger.corp.intel.com ([169.254.7.117]) by irsmsx155.ger.corp.intel.com ([169.254.14.159]) with mapi id 14.03.0195.001; Fri, 13 Mar 2015 11:56:59 +0000 From: "Kavanagh, Mark B" To: Neil Horman , "dev@dpdk.org" Thread-Topic: [dpdk-dev] [PATCH v3] ABI: Add abi checking utility Thread-Index: AQHQVpgkwdoqBLEAH0akl46KovWCAJ0aWxJA Date: Fri, 13 Mar 2015 11:56:59 +0000 Message-ID: References: <1422652596-12777-1-git-send-email-nhorman@tuxdriver.com> <1425486419-12508-1-git-send-email-nhorman@tuxdriver.com> In-Reply-To: <1425486419-12508-1-git-send-email-nhorman@tuxdriver.com> Accept-Language: en-IE, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [163.33.239.181] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Subject: Re: [dpdk-dev] [PATCH v3] ABI: Add abi checking utility X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 13 Mar 2015 11:57:03 -0000 >-----Original Message----- >From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Neil Horman >Sent: Wednesday, March 4, 2015 4:27 PM >To: dev@dpdk.org >Subject: [dpdk-dev] [PATCH v3] ABI: Add abi checking utility > >There was a request for an abi validation utilty for the ongoing ABI stabi= lity >work. As it turns out there is a abi compliance checker in development th= at >seems to be under active development and provides fairly detailed ABI comp= liance >reports. Its not yet intellegent enough to understand symbol versioning, = but it >does provide the ability to identify symbols which have changed between >releases, along with details of the change, and offers developers the >opportunity to identify which symbols then need versioning and validation = for a >given update via manual testing. > >This script automates the use of the compliance checker between two arbitr= arily >specified tags within the dpdk tree. To execute enter the $RTE_SDK direct= ory >and run: > >./scripts/validate_abi.sh $GIT_TAG1 $GIT_TAG2 $CONFIG > >where $GIT_TAG1 and 2 are git tags and $CONFIG is a config specification >suitable for passing as the T=3D variable in the make config command. > >Note the upstream source for the abi compliance checker is here: >http://ispras.linuxbase.org/index.php/ABI_compliance_checker > >It generates a report for each DSO built from the requested tags that deve= lopers >can review to find ABI compliance issues. > >Signed-off-by: Neil Horman > >--- > >Change Notes: > >v2) Fixed some typos as requested by Thomas > >v3) Fixed some additional typos Thomas requested > Improved script to work from detached state > Added some documentation to the changelog > Added some comments to the scripts >--- > scripts/validate_abi.sh | 248 +++++++++++++++++++++++++++++++++++++++++++= +++++ > 1 file changed, 248 insertions(+) > create mode 100755 scripts/validate_abi.sh > >diff --git a/scripts/validate_abi.sh b/scripts/validate_abi.sh >new file mode 100755 >index 0000000..899cf5f >--- /dev/null >+++ b/scripts/validate_abi.sh >@@ -0,0 +1,248 @@ >+#!/bin/sh >+# BSD LICENSE >+# >+# Copyright(c) 2015 Neil Horman. All rights reserved. >+# All rights reserved. >+# >+# Redistribution and use in source and binary forms, with or without >+# modification, are permitted provided that the following conditions >+# are met: >+# >+# * Redistributions of source code must retain the above copyright >+# notice, this list of conditions and the following disclaimer. >+# * Redistributions in binary form must reproduce the above copyright >+# notice, this list of conditions and the following disclaimer in >+# the documentation and/or other materials provided with the >+# distribution. >+# >+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS >+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT >+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR >+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT >+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, >+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT >+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, >+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY >+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT >+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE >+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. >+ >+TAG1=3D$1 >+TAG2=3D$2 >+TARGET=3D$3 >+ABI_DIR=3D`mktemp -d -p /tmp ABI.XXXXXX` >+ >+usage() { >+ echo "$0 " >+} >+ >+log() { >+ local level=3D$1 >+ shift >+ echo "$*" >+} >+ >+validate_tags() { >+ git tag -l | grep -q "$TAG1" >+ if [ $? -ne 0 ] >+ then >+ echo "$TAG1 is invalid" >+ return >+ fi >+ git tag -l | grep -q "$TAG2" >+ if [ $? -ne 0 ] >+ then >+ echo "$TAG2 is invalid" >+ return >+ fi >+} >+ >+validate_args() { >+ if [ -z "$TAG1" ] >+ then >+ echo "Must Specify TAG1" >+ return >+ fi >+ if [ -z "$TAG2" ] >+ then >+ echo "Must Specify TAG2" >+ return >+ fi >+ if [ -z "$TARGET" ] >+ then >+ echo "Must Specify a build target" >+ fi >+} >+ >+ >+cleanup_and_exit() { >+ rm -rf $ABI_DIR >+ exit $1 >+} >+ >+########################################### >+#START >+############################################ >+ >+#trap on ctrl-c to clean up >+trap cleanup_and_exit SIGINT >+ >+#Save the current branch >+CURRENT_BRANCH=3D`git branch | grep \* | cut -d' ' -f2` >+ >+if [ -z "$CURRENT_BRANCH" ] >+then >+ CURRENT_BRANCH=3D`git log --pretty=3Dformat:%H HEAD~1..HEAD` >+fi >+ >+if [ -n "$VERBOSE" ] >+then >+ export VERBOSE=3D/dev/stdout >+else >+ export VERBOSE=3D/dev/null >+fi >+ >+# Validate that we have all the arguments we need >+res=3D$(validate_args) >+if [ -n "$res" ] >+then >+ echo $res >+ usage >+ cleanup_and_exit 1 >+fi >+ >+# Make sure our tags exist >+res=3D$(validate_tags) >+if [ -n "$res" ] >+then >+ echo $res >+ cleanup_and_exit 1 >+fi >+ >+ABICHECK=3D`which abi-compliance-checker 2>/dev/null` >+if [ $? -ne 0 ] >+then >+ log "INFO" "Cant find abi-compliance-checker utility" >+ cleanup_and_exit 1 >+fi >+ >+ABIDUMP=3D`which abi-dumper 2>/dev/null` >+if [ $? -ne 0 ] >+then >+ log "INFO" "Cant find abi-dumper utility" >+ cleanup_and_exit 1 >+fi >+ >+log "INFO" "We're going to check and make sure that applications built" >+log "INFO" "against DPDK DSOs from tag $TAG1 will still run when executed= " >+log "INFO" "against DPDK DSOs built from tag $TAG2." >+log "INFO" "" >+ >+# Check to make sure we have a clean tree >+git status | grep -q clean >+if [ $? -ne 0 ] >+then >+ log "WARN" "Working directory not clean, aborting" >+ cleanup_and_exit 1 >+fi >+ >+# Move to the root of the git tree >+cd $(dirname $0)/.. >+ >+log "INFO" "Checking out version $TAG1 of the dpdk" >+# Move to the old version of the tree >+git checkout $TAG1 >+ >+# Make sure we configure SHARED libraries >+# Also turn off IGB and KNI as those require kernel headers to build >+sed -i -e"$ a\CONFIG_RTE_BUILD_SHARED_LIB=3Dy" config/defconfig_$TARGET >+sed -i -e"$ a\CONFIG_RTE_EAL_IGB_UIO=3Dn" config/defconfig_$TARGET >+sed -i -e"$ a\CONFIG_RTE_LIBRTE_KNI=3Dn" config/defconfig_$TARGET >+ >+# Checking abi compliance relies on using the dwarf information in >+# The shared objects. Thats only included in the DSO's if we build >+# with -g >+export EXTRA_CFLAGS=3D-g >+export EXTRA_LDFLAGS=3D-g >+ >+# Now configure the build >+log "INFO" "Configuring DPDK $TAG1" >+make config T=3D$TARGET O=3D$TARGET > $VERBOSE 2>&1 >+ >+log "INFO" "Building DPDK $TAG1. This might take a moment" >+make O=3D$TARGET > $VERBOSE 2>&1 >+ >+if [ $? -ne 0 ] >+then >+ log "INFO" "THE BUILD FAILED. ABORTING" If the build fails while TAG1 is checked out, the user must check out their= original local branch manually. I'd prefer it if the script checked out $C= URRENT_BRANCH in the 'cleanup_and_exit' function.=20 Same applies to TAG2, if the user CTRL-C's out of the script, and to any ot= her command that might fail when a particular branch/tag is checked out (fo= r example, the 'sed' commands fail when I run the script; however, they wor= k when I run them on the command line - I'm investigating this currently). >+ cleanup_and_exit 1 >+fi >+ >+# Move to the lib directory >+cd $TARGET/lib >+log "INFO" "COLLECTING ABI INFORMATION FOR $TAG1" >+for i in `ls *.so` >+do >+ $ABIDUMP $i -o $ABI_DIR/$i-ABI-0.dump -lver $TAG1 >+done >+cd ../.. >+ >+# Now clean the tree, checkout the second tag, and rebuild >+git clean -f -d >+git reset --hard >+# Move to the new version of the tree >+log "INFO" "Checking out version $TAG2 of the dpdk" >+git checkout $TAG2 >+ >+export EXTRA_CFLAGS=3D-g >+export EXTRA_LDFLAGS=3D-g >+ >+# Make sure we configure SHARED libraries >+# Also turn off IGB and KNI as those require kernel headers to build >+sed -i -e"$ a\CONFIG_RTE_BUILD_SHARED_LIB=3Dy" config/defconfig_$TARGET >+sed -i -e"$ a\CONFIG_RTE_EAL_IGB_UIO=3Dn" config/defconfig_$TARGET >+sed -i -e"$ a\CONFIG_RTE_LIBRTE_KNI=3Dn" config/defconfig_$TARGET >+ >+# Now configure the build >+log "INFO" "Configuring DPDK $TAG2" >+make config T=3D$TARGET O=3D$TARGET > $VERBOSE 2>&1 >+ >+log "INFO" "Building DPDK $TAG2. This might take a moment" >+make O=3D$TARGET > $VERBOSE 2>&1 >+ >+if [ $? -ne 0 ] >+then >+ log "INFO" "THE BUILD FAILED. ABORTING" >+ cleanup_and_exit 1 >+fi >+ >+cd $TARGET/lib >+log "INFO" "COLLECTING ABI INFORMATION FOR $TAG2" >+for i in `ls *.so` >+do >+ $ABIDUMP $i -o $ABI_DIR/$i-ABI-1.dump -lver $TAG2 >+done >+cd ../.. >+ >+# Start comparison of ABI dumps >+for i in `ls $ABI_DIR/*-1.dump` >+do >+ NEWNAME=3D`basename $i` >+ OLDNAME=3D`basename $i | sed -e"s/1.dump/0.dump/"` >+ LIBNAME=3D`basename $i | sed -e"s/-ABI-1.dump//"` >+ >+ if [ ! -f $ABI_DIR/$OLDNAME ] >+ then >+ log "INFO" "$OLDNAME DOES NOT EXIST IN $TAG1. SKIPPING..." >+ fi >+ >+ #compare the abi dumps >+ $ABICHECK -l $LIBNAME -old $ABI_DIR/$OLDNAME -new $ABI_DIR/$NEWNAME >+done >+ >+git reset --hard >+git checkout $CURRENT_BRANCH >+log "INFO" "ABI CHECK COMPLETE. REPORTS ARE IN compat_report directory" >+cleanup_and_exit 0 >+ >+ >-- >2.1.0