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