1777014e5SDavid Marchand#!/bin/sh -e 2777014e5SDavid Marchand# SPDX-License-Identifier: BSD-3-Clause 3777014e5SDavid Marchand# Copyright (c) 2019 Red Hat, Inc. 4777014e5SDavid Marchand 5777014e5SDavid Marchandif [ $# != 2 ] && [ $# != 3 ]; then 60144eeafSThomas Monjalon echo "Usage: $0 refdir newdir [warnonly]" >&2 7777014e5SDavid Marchand exit 1 8777014e5SDavid Marchandfi 9777014e5SDavid Marchand 10777014e5SDavid Marchandrefdir=$1 11777014e5SDavid Marchandnewdir=$2 12777014e5SDavid Marchandwarnonly=${3:-} 13ce88e497SDavid MarchandABIDIFF_SUPPRESSIONS=$(dirname $(readlink -f $0))/libabigail.abignore 14ce88e497SDavid MarchandABIDIFF_OPTIONS="--suppr $ABIDIFF_SUPPRESSIONS --no-added-syms" 15777014e5SDavid Marchand 16777014e5SDavid Marchandif [ ! -d $refdir ]; then 170144eeafSThomas Monjalon echo "Error: reference directory '$refdir' does not exist." >&2 18777014e5SDavid Marchand exit 1 19777014e5SDavid Marchandfi 20777014e5SDavid Marchandincdir=$(find $refdir -type d -a -name include) 21777014e5SDavid Marchandif [ -z "$incdir" ] || [ ! -e "$incdir" ]; then 220144eeafSThomas Monjalon echo "WARNING: could not identify an include directory for $refdir, expect false positives..." >&2 23777014e5SDavid Marchandelse 24777014e5SDavid Marchand ABIDIFF_OPTIONS="$ABIDIFF_OPTIONS --headers-dir1 $incdir" 25777014e5SDavid Marchandfi 26777014e5SDavid Marchand 27777014e5SDavid Marchandif [ ! -d $newdir ]; then 280144eeafSThomas Monjalon echo "Error: directory to check '$newdir' does not exist." >&2 29777014e5SDavid Marchand exit 1 30777014e5SDavid Marchandfi 31777014e5SDavid Marchandincdir2=$(find $newdir -type d -a -name include) 32777014e5SDavid Marchandif [ -z "$incdir2" ] || [ ! -e "$incdir2" ]; then 330144eeafSThomas Monjalon echo "WARNING: could not identify an include directory for $newdir, expect false positives..." >&2 34777014e5SDavid Marchandelse 35777014e5SDavid Marchand ABIDIFF_OPTIONS="$ABIDIFF_OPTIONS --headers-dir2 $incdir2" 36777014e5SDavid Marchandfi 37777014e5SDavid Marchand 38ce88e497SDavid Marchandexport newdir ABIDIFF_OPTIONS ABIDIFF_SUPPRESSIONS 39c9ee83f5SThomas Monjalonexport diff_func='run_diff() { 40*98180d35SDavid Marchand lib=$1 41*98180d35SDavid Marchand name=$(basename $lib) 42*98180d35SDavid Marchand if grep -q "; SKIP_LIBRARY=${name%.so.*}\>" $ABIDIFF_SUPPRESSIONS; then 43ce88e497SDavid Marchand echo "Skipped $name" >&2 44ce88e497SDavid Marchand return 0 45ce88e497SDavid Marchand fi 46*98180d35SDavid Marchand # Look for a library with the same major ABI version 47*98180d35SDavid Marchand lib2=$(find $newdir -name "${name%.*}.*" -a ! -type l) 48*98180d35SDavid Marchand if [ -z "$lib2" ] || [ ! -e "$lib2" ]; then 490144eeafSThomas Monjalon echo "Error: cannot find $name in $newdir" >&2 50c9ee83f5SThomas Monjalon return 1 51777014e5SDavid Marchand fi 52*98180d35SDavid Marchand abidiff $ABIDIFF_OPTIONS $lib $lib2 || { 53cfe4ca10SDavid Marchand abiret=$? 54*98180d35SDavid Marchand echo "Error: ABI issue reported for abidiff $ABIDIFF_OPTIONS $lib $lib2" >&2 55cfe4ca10SDavid Marchand if [ $(($abiret & 3)) -ne 0 ]; then 560144eeafSThomas Monjalon echo "ABIDIFF_ERROR|ABIDIFF_USAGE_ERROR, this could be a script or environment issue." >&2 57777014e5SDavid Marchand fi 58cfe4ca10SDavid Marchand if [ $(($abiret & 4)) -ne 0 ]; then 590144eeafSThomas Monjalon echo "ABIDIFF_ABI_CHANGE, this change requires a review (abidiff flagged this as a potential issue)." >&2 60cfe4ca10SDavid Marchand fi 61cfe4ca10SDavid Marchand if [ $(($abiret & 8)) -ne 0 ]; then 620144eeafSThomas Monjalon echo "ABIDIFF_ABI_INCOMPATIBLE_CHANGE, this change breaks the ABI." >&2 63cfe4ca10SDavid Marchand fi 64c9ee83f5SThomas Monjalon return 1 65cfe4ca10SDavid Marchand } 66c9ee83f5SThomas Monjalon}' 67c9ee83f5SThomas Monjalon 68c9ee83f5SThomas Monjalonerror= 69*98180d35SDavid Marchandfind $refdir -name "*.so.*" -a ! -type l | 70c9ee83f5SThomas Monjalonxargs -n1 -P0 sh -c 'eval "$diff_func"; run_diff $0' || 71c9ee83f5SThomas Monjalonerror=1 72777014e5SDavid Marchand 73777014e5SDavid Marchand[ -z "$error" ] || [ -n "$warnonly" ] 74