1d30ea906Sjfb8856606#! /bin/sh -e 2d30ea906Sjfb8856606# SPDX-License-Identifier: BSD-3-Clause 3d30ea906Sjfb8856606# Copyright(c) 2018 Intel Corporation 4d30ea906Sjfb8856606 5d30ea906Sjfb8856606# Run meson to auto-configure the various builds. 6d30ea906Sjfb8856606# * all builds get put in a directory whose name starts with "build-" 7d30ea906Sjfb8856606# * if a build-directory already exists we assume it was properly configured 8d30ea906Sjfb8856606# Run ninja after configuration is done. 9d30ea906Sjfb8856606 104418919fSjohnjiang# set pipefail option if possible 114418919fSjohnjiangPIPEFAIL="" 124418919fSjohnjiangset -o | grep -q pipefail && set -o pipefail && PIPEFAIL=1 134418919fSjohnjiang 141646932aSjfb8856606srcdir=$(dirname $(readlink -f $0))/.. 154418919fSjohnjiang. $srcdir/devtools/load-devel-config 164418919fSjohnjiang 17d30ea906Sjfb8856606MESON=${MESON:-meson} 18d30ea906Sjfb8856606use_shared="--default-library=shared" 194418919fSjohnjiangbuilds_dir=${DPDK_BUILD_TEST_DIR:-.} 20d30ea906Sjfb8856606 214418919fSjohnjiangif command -v gmake >/dev/null 2>&1 ; then 224418919fSjohnjiang MAKE=gmake 234418919fSjohnjiangelse 244418919fSjohnjiang MAKE=make 254418919fSjohnjiangfi 26d30ea906Sjfb8856606if command -v ninja >/dev/null 2>&1 ; then 27d30ea906Sjfb8856606 ninja_cmd=ninja 28d30ea906Sjfb8856606elif command -v ninja-build >/dev/null 2>&1 ; then 29d30ea906Sjfb8856606 ninja_cmd=ninja-build 30d30ea906Sjfb8856606else 31d30ea906Sjfb8856606 echo "ERROR: ninja is not found" >&2 32d30ea906Sjfb8856606 exit 1 33d30ea906Sjfb8856606fi 344418919fSjohnjiangif command -v ccache >/dev/null 2>&1 ; then 354418919fSjohnjiang CCACHE=ccache 364418919fSjohnjiangelse 374418919fSjohnjiang CCACHE= 384418919fSjohnjiangfi 39d30ea906Sjfb8856606 404418919fSjohnjiangdefault_path=$PATH 414418919fSjohnjiangdefault_cppflags=$CPPFLAGS 424418919fSjohnjiangdefault_cflags=$CFLAGS 434418919fSjohnjiangdefault_ldflags=$LDFLAGS 440c6bd470Sfengbojiangdefault_meson_options=$DPDK_MESON_OPTIONS 454418919fSjohnjiang 46*2d9fd380Sjfb8856606opt_verbose= 47*2d9fd380Sjfb8856606opt_vverbose= 48*2d9fd380Sjfb8856606if [ "$1" = "-v" ] ; then 49*2d9fd380Sjfb8856606 opt_verbose=y 50*2d9fd380Sjfb8856606elif [ "$1" = "-vv" ] ; then 51*2d9fd380Sjfb8856606 opt_verbose=y 52*2d9fd380Sjfb8856606 opt_vverbose=y 53*2d9fd380Sjfb8856606fi 54*2d9fd380Sjfb8856606# we can't use plain verbose when we don't have pipefail option so up-level 55*2d9fd380Sjfb8856606if [ -z "$PIPEFAIL" -a -n "$opt_verbose" ] ; then 56*2d9fd380Sjfb8856606 echo "# Missing pipefail shell option, changing VERBOSE to VERY_VERBOSE" 57*2d9fd380Sjfb8856606 opt_vverbose=y 58*2d9fd380Sjfb8856606fi 59*2d9fd380Sjfb8856606[ -n "$opt_verbose" ] && exec 8>&1 || exec 8>/dev/null 60*2d9fd380Sjfb8856606verbose=8 61*2d9fd380Sjfb8856606[ -n "$opt_vverbose" ] && exec 9>&1 || exec 9>/dev/null 62*2d9fd380Sjfb8856606veryverbose=9 63*2d9fd380Sjfb8856606 64*2d9fd380Sjfb8856606check_cc_flags () # <flag to check> <flag2> ... 65*2d9fd380Sjfb8856606{ 66*2d9fd380Sjfb8856606 echo 'int main(void) { return 0; }' | 67*2d9fd380Sjfb8856606 cc $@ -x c - -o /dev/null 2> /dev/null 68*2d9fd380Sjfb8856606} 69*2d9fd380Sjfb8856606 704418919fSjohnjiangload_env () # <target compiler> 71d30ea906Sjfb8856606{ 724418919fSjohnjiang targetcc=$1 730c6bd470Sfengbojiang # reset variables before target-specific config 744418919fSjohnjiang export PATH=$default_path 750c6bd470Sfengbojiang unset PKG_CONFIG_PATH # global default makes no sense 764418919fSjohnjiang export CPPFLAGS=$default_cppflags 774418919fSjohnjiang export CFLAGS=$default_cflags 784418919fSjohnjiang export LDFLAGS=$default_ldflags 790c6bd470Sfengbojiang export DPDK_MESON_OPTIONS=$default_meson_options 80*2d9fd380Sjfb8856606 # set target hint for use in the loaded config file 81*2d9fd380Sjfb8856606 if [ -n "$target_override" ] ; then 82*2d9fd380Sjfb8856606 DPDK_TARGET=$target_override 83*2d9fd380Sjfb8856606 elif command -v $targetcc >/dev/null 2>&1 ; then 844418919fSjohnjiang DPDK_TARGET=$($targetcc -v 2>&1 | sed -n 's,^Target: ,,p') 85*2d9fd380Sjfb8856606 else # toolchain not yet in PATH: its name should be enough 86*2d9fd380Sjfb8856606 DPDK_TARGET=$targetcc 87*2d9fd380Sjfb8856606 fi 88*2d9fd380Sjfb8856606 echo "Using DPDK_TARGET $DPDK_TARGET" >&$verbose 89*2d9fd380Sjfb8856606 # config input: $DPDK_TARGET 904418919fSjohnjiang . $srcdir/devtools/load-devel-config 91*2d9fd380Sjfb8856606 # config output: $DPDK_MESON_OPTIONS, $PATH, $PKG_CONFIG_PATH, etc 92*2d9fd380Sjfb8856606 command -v $targetcc >/dev/null 2>&1 || return 1 934418919fSjohnjiang} 944418919fSjohnjiang 95*2d9fd380Sjfb8856606config () # <dir> <builddir> <meson options> 964418919fSjohnjiang{ 97*2d9fd380Sjfb8856606 dir=$1 98d30ea906Sjfb8856606 shift 99*2d9fd380Sjfb8856606 builddir=$1 1004418919fSjohnjiang shift 101*2d9fd380Sjfb8856606 if [ -f "$builddir/build.ninja" ] ; then 102*2d9fd380Sjfb8856606 # for existing environments, switch to debugoptimized if unset 103*2d9fd380Sjfb8856606 # so that ABI checks can run 104*2d9fd380Sjfb8856606 if ! $MESON configure $builddir | 105*2d9fd380Sjfb8856606 awk '$1=="buildtype" {print $2}' | 106*2d9fd380Sjfb8856606 grep -qw debugoptimized; then 107*2d9fd380Sjfb8856606 $MESON configure --buildtype=debugoptimized $builddir 108*2d9fd380Sjfb8856606 fi 109*2d9fd380Sjfb8856606 return 110*2d9fd380Sjfb8856606 fi 111*2d9fd380Sjfb8856606 options= 112*2d9fd380Sjfb8856606 if echo $* | grep -qw -- '--default-library=shared' ; then 113*2d9fd380Sjfb8856606 options="$options -Dexamples=all" 114*2d9fd380Sjfb8856606 else 115*2d9fd380Sjfb8856606 options="$options -Dexamples=l3fwd" # save disk space 116*2d9fd380Sjfb8856606 fi 117*2d9fd380Sjfb8856606 options="$options --buildtype=debugoptimized" 1184418919fSjohnjiang for option in $DPDK_MESON_OPTIONS ; do 1194418919fSjohnjiang options="$options -D$option" 1204418919fSjohnjiang done 1214418919fSjohnjiang options="$options $*" 122*2d9fd380Sjfb8856606 echo "$MESON $options $dir $builddir" >&$verbose 123*2d9fd380Sjfb8856606 $MESON $options $dir $builddir 124*2d9fd380Sjfb8856606} 125*2d9fd380Sjfb8856606 126*2d9fd380Sjfb8856606compile () # <builddir> 127*2d9fd380Sjfb8856606{ 128*2d9fd380Sjfb8856606 builddir=$1 129*2d9fd380Sjfb8856606 if [ -n "$opt_vverbose" ] ; then 1304418919fSjohnjiang # for full output from ninja use "-v" 1314418919fSjohnjiang echo "$ninja_cmd -v -C $builddir" 1324418919fSjohnjiang $ninja_cmd -v -C $builddir 133*2d9fd380Sjfb8856606 elif [ -n "$opt_verbose" ] ; then 1344418919fSjohnjiang # for keeping the history of short cmds, pipe through cat 1354418919fSjohnjiang echo "$ninja_cmd -C $builddir | cat" 1364418919fSjohnjiang $ninja_cmd -C $builddir | cat 1374418919fSjohnjiang else 138d30ea906Sjfb8856606 $ninja_cmd -C $builddir 1394418919fSjohnjiang fi 140d30ea906Sjfb8856606} 141d30ea906Sjfb8856606 142*2d9fd380Sjfb8856606install_target () # <builddir> <installdir> 143*2d9fd380Sjfb8856606{ 144*2d9fd380Sjfb8856606 rm -rf $2 145*2d9fd380Sjfb8856606 echo "DESTDIR=$2 $ninja_cmd -C $1 install" >&$verbose 146*2d9fd380Sjfb8856606 DESTDIR=$2 $ninja_cmd -C $1 install >&$veryverbose 147*2d9fd380Sjfb8856606} 148*2d9fd380Sjfb8856606 149*2d9fd380Sjfb8856606build () # <directory> <target compiler | cross file> <meson options> 150*2d9fd380Sjfb8856606{ 151*2d9fd380Sjfb8856606 targetdir=$1 152*2d9fd380Sjfb8856606 shift 153*2d9fd380Sjfb8856606 crossfile= 154*2d9fd380Sjfb8856606 [ -r $1 ] && crossfile=$1 || targetcc=$1 155*2d9fd380Sjfb8856606 shift 156*2d9fd380Sjfb8856606 # skip build if compiler not available 157*2d9fd380Sjfb8856606 command -v ${CC##* } >/dev/null 2>&1 || return 0 158*2d9fd380Sjfb8856606 if [ -n "$crossfile" ] ; then 159*2d9fd380Sjfb8856606 cross="--cross-file $crossfile" 160*2d9fd380Sjfb8856606 targetcc=$(sed -n 's,^c[[:space:]]*=[[:space:]]*,,p' \ 161*2d9fd380Sjfb8856606 $crossfile | tr -d "'" | tr -d '"') 162*2d9fd380Sjfb8856606 else 163*2d9fd380Sjfb8856606 cross= 1644418919fSjohnjiang fi 165*2d9fd380Sjfb8856606 load_env $targetcc || return 0 166*2d9fd380Sjfb8856606 config $srcdir $builds_dir/$targetdir $cross --werror $* 167*2d9fd380Sjfb8856606 compile $builds_dir/$targetdir 168*2d9fd380Sjfb8856606 if [ -n "$DPDK_ABI_REF_VERSION" ]; then 169*2d9fd380Sjfb8856606 abirefdir=${DPDK_ABI_REF_DIR:-reference}/$DPDK_ABI_REF_VERSION 170*2d9fd380Sjfb8856606 if [ ! -d $abirefdir/$targetdir ]; then 171*2d9fd380Sjfb8856606 # clone current sources 172*2d9fd380Sjfb8856606 if [ ! -d $abirefdir/src ]; then 173*2d9fd380Sjfb8856606 git clone --local --no-hardlinks \ 174*2d9fd380Sjfb8856606 --single-branch \ 175*2d9fd380Sjfb8856606 -b $DPDK_ABI_REF_VERSION \ 176*2d9fd380Sjfb8856606 $srcdir $abirefdir/src 1774418919fSjohnjiang fi 1784418919fSjohnjiang 179*2d9fd380Sjfb8856606 rm -rf $abirefdir/build 180*2d9fd380Sjfb8856606 config $abirefdir/src $abirefdir/build $cross \ 181*2d9fd380Sjfb8856606 -Dexamples= $* 182*2d9fd380Sjfb8856606 compile $abirefdir/build 183*2d9fd380Sjfb8856606 install_target $abirefdir/build $abirefdir/$targetdir 184*2d9fd380Sjfb8856606 $srcdir/devtools/gen-abi.sh $abirefdir/$targetdir 185*2d9fd380Sjfb8856606 186*2d9fd380Sjfb8856606 # save disk space by removing static libs and apps 187*2d9fd380Sjfb8856606 find $abirefdir/$targetdir/usr/local -name '*.a' -delete 188*2d9fd380Sjfb8856606 rm -rf $abirefdir/$targetdir/usr/local/bin 189*2d9fd380Sjfb8856606 rm -rf $abirefdir/$targetdir/usr/local/share 190*2d9fd380Sjfb8856606 fi 191*2d9fd380Sjfb8856606 192*2d9fd380Sjfb8856606 install_target $builds_dir/$targetdir \ 193*2d9fd380Sjfb8856606 $(readlink -f $builds_dir/$targetdir/install) 194*2d9fd380Sjfb8856606 $srcdir/devtools/gen-abi.sh \ 195*2d9fd380Sjfb8856606 $(readlink -f $builds_dir/$targetdir/install) 196*2d9fd380Sjfb8856606 $srcdir/devtools/check-abi.sh $abirefdir/$targetdir \ 197*2d9fd380Sjfb8856606 $(readlink -f $builds_dir/$targetdir/install) 198*2d9fd380Sjfb8856606 fi 199*2d9fd380Sjfb8856606} 200*2d9fd380Sjfb8856606 201d30ea906Sjfb8856606# shared and static linked builds with gcc and clang 202d30ea906Sjfb8856606for c in gcc clang ; do 2031646932aSjfb8856606 command -v $c >/dev/null 2>&1 || continue 204d30ea906Sjfb8856606 for s in static shared ; do 2054418919fSjohnjiang export CC="$CCACHE $c" 2064418919fSjohnjiang build build-$c-$s $c --default-library=$s 207*2d9fd380Sjfb8856606 unset CC 208d30ea906Sjfb8856606 done 209d30ea906Sjfb8856606done 210d30ea906Sjfb8856606 211d30ea906Sjfb8856606# test compilation with minimal x86 instruction set 2124418919fSjohnjiang# Set the install path for libraries to "lib" explicitly to prevent problems 2134418919fSjohnjiang# with pkg-config prefixes if installed in "lib/x86_64-linux-gnu" later. 2141646932aSjfb8856606default_machine='nehalem' 215*2d9fd380Sjfb8856606if ! check_cc_flags "-march=$default_machine" ; then 2161646932aSjfb8856606 default_machine='corei7' 2171646932aSjfb8856606fi 2184418919fSjohnjiangbuild build-x86-default cc -Dlibdir=lib -Dmachine=$default_machine $use_shared 219d30ea906Sjfb8856606 220*2d9fd380Sjfb8856606# 32-bit with default compiler 221*2d9fd380Sjfb8856606if check_cc_flags '-m32' ; then 222*2d9fd380Sjfb8856606 if [ -d '/usr/lib/i386-linux-gnu' ] ; then 223*2d9fd380Sjfb8856606 # 32-bit pkgconfig on Debian/Ubuntu 224*2d9fd380Sjfb8856606 export PKG_CONFIG_LIBDIR='/usr/lib/i386-linux-gnu/pkgconfig' 225*2d9fd380Sjfb8856606 elif [ -d '/usr/lib32' ] ; then 226*2d9fd380Sjfb8856606 # 32-bit pkgconfig on Arch 227*2d9fd380Sjfb8856606 export PKG_CONFIG_LIBDIR='/usr/lib32/pkgconfig' 228*2d9fd380Sjfb8856606 else 229*2d9fd380Sjfb8856606 # 32-bit pkgconfig on RHEL/Fedora (lib vs lib64) 230*2d9fd380Sjfb8856606 export PKG_CONFIG_LIBDIR='/usr/lib/pkgconfig' 231*2d9fd380Sjfb8856606 fi 232*2d9fd380Sjfb8856606 target_override='i386-pc-linux-gnu' 233*2d9fd380Sjfb8856606 build build-32b cc -Dc_args='-m32' -Dc_link_args='-m32' 234*2d9fd380Sjfb8856606 target_override= 235*2d9fd380Sjfb8856606 unset PKG_CONFIG_LIBDIR 236*2d9fd380Sjfb8856606fi 237*2d9fd380Sjfb8856606 238*2d9fd380Sjfb8856606# x86 MinGW 239*2d9fd380Sjfb8856606build build-x86-mingw $srcdir/config/x86/cross-mingw -Dexamples=helloworld 240*2d9fd380Sjfb8856606 2414418919fSjohnjiang# generic armv8a with clang as host compiler 242*2d9fd380Sjfb8856606f=$srcdir/config/arm/arm64_armv8_linux_gcc 2434418919fSjohnjiangexport CC="clang" 244*2d9fd380Sjfb8856606build build-arm64-host-clang $f $use_shared 245*2d9fd380Sjfb8856606unset CC 246*2d9fd380Sjfb8856606# some gcc/arm configurations 2474418919fSjohnjiangfor f in $srcdir/config/arm/arm64_[bdo]*gcc ; do 2484418919fSjohnjiang export CC="$CCACHE gcc" 249*2d9fd380Sjfb8856606 build build-$(basename $f | tr '_' '-' | cut -d'-' -f-2) $f $use_shared 250*2d9fd380Sjfb8856606 unset CC 251*2d9fd380Sjfb8856606done 252*2d9fd380Sjfb8856606 253*2d9fd380Sjfb8856606# ppc configurations 254*2d9fd380Sjfb8856606for f in $srcdir/config/ppc/ppc* ; do 255*2d9fd380Sjfb8856606 build build-$(basename $f | cut -d'-' -f-2) $f $use_shared 256d30ea906Sjfb8856606done 2574418919fSjohnjiang 2584418919fSjohnjiang# Test installation of the x86-default target, to be used for checking 2594418919fSjohnjiang# the sample apps build using the pkg-config file for cflags and libs 2600c6bd470Sfengbojiangload_env cc 2614418919fSjohnjiangbuild_path=$(readlink -f $builds_dir/build-x86-default) 262*2d9fd380Sjfb8856606export DESTDIR=$build_path/install 263*2d9fd380Sjfb8856606# No need to reinstall if ABI checks are enabled 264*2d9fd380Sjfb8856606if [ -z "$DPDK_ABI_REF_VERSION" ]; then 265*2d9fd380Sjfb8856606 install_target $build_path $DESTDIR 266*2d9fd380Sjfb8856606fi 2674418919fSjohnjiangpc_file=$(find $DESTDIR -name libdpdk.pc) 2684418919fSjohnjiangexport PKG_CONFIG_PATH=$(dirname $pc_file):$PKG_CONFIG_PATH 269*2d9fd380Sjfb8856606libdir=$(dirname $(find $DESTDIR -name librte_eal.so)) 270*2d9fd380Sjfb8856606export LD_LIBRARY_PATH=$libdir:$LD_LIBRARY_PATH 271*2d9fd380Sjfb8856606examples=${DPDK_BUILD_TEST_EXAMPLES:-"cmdline helloworld l2fwd l3fwd skeleton timer"} 2724418919fSjohnjiang# if pkg-config defines the necessary flags, test building some examples 2734418919fSjohnjiangif pkg-config --define-prefix libdpdk >/dev/null 2>&1; then 2744418919fSjohnjiang export PKGCONF="pkg-config --define-prefix" 275*2d9fd380Sjfb8856606 for example in $examples; do 2764418919fSjohnjiang echo "## Building $example" 277*2d9fd380Sjfb8856606 $MAKE -C $DESTDIR/usr/local/share/dpdk/examples/$example \ 278*2d9fd380Sjfb8856606 clean shared static >&$veryverbose 2794418919fSjohnjiang done 280d30ea906Sjfb8856606fi 281