mirror of
https://github.com/openvswitch/ovs
synced 2025-08-22 01:51:26 +00:00
Co-authored-by: Frode Nordahl <frode.nordahl@canonical.com> Signed-off-by: Frode Nordahl <frode.nordahl@canonical.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
302 lines
9.1 KiB
Bash
Executable File
302 lines
9.1 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
set -o errexit
|
|
set -x
|
|
|
|
CFLAGS_FOR_OVS="-g -O2"
|
|
SPARSE_FLAGS=""
|
|
EXTRA_OPTS="--enable-Werror"
|
|
|
|
on_exit() {
|
|
if [ $? = 0 ]; then
|
|
exit
|
|
fi
|
|
FILES_TO_PRINT="config.log"
|
|
FILES_TO_PRINT="$FILES_TO_PRINT */_build/sub/tests/testsuite.log"
|
|
|
|
for pr_file in $FILES_TO_PRINT; do
|
|
cat "$pr_file" 2>/dev/null
|
|
done
|
|
}
|
|
# We capture the error logs as artifacts in Github Actions, no need to dump
|
|
# them via a EXIT handler.
|
|
[ -n "$GITHUB_WORKFLOW" ] || trap on_exit EXIT
|
|
|
|
function install_kernel()
|
|
{
|
|
if [[ "$1" =~ ^5.* ]]; then
|
|
PREFIX="v5.x"
|
|
elif [[ "$1" =~ ^4.* ]]; then
|
|
PREFIX="v4.x"
|
|
elif [[ "$1" =~ ^3.* ]]; then
|
|
PREFIX="v3.x"
|
|
else
|
|
PREFIX="v2.6/longterm/v2.6.32"
|
|
fi
|
|
|
|
base_url="https://cdn.kernel.org/pub/linux/kernel/${PREFIX}"
|
|
# Download page with list of all available kernel versions.
|
|
wget ${base_url}/
|
|
# Uncompress in case server returned gzipped page.
|
|
(file index* | grep ASCII) || (mv index* index.new.gz && gunzip index*)
|
|
# Get version of the latest stable release.
|
|
hi_ver=$(echo ${1} | sed 's/\./\\\./')
|
|
lo_ver=$(cat ./index* | grep -P -o "${hi_ver}\.[0-9]+" | \
|
|
sed 's/.*\..*\.\(.*\)/\1/' | sort -h | tail -1)
|
|
version="${1}.${lo_ver}"
|
|
|
|
rm -rf index* linux-*
|
|
|
|
url="${base_url}/linux-${version}.tar.xz"
|
|
# Download kernel sources. Try direct link on CDN failure.
|
|
wget ${url} ||
|
|
(rm -f linux-${version}.tar.xz && wget ${url}) ||
|
|
(rm -f linux-${version}.tar.xz && wget ${url/cdn/www})
|
|
|
|
tar xvf linux-${version}.tar.xz > /dev/null
|
|
pushd linux-${version}
|
|
make allmodconfig
|
|
|
|
# Cannot use CONFIG_KCOV: -fsanitize-coverage=trace-pc is not supported by compiler
|
|
sed -i 's/CONFIG_KCOV=y/CONFIG_KCOV=n/' .config
|
|
|
|
# stack validation depends on tools/objtool, but objtool does not compile on travis.
|
|
# It is giving following error.
|
|
# >>> GEN arch/x86/insn/inat-tables.c
|
|
# >>> Semantic error at 40: Unknown imm opnd: AL
|
|
# So for now disable stack-validation for the build.
|
|
|
|
sed -i 's/CONFIG_STACK_VALIDATION=y/CONFIG_STACK_VALIDATION=n/' .config
|
|
make oldconfig
|
|
|
|
# Older kernels do not include openvswitch
|
|
if [ -d "net/openvswitch" ]; then
|
|
make net/openvswitch/
|
|
else
|
|
make net/bridge/
|
|
fi
|
|
|
|
if [ "$AFXDP" ]; then
|
|
sudo make headers_install INSTALL_HDR_PATH=/usr
|
|
pushd tools/lib/bpf/
|
|
# Bulding with gcc because there are some issues in make files
|
|
# that breaks building libbpf with clang on Travis.
|
|
CC=gcc sudo make install
|
|
CC=gcc sudo make install_headers
|
|
sudo ldconfig
|
|
popd
|
|
# The Linux kernel defines __always_inline in stddef.h (283d7573), and
|
|
# sys/cdefs.h tries to re-define it. Older libc-dev package in xenial
|
|
# doesn't have a fix for this issue. Applying it manually.
|
|
sudo sed -i '/^# define __always_inline .*/i # undef __always_inline' \
|
|
/usr/include/x86_64-linux-gnu/sys/cdefs.h || true
|
|
EXTRA_OPTS="${EXTRA_OPTS} --enable-afxdp"
|
|
else
|
|
EXTRA_OPTS="${EXTRA_OPTS} --with-linux=$(pwd)"
|
|
echo "Installed kernel source in $(pwd)"
|
|
fi
|
|
popd
|
|
}
|
|
|
|
function install_dpdk()
|
|
{
|
|
local DPDK_VER=$1
|
|
local VERSION_FILE="dpdk-dir/travis-dpdk-cache-version"
|
|
local DPDK_OPTS=""
|
|
local DPDK_LIB=""
|
|
|
|
if [ -z "$TRAVIS_ARCH" ] ||
|
|
[ "$TRAVIS_ARCH" == "amd64" ]; then
|
|
DPDK_LIB=$(pwd)/dpdk-dir/build/lib/x86_64-linux-gnu
|
|
elif [ "$TRAVIS_ARCH" == "aarch64" ]; then
|
|
DPDK_LIB=$(pwd)/dpdk-dir/build/lib/aarch64-linux-gnu
|
|
else
|
|
echo "Target is unknown"
|
|
exit 1
|
|
fi
|
|
|
|
if [ "$DPDK_SHARED" ]; then
|
|
EXTRA_OPTS="$EXTRA_OPTS --with-dpdk=shared"
|
|
export LD_LIBRARY_PATH=$DPDK_LIB/:$LD_LIBRARY_PATH
|
|
else
|
|
EXTRA_OPTS="$EXTRA_OPTS --with-dpdk=static"
|
|
fi
|
|
|
|
# Export the following path for pkg-config to find the .pc file.
|
|
export PKG_CONFIG_PATH=$DPDK_LIB/pkgconfig/:$PKG_CONFIG_PATH
|
|
|
|
if [ "${DPDK_VER##refs/*/}" != "${DPDK_VER}" ]; then
|
|
# Avoid using cache for git tree build.
|
|
rm -rf dpdk-dir
|
|
|
|
DPDK_GIT=${DPDK_GIT:-https://dpdk.org/git/dpdk}
|
|
git clone --single-branch $DPDK_GIT dpdk-dir -b "${DPDK_VER##refs/*/}"
|
|
pushd dpdk-dir
|
|
git log -1 --oneline
|
|
else
|
|
if [ -f "${VERSION_FILE}" ]; then
|
|
VER=$(cat ${VERSION_FILE})
|
|
if [ "${VER}" = "${DPDK_VER}" ]; then
|
|
# Update the library paths.
|
|
sudo ldconfig
|
|
echo "Found cached DPDK ${VER} build in $(pwd)/dpdk-dir"
|
|
return
|
|
fi
|
|
fi
|
|
# No cache or version mismatch.
|
|
rm -rf dpdk-dir
|
|
wget https://fast.dpdk.org/rel/dpdk-$1.tar.xz
|
|
tar xvf dpdk-$1.tar.xz > /dev/null
|
|
DIR_NAME=$(tar -tf dpdk-$1.tar.xz | head -1 | cut -f1 -d"/")
|
|
mv ${DIR_NAME} dpdk-dir
|
|
pushd dpdk-dir
|
|
fi
|
|
|
|
# Switching to 'default' machine to make dpdk-dir cache usable on
|
|
# different CPUs. We can't be sure that all CI machines are exactly same.
|
|
DPDK_OPTS="$DPDK_OPTS -Dmachine=default"
|
|
|
|
# Disable building DPDK unit tests. Not needed for OVS build or tests.
|
|
DPDK_OPTS="$DPDK_OPTS -Dtests=false"
|
|
|
|
# Disable DPDK developer mode, this results in less build checks and less
|
|
# meson verbose outputs.
|
|
DPDK_OPTS="$DPDK_OPTS -Ddeveloper_mode=disabled"
|
|
|
|
# Install DPDK using prefix.
|
|
DPDK_OPTS="$DPDK_OPTS --prefix=$(pwd)/build"
|
|
|
|
CC=gcc meson $DPDK_OPTS build
|
|
ninja -C build
|
|
ninja -C build install
|
|
|
|
# Update the library paths.
|
|
sudo ldconfig
|
|
|
|
|
|
echo "Installed DPDK source in $(pwd)"
|
|
popd
|
|
echo "${DPDK_VER}" > ${VERSION_FILE}
|
|
}
|
|
|
|
function configure_ovs()
|
|
{
|
|
./boot.sh
|
|
./configure CFLAGS="${CFLAGS_FOR_OVS}" $*
|
|
}
|
|
|
|
function build_ovs()
|
|
{
|
|
local KERNEL=$1
|
|
|
|
configure_ovs $OPTS
|
|
make selinux-policy
|
|
|
|
# Only build datapath if we are testing kernel w/o running testsuite and
|
|
# AF_XDP support.
|
|
if [ "${KERNEL}" ] && ! [ "$AFXDP" ]; then
|
|
pushd datapath
|
|
make -j4
|
|
popd
|
|
else
|
|
make -j4
|
|
fi
|
|
}
|
|
|
|
if [ "$DEB_PACKAGE" ]; then
|
|
./boot.sh && ./configure --with-dpdk=$DPDK && make debian
|
|
mk-build-deps --install --root-cmd sudo --remove debian/control
|
|
dpkg-checkbuilddeps
|
|
make debian-deb
|
|
packages=$(ls $(pwd)/../*.deb)
|
|
deps=""
|
|
for pkg in $packages; do
|
|
_ifs=$IFS
|
|
IFS=","
|
|
for dep in $(dpkg-deb -f $pkg Depends); do
|
|
dep_name=$(echo "$dep"|awk '{print$1}')
|
|
# Don't install internal package inter-dependencies from apt
|
|
echo $dep_name | grep -q openvswitch && continue
|
|
deps+=" $dep_name"
|
|
done
|
|
IFS=$_ifs
|
|
done
|
|
# install package dependencies from apt
|
|
echo $deps | xargs sudo apt -y install
|
|
# install the locally built openvswitch packages
|
|
sudo dpkg -i $packages
|
|
exit 0
|
|
fi
|
|
|
|
if [ "$KERNEL" ]; then
|
|
install_kernel $KERNEL
|
|
fi
|
|
|
|
if [ "$DPDK" ] || [ "$DPDK_SHARED" ]; then
|
|
if [ -z "$DPDK_VER" ]; then
|
|
DPDK_VER="21.11.1"
|
|
fi
|
|
install_dpdk $DPDK_VER
|
|
fi
|
|
|
|
if [ "$CC" = "clang" ]; then
|
|
CFLAGS_FOR_OVS="${CFLAGS_FOR_OVS} -Wno-error=unused-command-line-argument"
|
|
elif [ "$M32" ]; then
|
|
# Not using sparse for 32bit builds on 64bit machine.
|
|
# Adding m32 flag directly to CC to avoid any posiible issues with API/ABI
|
|
# difference on 'configure' and 'make' stages.
|
|
export CC="$CC -m32"
|
|
elif [ "$TRAVIS_ARCH" != "aarch64" ]; then
|
|
OPTS="--enable-sparse"
|
|
if [ "$AFXDP" ]; then
|
|
# netdev-afxdp uses memset for 64M for umem initialization.
|
|
SPARSE_FLAGS="${SPARSE_FLAGS} -Wno-memcpy-max-count"
|
|
fi
|
|
CFLAGS_FOR_OVS="${CFLAGS_FOR_OVS} ${SPARSE_FLAGS}"
|
|
fi
|
|
|
|
if [ "$ASAN" ]; then
|
|
# This will override default option configured in tests/atlocal.in.
|
|
export ASAN_OPTIONS='detect_leaks=1'
|
|
# -O2 generates few false-positive memory leak reports in test-ovsdb
|
|
# application, so lowering optimizations to -O1 here.
|
|
CFLAGS_ASAN="-O1 -fno-omit-frame-pointer -fno-common -fsanitize=address"
|
|
CFLAGS_FOR_OVS="${CFLAGS_FOR_OVS} ${CFLAGS_ASAN}"
|
|
fi
|
|
|
|
if [ "$UBSAN" ]; then
|
|
# Use the default options configured in tests/atlocal.in, in UBSAN_OPTIONS.
|
|
CFLAGS_UBSAN="-O1 -fno-omit-frame-pointer -fno-common -fsanitize=undefined"
|
|
CFLAGS_FOR_OVS="${CFLAGS_FOR_OVS} ${CFLAGS_UBSAN}"
|
|
fi
|
|
|
|
save_OPTS="${OPTS} $*"
|
|
OPTS="${EXTRA_OPTS} ${save_OPTS}"
|
|
|
|
if [ "$TESTSUITE" ]; then
|
|
# 'distcheck' will reconfigure with required options.
|
|
# Now we only need to prepare the Makefile without sparse-wrapped CC.
|
|
configure_ovs
|
|
|
|
export DISTCHECK_CONFIGURE_FLAGS="$OPTS"
|
|
make distcheck -j4 CFLAGS="${CFLAGS_FOR_OVS}" \
|
|
TESTSUITEFLAGS=-j4 RECHECK=yes
|
|
else
|
|
if [ -z "${KERNEL_LIST}" ]; then build_ovs ${KERNEL};
|
|
else
|
|
save_EXTRA_OPTS="${EXTRA_OPTS}"
|
|
for KERNEL in ${KERNEL_LIST}; do
|
|
echo "=============================="
|
|
echo "Building with kernel ${KERNEL}"
|
|
echo "=============================="
|
|
EXTRA_OPTS="${save_EXTRA_OPTS}"
|
|
install_kernel ${KERNEL}
|
|
OPTS="${EXTRA_OPTS} ${save_OPTS}"
|
|
build_ovs ${KERNEL}
|
|
make distclean
|
|
done
|
|
fi
|
|
fi
|
|
|
|
exit 0
|