xref: /dpdk/devtools/check-abi.sh (revision 98180d354f355a9fd1fbc8aaf59b1f3785b00443)
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