From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp.tuxdriver.com (charlotte.tuxdriver.com [70.61.120.58]) by dpdk.org (Postfix) with ESMTP id A2DC67EEF for ; Fri, 13 Mar 2015 15:10:25 +0100 (CET) Received: from hmsreliant.think-freely.org ([2001:470:8:a08:7aac:c0ff:fec2:933b] helo=localhost) by smtp.tuxdriver.com with esmtpsa (TLSv1:AES128-SHA:128) (Exim 4.63) (envelope-from ) id 1YWQI9-0006lY-1S; Fri, 13 Mar 2015 10:10:24 -0400 Date: Fri, 13 Mar 2015 10:10:20 -0400 From: Neil Horman To: "Kavanagh, Mark B" Message-ID: <20150313141020.GD28191@hmsreliant.think-freely.org> References: <1422652596-12777-1-git-send-email-nhorman@tuxdriver.com> <1425486419-12508-1-git-send-email-nhorman@tuxdriver.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-Spam-Score: -2.9 (--) X-Spam-Status: No Cc: "dev@dpdk.org" 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 14:10:26 -0000 On Fri, Mar 13, 2015 at 11:56:59AM +0000, Kavanagh, Mark B wrote: > > > >-----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 stability > >work. As it turns out there is a abi compliance checker in development that > >seems to be under active development and provides fairly detailed ABI compliance > >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 arbitrarily > >specified tags within the dpdk tree. To execute enter the $RTE_SDK directory > >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= 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 developers > >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=$1 > >+TAG2=$2 > >+TARGET=$3 > >+ABI_DIR=`mktemp -d -p /tmp ABI.XXXXXX` > >+ > >+usage() { > >+ echo "$0 " > >+} > >+ > >+log() { > >+ local level=$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=`git branch | grep \* | cut -d' ' -f2` > >+ > >+if [ -z "$CURRENT_BRANCH" ] > >+then > >+ CURRENT_BRANCH=`git log --pretty=format:%H HEAD~1..HEAD` > >+fi > >+ > >+if [ -n "$VERBOSE" ] > >+then > >+ export VERBOSE=/dev/stdout > >+else > >+ export VERBOSE=/dev/null > >+fi > >+ > >+# Validate that we have all the arguments we need > >+res=$(validate_args) > >+if [ -n "$res" ] > >+then > >+ echo $res > >+ usage > >+ cleanup_and_exit 1 > >+fi > >+ > >+# Make sure our tags exist > >+res=$(validate_tags) > >+if [ -n "$res" ] > >+then > >+ echo $res > >+ cleanup_and_exit 1 > >+fi > >+ > >+ABICHECK=`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=`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=y" config/defconfig_$TARGET > >+sed -i -e"$ a\CONFIG_RTE_EAL_IGB_UIO=n" config/defconfig_$TARGET > >+sed -i -e"$ a\CONFIG_RTE_LIBRTE_KNI=n" 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=-g > >+export EXTRA_LDFLAGS=-g > >+ > >+# Now configure the build > >+log "INFO" "Configuring DPDK $TAG1" > >+make config T=$TARGET O=$TARGET > $VERBOSE 2>&1 > >+ > >+log "INFO" "Building DPDK $TAG1. This might take a moment" > >+make O=$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 $CURRENT_BRANCH in the 'cleanup_and_exit' function. > Sure, its in V4. > Same applies to TAG2, if the user CTRL-C's out of the script, and to any other command that might fail when a particular branch/tag is checked out (for example, the 'sed' commands fail when I run the script; however, they work when I run them on the command line - I'm investigating this currently). > What does the log say? Please post it here. If it helps add a set -x to the top of the script for additional verbosity. Neil