xref: /dpdk/.ci/linux-build.sh (revision c0c305ee)
1#!/bin/sh -xe
2
3# Builds are run as root in containers, no need for sudo
4[ "$(id -u)" != '0' ] || alias sudo=
5
6on_error() {
7    if [ $? = 0 ]; then
8        exit
9    fi
10    FILES_TO_PRINT="build/meson-logs/testlog.txt"
11    FILES_TO_PRINT="$FILES_TO_PRINT build/.ninja_log"
12    FILES_TO_PRINT="$FILES_TO_PRINT build/meson-logs/meson-log.txt"
13    FILES_TO_PRINT="$FILES_TO_PRINT build/gdb.log"
14
15    for pr_file in $FILES_TO_PRINT; do
16        if [ -e "$pr_file" ]; then
17            cat "$pr_file"
18        fi
19    done
20}
21# We capture the error logs as artifacts in Github Actions, no need to dump
22# them via a EXIT handler.
23[ -n "$GITHUB_WORKFLOW" ] || trap on_error EXIT
24
25install_libabigail() {
26    version=$1
27    instdir=$2
28
29    wget -q "http://mirrors.kernel.org/sourceware/libabigail/${version}.tar.gz"
30    tar -xf ${version}.tar.gz
31    cd $version && autoreconf -vfi && cd -
32    mkdir $version/build
33    cd $version/build && ../configure --prefix=$instdir && cd -
34    make -C $version/build all install
35    rm -rf $version
36    rm ${version}.tar.gz
37}
38
39configure_coredump() {
40    # No point in configuring coredump without gdb
41    which gdb >/dev/null || return 0
42    ulimit -c unlimited
43    sudo sysctl -w kernel.core_pattern=/tmp/dpdk-core.%e.%p
44}
45
46catch_coredump() {
47    ls /tmp/dpdk-core.*.* 2>/dev/null || return 0
48    for core in /tmp/dpdk-core.*.*; do
49        binary=$(sudo readelf -n $core |grep $(pwd)/build/ 2>/dev/null |head -n1)
50        [ -x $binary ] || binary=
51        sudo gdb $binary -c $core \
52            -ex 'info threads' \
53            -ex 'thread apply all bt full' \
54            -ex 'quit'
55    done |tee -a build/gdb.log
56    return 1
57}
58
59cross_file=
60
61if [ "$AARCH64" = "true" ]; then
62    if [ "${CC%%clang}" != "$CC" ]; then
63        cross_file=config/arm/arm64_armv8_linux_clang_ubuntu
64    else
65        cross_file=config/arm/arm64_armv8_linux_gcc
66    fi
67fi
68
69if [ "$MINGW" = "true" ]; then
70    cross_file=config/x86/cross-mingw
71fi
72
73if [ "$PPC64LE" = "true" ]; then
74    cross_file=config/ppc/ppc64le-power8-linux-gcc-ubuntu
75fi
76
77if [ -n "$cross_file" ]; then
78    OPTS="$OPTS --cross-file $cross_file"
79fi
80
81if [ "$BUILD_DOCS" = "true" ]; then
82    OPTS="$OPTS -Denable_docs=true"
83fi
84
85if [ "$BUILD_32BIT" = "true" ]; then
86    OPTS="$OPTS -Dc_args=-m32 -Dc_link_args=-m32"
87    OPTS="$OPTS -Dcpp_args=-m32 -Dcpp_link_args=-m32"
88    export PKG_CONFIG_LIBDIR="/usr/lib32/pkgconfig"
89fi
90
91if [ "$MINGW" = "true" ]; then
92    OPTS="$OPTS -Dexamples=helloworld"
93elif [ "$DEF_LIB" = "static" ]; then
94    OPTS="$OPTS -Dexamples=l2fwd,l3fwd"
95else
96    OPTS="$OPTS -Dexamples=all"
97fi
98
99OPTS="$OPTS -Dplatform=generic"
100OPTS="$OPTS --default-library=$DEF_LIB"
101OPTS="$OPTS --buildtype=debugoptimized"
102OPTS="$OPTS -Dcheck_includes=true"
103if [ "$MINI" = "true" ]; then
104    OPTS="$OPTS -Denable_drivers=net/null"
105    OPTS="$OPTS -Ddisable_libs=*"
106fi
107
108if [ "$ASAN" = "true" ]; then
109    OPTS="$OPTS -Db_sanitize=address"
110    if [ "${CC%%clang}" != "$CC" ]; then
111        OPTS="$OPTS -Db_lundef=false"
112    fi
113fi
114
115meson build --werror $OPTS
116ninja -C build
117
118if [ -z "$cross_file" ]; then
119    failed=
120    configure_coredump
121    devtools/test-null.sh || failed="true"
122    catch_coredump
123    [ "$failed" != "true" ]
124fi
125
126if [ "$ABI_CHECKS" = "true" ]; then
127    if [ "$(cat libabigail/VERSION 2>/dev/null)" != "$LIBABIGAIL_VERSION" ]; then
128        rm -rf libabigail
129        # if we change libabigail, invalidate existing abi cache
130        rm -rf reference
131    fi
132
133    if [ ! -d libabigail ]; then
134        install_libabigail "$LIBABIGAIL_VERSION" $(pwd)/libabigail
135        echo $LIBABIGAIL_VERSION > libabigail/VERSION
136    fi
137
138    export PATH=$(pwd)/libabigail/bin:$PATH
139
140    REF_GIT_REPO=${REF_GIT_REPO:-https://dpdk.org/git/dpdk}
141
142    if [ "$(cat reference/VERSION 2>/dev/null)" != "$REF_GIT_TAG" ]; then
143        rm -rf reference
144    fi
145
146    if [ ! -d reference ]; then
147        refsrcdir=$(readlink -f $(pwd)/../dpdk-$REF_GIT_TAG)
148        git clone --single-branch -b "$REF_GIT_TAG" $REF_GIT_REPO $refsrcdir
149        meson $OPTS -Dexamples= $refsrcdir $refsrcdir/build
150        ninja -C $refsrcdir/build
151        DESTDIR=$(pwd)/reference ninja -C $refsrcdir/build install
152        devtools/gen-abi.sh reference
153        find reference/usr/local -name '*.a' -delete
154        rm -rf reference/usr/local/bin
155        rm -rf reference/usr/local/share
156        echo $REF_GIT_TAG > reference/VERSION
157    fi
158
159    DESTDIR=$(pwd)/install ninja -C build install
160    devtools/gen-abi.sh install
161    devtools/check-abi.sh reference install ${ABI_CHECKS_WARN_ONLY:-}
162fi
163
164if [ "$RUN_TESTS" = "true" ]; then
165    failed=
166    configure_coredump
167    sudo meson test -C build --suite fast-tests -t 3 || failed="true"
168    catch_coredump
169    [ "$failed" != "true" ]
170fi
171