dpdk/devtools/check-abi.sh
<<
>>
Prefs
   1#!/bin/sh -e
   2# SPDX-License-Identifier: BSD-3-Clause
   3# Copyright (c) 2019 Red Hat, Inc.
   4
   5if [ $# != 2 ] && [ $# != 3 ]; then
   6        echo "Usage: $0 refdir newdir [warnonly]" >&2
   7        exit 1
   8fi
   9
  10refdir=$1
  11newdir=$2
  12warnonly=${3:-}
  13ABIDIFF_OPTIONS="--suppr $(dirname $0)/libabigail.abignore --no-added-syms"
  14
  15if [ ! -d $refdir ]; then
  16        echo "Error: reference directory '$refdir' does not exist." >&2
  17        exit 1
  18fi
  19incdir=$(find $refdir -type d -a -name include)
  20if [ -z "$incdir" ] || [ ! -e "$incdir" ]; then
  21        echo "WARNING: could not identify an include directory for $refdir, expect false positives..." >&2
  22else
  23        ABIDIFF_OPTIONS="$ABIDIFF_OPTIONS --headers-dir1 $incdir"
  24fi
  25
  26if [ ! -d $newdir ]; then
  27        echo "Error: directory to check '$newdir' does not exist." >&2
  28        exit 1
  29fi
  30incdir2=$(find $newdir -type d -a -name include)
  31if [ -z "$incdir2" ] || [ ! -e "$incdir2" ]; then
  32        echo "WARNING: could not identify an include directory for $newdir, expect false positives..." >&2
  33else
  34        ABIDIFF_OPTIONS="$ABIDIFF_OPTIONS --headers-dir2 $incdir2"
  35fi
  36
  37error=
  38for dump in $(find $refdir -name "*.dump"); do
  39        name=$(basename $dump)
  40        # skip glue drivers, example librte_pmd_mlx5_glue.dump
  41        # We can't rely on a suppression rule for now:
  42        # https://sourceware.org/bugzilla/show_bug.cgi?id=25480
  43        if grep -qE "\<soname='[^']*_glue\.so\.[^']*'" $dump; then
  44                echo "Skipped glue library $name."
  45                continue
  46        fi
  47        if grep -qE "\<soname='librte_event_dlb\.so" $dump; then
  48                echo "Skipped removed driver $name."
  49                continue
  50        fi
  51        dump2=$(find $newdir -name $name)
  52        if [ -z "$dump2" ] || [ ! -e "$dump2" ]; then
  53                echo "Error: cannot find $name in $newdir" >&2
  54                error=1
  55                continue
  56        fi
  57        abidiff $ABIDIFF_OPTIONS $dump $dump2 || {
  58                abiret=$?
  59                echo "Error: ABI issue reported for 'abidiff $ABIDIFF_OPTIONS $dump $dump2'" >&2
  60                error=1
  61                echo
  62                if [ $(($abiret & 3)) -ne 0 ]; then
  63                        echo "ABIDIFF_ERROR|ABIDIFF_USAGE_ERROR, this could be a script or environment issue." >&2
  64                fi
  65                if [ $(($abiret & 4)) -ne 0 ]; then
  66                        echo "ABIDIFF_ABI_CHANGE, this change requires a review (abidiff flagged this as a potential issue)." >&2
  67                fi
  68                if [ $(($abiret & 8)) -ne 0 ]; then
  69                        echo "ABIDIFF_ABI_INCOMPATIBLE_CHANGE, this change breaks the ABI." >&2
  70                fi
  71                echo
  72        }
  73done
  74
  75[ -z "$error" ] || [ -n "$warnonly" ]
  76