#!/bin/bash
+set -o errexit
+
KERNELSRC=""
+CFLAGS="-Werror"
+SPARSE_FLAGS=""
+EXTRA_OPTS=""
function install_kernel()
{
- wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.14.7.tar.gz \
- && tar xzvf linux-3.14.7.tar.gz > /dev/null \
- && cd linux-3.14.7 \
- && make allmodconfig \
- && make net/openvswitch/ \
- && KERNELSRC=$(pwd) \
- && echo "Installed kernel source in $(pwd)" \
- && cd ..
-
- [ $? != 0 ] && exit 1
+ if [[ "$1" =~ ^4.* ]]; then
+ PREFIX="v4.x"
+ elif [[ "$1" =~ ^3.* ]]; then
+ PREFIX="v3.x"
+ else
+ PREFIX="v2.6/longterm/v2.6.32"
+ fi
+
+ wget https://www.kernel.org/pub/linux/kernel/${PREFIX}/linux-${1}.tar.gz
+ tar xzvf linux-${1}.tar.gz > /dev/null
+ cd linux-${1}
+ make allmodconfig
+
+ # Older kernels do not include openvswitch
+ if [ -d "net/openvswitch" ]; then
+ make net/openvswitch/
+ else
+ make net/bridge/
+ fi
+
+ KERNELSRC=$(pwd)
+ if [ ! "$DPDK" ]; then
+ EXTRA_OPTS="--with-linux=$(pwd)"
+ fi
+ echo "Installed kernel source in $(pwd)"
+ cd ..
}
function install_dpdk()
{
- wget http://www.dpdk.org/browse/dpdk/snapshot/dpdk-1.7.0.tar.gz \
- && tar xzvf dpdk-1.7.0.tar.gz > /dev/null \
- && cd dpdk-1.7.0 \
- && find ./ -type f | xargs sed -i 's/max-inline-insns-single=100/max-inline-insns-single=400/' \
- && make config CC=gcc T=x86_64-native-linuxapp-gcc \
- && make CC=gcc RTE_KERNELDIR=$KERNELSRC \
- && sudo make install CC=gcc T=x86_64-native-linuxapp-gcc RTE_KERNELDIR=$KERNELSRC \
- && echo "Installed DPDK source in $(pwd)" \
- && cd ..
-
- [ $? != 0 ] && exit 1
+ if [ -n "$DPDK_GIT" ]; then
+ git clone $DPDK_GIT dpdk-$1
+ cd dpdk-$1
+ git checkout v$1
+ else
+ wget http://www.dpdk.org/browse/dpdk/snapshot/dpdk-$1.tar.gz
+ tar xzvf dpdk-$1.tar.gz > /dev/null
+ cd dpdk-$1
+ fi
+ find ./ -type f | xargs sed -i 's/max-inline-insns-single=100/max-inline-insns-single=400/'
+ sed -ri 's,(CONFIG_RTE_BUILD_COMBINE_LIBS=).*,\1y,' config/common_linuxapp
+ echo 'CONFIG_RTE_BUILD_FPIC=y' >>config/common_linuxapp
+ sed -ri '/EXECENV_CFLAGS = -pthread -fPIC/{s/$/\nelse ifeq ($(CONFIG_RTE_BUILD_FPIC),y)/;s/$/\nEXECENV_CFLAGS = -pthread -fPIC/}' mk/exec-env/linuxapp/rte.vars.mk
+ make config CC=gcc T=x86_64-native-linuxapp-gcc
+ make CC=gcc RTE_KERNELDIR=$KERNELSRC
+ echo "Installed DPDK source in $(pwd)"
+ cd ..
}
function configure_ovs()
{
./boot.sh && ./configure $*
- [ $? != 0 ] && exit 1
}
if [ "$KERNEL" ] || [ "$DPDK" ]; then
- install_kernel
+ install_kernel $KERNEL
fi
-[ "$DPDK" ] && install_dpdk
+if [ "$DPDK" ]; then
+ if [ -z "$DPDK_VER" ]; then
+ DPDK_VER="2.2.0"
+ fi
+ install_dpdk $DPDK_VER
+ if [ "$CC" = "clang" ]; then
+ # Disregard cast alignment errors until DPDK is fixed
+ CFLAGS="$CFLAGS -Wno-cast-align"
+ fi
+ EXTRA_OPTS="$EXTRA_OPTS --with-dpdk=./dpdk-$DPDK_VER/build"
+elif [ "$CC" != "clang" ]; then
+ # DPDK headers currently trigger sparse errors
+ SPARSE_FLAGS="$SPARSE_FLAGS -Wsparse-error"
+fi
-configure_ovs $*
+configure_ovs $EXTRA_OPTS $*
-if [ $CC = "clang" ]; then
- make CFLAGS="-Werror -Wno-error=unused-command-line-argument"
+# Only build datapath if we are testing kernel w/o running testsuite
+if [ "$KERNEL" ] && [ ! "$TESTSUITE" ] && [ ! "$DPDK" ]; then
+ cd datapath
+fi
+
+if [ "$CC" = "clang" ]; then
+ make CFLAGS="$CFLAGS -Wno-error=unused-command-line-argument"
+elif [[ $BUILD_ENV =~ "-m32" ]]; then
+ # Disable sparse for 32bit builds on 64bit machine
+ make CFLAGS="$CFLAGS $BUILD_ENV"
else
- make CFLAGS="-Werror" C=1 || exit 1
- [ "$TESTSUITE" ] && make check
+ make CFLAGS="$CFLAGS $BUILD_ENV $SPARSE_FLAGS" C=1
+fi
+
+if [ "$TESTSUITE" ] && [ "$CC" != "clang" ]; then
+ if ! make distcheck RECHECK=yes; then
+ # testsuite.log is necessary for debugging.
+ cat */_build/tests/testsuite.log
+ exit 1
+ fi
fi
exit 0