numam-dpdk/devtools/test-meson-builds.sh
David Marchand 777014e56d devtools: add ABI checks
For normal developers, those checks are disabled.

Enabling them requires a configuration that will trigger the ABI dumps
generation as part of the existing devtools/test-build.sh and
devtools/test-meson-builds.sh scripts.

Those checks are enabled in the CI for the default meson options on x86
and aarch64 so that proposed patches are validated via our CI robot.
A cache of the ABI is stored in travis jobs to avoid rebuilding too
often.

Checks can be informational only, by setting ABI_CHECKS_WARN_ONLY when
breaking the ABI in a future release.

Explicit suppression rules have been added on internal structures
exposed to crypto drivers as the current ABI policy does not apply to
them.
This could be improved in the future by carefully splitting the headers
content with application and driver "users" in mind.

We currently have issues reported for librte_crypto recent changes for
which suppression rules have been added too.

Mellanox glue libraries are explicitly skipped as they are not part of
the application ABI.

Signed-off-by: David Marchand <david.marchand@redhat.com>
Acked-by: Luca Boccassi <bluca@debian.org>
2020-02-05 15:14:46 +01:00

215 lines
6.0 KiB
Bash
Executable File

#! /bin/sh -e
# SPDX-License-Identifier: BSD-3-Clause
# Copyright(c) 2018 Intel Corporation
# Run meson to auto-configure the various builds.
# * all builds get put in a directory whose name starts with "build-"
# * if a build-directory already exists we assume it was properly configured
# Run ninja after configuration is done.
# set pipefail option if possible
PIPEFAIL=""
set -o | grep -q pipefail && set -o pipefail && PIPEFAIL=1
srcdir=$(dirname $(readlink -f $0))/..
. $srcdir/devtools/load-devel-config
MESON=${MESON:-meson}
use_shared="--default-library=shared"
builds_dir=${DPDK_BUILD_TEST_DIR:-.}
if command -v gmake >/dev/null 2>&1 ; then
MAKE=gmake
else
MAKE=make
fi
if command -v ninja >/dev/null 2>&1 ; then
ninja_cmd=ninja
elif command -v ninja-build >/dev/null 2>&1 ; then
ninja_cmd=ninja-build
else
echo "ERROR: ninja is not found" >&2
exit 1
fi
if command -v ccache >/dev/null 2>&1 ; then
CCACHE=ccache
else
CCACHE=
fi
default_path=$PATH
default_pkgpath=$PKG_CONFIG_PATH
default_cppflags=$CPPFLAGS
default_cflags=$CFLAGS
default_ldflags=$LDFLAGS
load_env () # <target compiler>
{
targetcc=$1
export PATH=$default_path
export PKG_CONFIG_PATH=$default_pkgpath
export CPPFLAGS=$default_cppflags
export CFLAGS=$default_cflags
export LDFLAGS=$default_ldflags
unset DPDK_MESON_OPTIONS
command -v $targetcc >/dev/null 2>&1 || return 1
DPDK_TARGET=$($targetcc -v 2>&1 | sed -n 's,^Target: ,,p')
. $srcdir/devtools/load-devel-config
}
config () # <dir> <builddir> <meson options>
{
dir=$1
shift
builddir=$1
shift
if [ -f "$builddir/build.ninja" ] ; then
# for existing environments, switch to debugoptimized if unset
# so that ABI checks can run
if ! $MESON configure $builddir |
awk '$1=="buildtype" {print $2}' |
grep -qw debugoptimized; then
$MESON configure --buildtype=debugoptimized $builddir
fi
return
fi
options=
options="$options --werror -Dexamples=all"
options="$options --buildtype=debugoptimized"
for option in $DPDK_MESON_OPTIONS ; do
options="$options -D$option"
done
options="$options $*"
echo "$MESON $options $dir $builddir"
$MESON $options $dir $builddir
}
compile () # <builddir>
{
builddir=$1
if [ -n "$TEST_MESON_BUILD_VERY_VERBOSE" ] ; then
# for full output from ninja use "-v"
echo "$ninja_cmd -v -C $builddir"
$ninja_cmd -v -C $builddir
elif [ -n "$TEST_MESON_BUILD_VERBOSE" ] ; then
# for keeping the history of short cmds, pipe through cat
echo "$ninja_cmd -C $builddir | cat"
$ninja_cmd -C $builddir | cat
else
echo "$ninja_cmd -C $builddir"
$ninja_cmd -C $builddir
fi
}
install_target () # <builddir> <installdir>
{
rm -rf $2
echo "DESTDIR=$2 $ninja_cmd -C $1 install"
DESTDIR=$2 $ninja_cmd -C $1 install
}
build () # <directory> <target compiler> <meson options>
{
targetdir=$1
shift
targetcc=$1
shift
# skip build if compiler not available
command -v ${CC##* } >/dev/null 2>&1 || return 0
load_env $targetcc || return 0
config $srcdir $builds_dir/$targetdir $*
compile $builds_dir/$targetdir
if [ -n "$DPDK_ABI_REF_VERSION" ]; then
abirefdir=${DPDK_ABI_REF_DIR:-reference}/$DPDK_ABI_REF_VERSION
if [ ! -d $abirefdir/$targetdir ]; then
# clone current sources
if [ ! -d $abirefdir/src ]; then
git clone --local --no-hardlinks \
--single-branch \
-b $DPDK_ABI_REF_VERSION \
$srcdir $abirefdir/src
fi
rm -rf $abirefdir/build
config $abirefdir/src $abirefdir/build $*
compile $abirefdir/build
install_target $abirefdir/build $abirefdir/$targetdir
$srcdir/devtools/gen-abi.sh $abirefdir/$targetdir
fi
install_target $builds_dir/$targetdir \
$(readlink -f $builds_dir/$targetdir/install)
$srcdir/devtools/gen-abi.sh \
$(readlink -f $builds_dir/$targetdir/install)
$srcdir/devtools/check-abi.sh $abirefdir/$targetdir \
$(readlink -f $builds_dir/$targetdir/install)
fi
}
if [ "$1" = "-vv" ] ; then
TEST_MESON_BUILD_VERY_VERBOSE=1
elif [ "$1" = "-v" ] ; then
TEST_MESON_BUILD_VERBOSE=1
fi
# we can't use plain verbose when we don't have pipefail option so up-level
if [ -z "$PIPEFAIL" -a -n "$TEST_MESON_BUILD_VERBOSE" ] ; then
echo "# Missing pipefail shell option, changing VERBOSE to VERY_VERBOSE"
TEST_MESON_BUILD_VERY_VERBOSE=1
fi
# shared and static linked builds with gcc and clang
for c in gcc clang ; do
command -v $c >/dev/null 2>&1 || continue
for s in static shared ; do
export CC="$CCACHE $c"
build build-$c-$s $c --default-library=$s
unset CC
done
done
# test compilation with minimal x86 instruction set
# Set the install path for libraries to "lib" explicitly to prevent problems
# with pkg-config prefixes if installed in "lib/x86_64-linux-gnu" later.
default_machine='nehalem'
ok=$(cc -march=$default_machine -E - < /dev/null > /dev/null 2>&1 || echo false)
if [ "$ok" = "false" ] ; then
default_machine='corei7'
fi
build build-x86-default cc -Dlibdir=lib -Dmachine=$default_machine $use_shared
c=aarch64-linux-gnu-gcc
# generic armv8a with clang as host compiler
export CC="clang"
build build-arm64-host-clang $c $use_shared \
--cross-file $srcdir/config/arm/arm64_armv8_linux_gcc
unset CC
# all gcc/arm configurations
for f in $srcdir/config/arm/arm64_[bdo]*gcc ; do
export CC="$CCACHE gcc"
build build-$(basename $f | tr '_' '-' | cut -d'-' -f-2) $c \
$use_shared --cross-file $f
unset CC
done
# Test installation of the x86-default target, to be used for checking
# the sample apps build using the pkg-config file for cflags and libs
build_path=$(readlink -f $builds_dir/build-x86-default)
export DESTDIR=$build_path/install
# No need to reinstall if ABI checks are enabled
if [ -z "$DPDK_ABI_REF_VERSION" ]; then
install_target $build_path $DESTDIR
fi
load_env cc
pc_file=$(find $DESTDIR -name libdpdk.pc)
export PKG_CONFIG_PATH=$(dirname $pc_file):$PKG_CONFIG_PATH
# if pkg-config defines the necessary flags, test building some examples
if pkg-config --define-prefix libdpdk >/dev/null 2>&1; then
export PKGCONF="pkg-config --define-prefix"
for example in cmdline helloworld l2fwd l3fwd skeleton timer; do
echo "## Building $example"
$MAKE -C $DESTDIR/usr/local/share/dpdk/examples/$example clean all
done
fi