14eb8f5b4SMichal Berger#!/usr/bin/env bash 24eb8f5b4SMichal Berger# SPDX-License-Identifier: BSD-3-Clause 34eb8f5b4SMichal Berger# Copyright (C) 2022 Intel Corporation. 44eb8f5b4SMichal Berger# All rights reserved. 54eb8f5b4SMichal Berger 66a4b6784SMichal Bergerspdk_conf=${spdk_conf:-"$1"} 76a4b6784SMichal Berger 86a4b6784SMichal Bergerif [[ ! -f $spdk_conf ]]; then 96a4b6784SMichal Berger echo "ERROR: SPDK test configuration not specified" 106a4b6784SMichal Berger return 1 116a4b6784SMichal Bergerfi 126a4b6784SMichal Berger 136a4b6784SMichal Bergersource "$spdk_conf" 144eb8f5b4SMichal Bergersource "$rootdir/test/common/autotest_common.sh" 154eb8f5b4SMichal Bergersource "$rootdir/scripts/common.sh" 164eb8f5b4SMichal Berger 1758ac71a4SMichal Berger_ocf_precompile() { 184eb8f5b4SMichal Berger # We compile OCF sources ourselves 194eb8f5b4SMichal Berger # They don't need to be checked with scanbuild and code coverage is not applicable 204eb8f5b4SMichal Berger # So we precompile OCF now for further use as standalone static library 211995571dSMichal Berger "$rootdir/configure" $(echo $config_params | sed 's/--enable-coverage//g') 224eb8f5b4SMichal Berger $MAKE $MAKEFLAGS include/spdk/config.h 231995571dSMichal Berger CC=gcc CCAR=ar $MAKE $MAKEFLAGS -C "$rootdir/lib/env_ocf" exportlib O="$rootdir/ocf.a" 244eb8f5b4SMichal Berger # Set config to use precompiled library 254eb8f5b4SMichal Berger config_params="$config_params --with-ocf=/$rootdir/ocf.a" 264eb8f5b4SMichal Berger # need to reconfigure to avoid clearing ocf related files on future make clean. 271995571dSMichal Berger "$rootdir/configure" $config_params 284eb8f5b4SMichal Berger} 294eb8f5b4SMichal Berger 304eb8f5b4SMichal Berger# Find matching llvm fuzzer library and clang compiler version 3158ac71a4SMichal Berger_llvm_precompile() { 324eb8f5b4SMichal Berger [[ $(clang --version) =~ "version "(([0-9]+).([0-9]+).([0-9]+)) ]] 334eb8f5b4SMichal Berger clang_num=${BASH_REMATCH[2]} 344eb8f5b4SMichal Berger 354eb8f5b4SMichal Berger export CC=clang-$clang_num 364eb8f5b4SMichal Berger export CXX=clang++-$clang_num 374eb8f5b4SMichal Berger 38e7544515SMichal Berger fuzzer_libs=(/usr/lib*/clang/@("$clang_num"|"$clang_version")/lib/*linux*/libclang_rt.fuzzer_no_main?(-x86_64).a) 394eb8f5b4SMichal Berger fuzzer_lib=${fuzzer_libs[0]} 404eb8f5b4SMichal Berger [[ -e $fuzzer_lib ]] 414eb8f5b4SMichal Berger 424eb8f5b4SMichal Berger config_params="$config_params --with-fuzzer=$fuzzer_lib" 431995571dSMichal Berger # need to reconfigure to avoid clearing llvm related files on future make clean. 441995571dSMichal Berger "$rootdir/configure" $config_params 454eb8f5b4SMichal Berger} 464eb8f5b4SMichal Berger 4758ac71a4SMichal Berger_build_native_dpdk() { 484eb8f5b4SMichal Berger local external_dpdk_dir 494eb8f5b4SMichal Berger local external_dpdk_base_dir 504eb8f5b4SMichal Berger local compiler_version 514eb8f5b4SMichal Berger local compiler 524eb8f5b4SMichal Berger local dpdk_kmods 535d989b1eSPawel Piatek local repo='dpdk' 544eb8f5b4SMichal Berger 554eb8f5b4SMichal Berger compiler=${CC:-gcc} 564eb8f5b4SMichal Berger 574eb8f5b4SMichal Berger # Export CC to be absolutely sure it's set. 584eb8f5b4SMichal Berger # If CC was not set and we defaulted to "gcc" then we need to do the export 594eb8f5b4SMichal Berger # so that "meson build" command a few lines below is aware of which compiler 604eb8f5b4SMichal Berger # to use. 614eb8f5b4SMichal Berger export CC="$compiler" 624eb8f5b4SMichal Berger 634eb8f5b4SMichal Berger if [[ $compiler != *clang* && $compiler != *gcc* ]]; then 644eb8f5b4SMichal Berger echo "Unsupported compiler detected ($compiler), failing the test" >&2 654eb8f5b4SMichal Berger return 1 664eb8f5b4SMichal Berger fi 674eb8f5b4SMichal Berger 684eb8f5b4SMichal Berger compiler_version=$("$compiler" -dumpversion) 694eb8f5b4SMichal Berger compiler_version=${compiler_version%%.*} 704eb8f5b4SMichal Berger external_dpdk_dir="$SPDK_RUN_EXTERNAL_DPDK" 714eb8f5b4SMichal Berger external_dpdk_base_dir="$(dirname $external_dpdk_dir)" 724eb8f5b4SMichal Berger 734eb8f5b4SMichal Berger if [[ ! -d "$external_dpdk_base_dir" ]]; then 74b6acb821SKamil Godzwon if [[ $SPDK_TEST_NATIVE_DPDK != 'main' ]]; then 75b6acb821SKamil Godzwon repo='dpdk-stable' 76b6acb821SKamil Godzwon fi 77b6acb821SKamil Godzwon echo "DPDK directory does not exist at the provided location." 784eb8f5b4SMichal Berger sudo mkdir -p "$external_dpdk_base_dir" 794eb8f5b4SMichal Berger sudo chown -R $(whoami) "$external_dpdk_base_dir"/.. 80b6acb821SKamil Godzwon git clone --branch "$SPDK_TEST_NATIVE_DPDK" --depth 1 http://dpdk.org/git/${repo} "$external_dpdk_base_dir" 814eb8f5b4SMichal Berger fi 824eb8f5b4SMichal Berger orgdir=$PWD 834eb8f5b4SMichal Berger git -C "$external_dpdk_base_dir" log --oneline -n 5 844eb8f5b4SMichal Berger 854eb8f5b4SMichal Berger dpdk_cflags="-fPIC -g -fcommon" 864eb8f5b4SMichal Berger dpdk_ldflags="" 874eb8f5b4SMichal Berger dpdk_ver=$(< "$external_dpdk_base_dir/VERSION") 884eb8f5b4SMichal Berger 894eb8f5b4SMichal Berger if [[ $compiler == *gcc* && $compiler_version -ge 5 ]]; then 904eb8f5b4SMichal Berger dpdk_cflags+=" -Werror" 914eb8f5b4SMichal Berger fi 924eb8f5b4SMichal Berger 934eb8f5b4SMichal Berger if [[ $compiler == *gcc* && $compiler_version -ge 10 ]]; then 944eb8f5b4SMichal Berger dpdk_cflags+=" -Wno-stringop-overflow" 954eb8f5b4SMichal Berger fi 964eb8f5b4SMichal Berger 974eb8f5b4SMichal Berger # the drivers we use 984eb8f5b4SMichal Berger # net/i40e driver is not really needed by us, but it's built as a workaround 994eb8f5b4SMichal Berger # for DPDK issue: https://bugs.dpdk.org/show_bug.cgi?id=576 1008d982edaSKonrad Sztyber DPDK_DRIVERS=("bus" "bus/pci" "bus/vdev" "mempool/ring" "net/i40e" "net/i40e/base" 1018d982edaSKonrad Sztyber "power/acpi" "power/amd_pstate" "power/cppc" "power/intel_pstate" 1028d982edaSKonrad Sztyber "power/intel_uncore" "power/kvm_vm") 1034eb8f5b4SMichal Berger local mlx5_libs_added="n" 1044eb8f5b4SMichal Berger if [[ "$SPDK_TEST_CRYPTO" -eq 1 || "$SPDK_TEST_SMA" -eq 1 ]]; then 1054eb8f5b4SMichal Berger intel_ipsec_mb_ver=v0.54 1064eb8f5b4SMichal Berger intel_ipsec_mb_drv=crypto/aesni_mb 1074eb8f5b4SMichal Berger intel_ipsec_lib="" 108*f22e807fSKonrad Sztyber if ge "$dpdk_ver" 24.11.0; then 109*f22e807fSKonrad Sztyber # Starting from 24.11.0, the minimum supported version of intel-ipsec-mb is 110*f22e807fSKonrad Sztyber # v1.5. 111*f22e807fSKonrad Sztyber intel_ipsec_mb_ver=v1.5 112*f22e807fSKonrad Sztyber intel_ipsec_mb_drv=crypto/ipsec_mb 113*f22e807fSKonrad Sztyber intel_ipsec_lib=lib 114*f22e807fSKonrad Sztyber elif ge "$dpdk_ver" 21.11.0; then 1154eb8f5b4SMichal Berger # Minimum supported version of intel-ipsec-mb, for DPDK >= 21.11, is 1.0. 1164eb8f5b4SMichal Berger # Source of the aesni_mb driver was moved to ipsec_mb. .{h,so,a} were moved 1174eb8f5b4SMichal Berger # to ./lib. 1184eb8f5b4SMichal Berger # https://github.com/dpdk/dpdk/commit/918fd2f1466b0e3b21a033df7012a77a83665582. 1194eb8f5b4SMichal Berger intel_ipsec_mb_ver=v1.0 1204eb8f5b4SMichal Berger intel_ipsec_mb_drv=crypto/ipsec_mb 1214eb8f5b4SMichal Berger intel_ipsec_lib=lib 1224eb8f5b4SMichal Berger fi 1234eb8f5b4SMichal Berger git clone --branch "$intel_ipsec_mb_ver" --depth 1 https://github.com/intel/intel-ipsec-mb.git "$external_dpdk_base_dir/intel-ipsec-mb" 1244eb8f5b4SMichal Berger cd "$external_dpdk_base_dir/intel-ipsec-mb" 1254eb8f5b4SMichal Berger $MAKE $MAKEFLAGS all SHARED=y EXTRA_CFLAGS=-fPIC 1264eb8f5b4SMichal Berger DPDK_DRIVERS+=("crypto") 1274eb8f5b4SMichal Berger DPDK_DRIVERS+=("$intel_ipsec_mb_drv") 1284eb8f5b4SMichal Berger DPDK_DRIVERS+=("crypto/qat") 1294eb8f5b4SMichal Berger DPDK_DRIVERS+=("compress/qat") 1304eb8f5b4SMichal Berger DPDK_DRIVERS+=("common/qat") 1314eb8f5b4SMichal Berger # 21.11.0 is version of DPDK with stable support for mlx5 crypto. 1324eb8f5b4SMichal Berger if ge "$dpdk_ver" 21.11.0; then 1334eb8f5b4SMichal Berger # SPDK enables CRYPTO_MLX in case supported version of DPDK is detected 1344eb8f5b4SMichal Berger # so make sure proper libs are built. 1354eb8f5b4SMichal Berger DPDK_DRIVERS+=("bus/auxiliary") 1364eb8f5b4SMichal Berger DPDK_DRIVERS+=("common/mlx5") 1374eb8f5b4SMichal Berger DPDK_DRIVERS+=("common/mlx5/linux") 1384eb8f5b4SMichal Berger DPDK_DRIVERS+=("crypto/mlx5") 1394eb8f5b4SMichal Berger mlx5_libs_added="y" 1404eb8f5b4SMichal Berger fi 1414eb8f5b4SMichal Berger dpdk_cflags+=" -I$external_dpdk_base_dir/intel-ipsec-mb/$intel_ipsec_lib" 1424eb8f5b4SMichal Berger dpdk_ldflags+=" -L$external_dpdk_base_dir/intel-ipsec-mb/$intel_ipsec_lib" 1434eb8f5b4SMichal Berger export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$external_dpdk_base_dir/intel-ipsec-mb/$intel_ipsec_lib" 1444eb8f5b4SMichal Berger fi 1454eb8f5b4SMichal Berger 1464eb8f5b4SMichal Berger if [[ "$SPDK_TEST_VBDEV_COMPRESS" -eq 1 ]]; then 1474eb8f5b4SMichal Berger isal_dir="$external_dpdk_base_dir/isa-l" 1484eb8f5b4SMichal Berger git clone --branch v2.29.0 --depth 1 https://github.com/intel/isa-l.git "$isal_dir" 1494eb8f5b4SMichal Berger 1504eb8f5b4SMichal Berger cd $isal_dir 1514eb8f5b4SMichal Berger ./autogen.sh 1524eb8f5b4SMichal Berger ./configure CFLAGS="-fPIC -g -O2" --enable-shared=yes --prefix="$isal_dir/build" 1534eb8f5b4SMichal Berger ln -s $PWD/include $PWD/isa-l 1544eb8f5b4SMichal Berger $MAKE $MAKEFLAGS all 1554eb8f5b4SMichal Berger $MAKE install 1564eb8f5b4SMichal Berger DPDK_DRIVERS+=("compress") 1574eb8f5b4SMichal Berger DPDK_DRIVERS+=("compress/isal") 1584eb8f5b4SMichal Berger DPDK_DRIVERS+=("compress/qat") 1594eb8f5b4SMichal Berger DPDK_DRIVERS+=("common/qat") 1604eb8f5b4SMichal Berger if ge "$dpdk_ver" 21.02.0; then 1614eb8f5b4SMichal Berger # SPDK enables REDUCE_MLX in case supported version of DPDK is detected 1624eb8f5b4SMichal Berger # so make sure proper libs are built. 1634eb8f5b4SMichal Berger if test $mlx5_libs_added = "n"; then 1644eb8f5b4SMichal Berger DPDK_DRIVERS+=("bus/auxiliary") 1654eb8f5b4SMichal Berger DPDK_DRIVERS+=("common/mlx5") 1664eb8f5b4SMichal Berger DPDK_DRIVERS+=("common/mlx5/linux") 1674eb8f5b4SMichal Berger fi 1684eb8f5b4SMichal Berger DPDK_DRIVERS+=("compress/mlx5") 1694eb8f5b4SMichal Berger fi 1704eb8f5b4SMichal Berger export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$isal_dir/build/lib/pkgconfig" 1714eb8f5b4SMichal Berger export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$isal_dir/build/lib" 1724eb8f5b4SMichal Berger fi 1734eb8f5b4SMichal Berger 1744eb8f5b4SMichal Berger cd $external_dpdk_base_dir 1754eb8f5b4SMichal Berger if [ "$(uname -s)" = "Linux" ]; then 1764eb8f5b4SMichal Berger if lt $dpdk_ver 21.11.0; then 1774eb8f5b4SMichal Berger patch -p1 < "$rootdir/test/common/config/pkgdep/patches/dpdk/20.11/dpdk_pci.patch" 1784eb8f5b4SMichal Berger patch -p1 < "$rootdir/test/common/config/pkgdep/patches/dpdk/20.11/dpdk_qat.patch" 1794eb8f5b4SMichal Berger else 1804eb8f5b4SMichal Berger patch -p1 < "$rootdir/test/common/config/pkgdep/patches/dpdk/21.11+/dpdk_qat.patch" 1814eb8f5b4SMichal Berger fi 1824eb8f5b4SMichal Berger fi 18394a53a53SKonrad Sztyber if lt "$dpdk_ver" 24.07.0; then 18494a53a53SKonrad Sztyber patch -p1 < "$rootdir/test/common/config/pkgdep/patches/dpdk/24.03/pcapng-add-memcpy-check.patch" 18594a53a53SKonrad Sztyber fi 1865accc87aSMichal Berger if ge "$dpdk_ver" 24.07.0; then 1875accc87aSMichal Berger patch -p1 < "$rootdir/test/common/config/pkgdep/patches/dpdk/24.07/uio-open-in-primary.patch" 1885accc87aSMichal Berger fi 1894eb8f5b4SMichal Berger 1904eb8f5b4SMichal Berger dpdk_kmods="false" 1914eb8f5b4SMichal Berger if [ "$(uname -s)" = "FreeBSD" ]; then 1924eb8f5b4SMichal Berger dpdk_kmods="true" 1934eb8f5b4SMichal Berger fi 1944eb8f5b4SMichal Berger 1954eb8f5b4SMichal Berger meson build-tmp --prefix="$external_dpdk_dir" --libdir lib \ 1964eb8f5b4SMichal Berger -Denable_docs=false -Denable_kmods="$dpdk_kmods" -Dtests=false \ 1974eb8f5b4SMichal Berger -Dc_link_args="$dpdk_ldflags" -Dc_args="$dpdk_cflags" \ 1984eb8f5b4SMichal Berger -Dmachine=native -Denable_drivers=$(printf "%s," "${DPDK_DRIVERS[@]}") 1994eb8f5b4SMichal Berger ninja -C "$external_dpdk_base_dir/build-tmp" $MAKEFLAGS 2004eb8f5b4SMichal Berger 20186ad46dbSMichal Berger if [[ $(uname -s) == "FreeBSD" ]]; then 2028ee698f8SMichal Berger # Under FreeBSD, install requires root privileges since it also attempts to install 2038ee698f8SMichal Berger # requested drivers under /boot. 2048ee698f8SMichal Berger sudo -E ninja -C "$external_dpdk_base_dir/build-tmp" $MAKEFLAGS install 2058ee698f8SMichal Berger # Sanitize ownership of the target directory post sudo above 2068ee698f8SMichal Berger sudo chown -R "$USER" "$external_dpdk_base_dir" 20786ad46dbSMichal Berger # Make sure kernel modules are available for freebsd_update_contigmem_mod() to fetch 20886ad46dbSMichal Berger mapfile -t drivers < <(find "$external_dpdk_base_dir/build-tmp" -name '*.ko') 20986ad46dbSMichal Berger if ((${#drivers[@]} > 0)); then 21086ad46dbSMichal Berger mkdir -p "$external_dpdk_dir/kmod" 21186ad46dbSMichal Berger cp -f "${drivers[@]}" "$external_dpdk_dir/kmod/" 21286ad46dbSMichal Berger fi 2138ee698f8SMichal Berger else 2148ee698f8SMichal Berger ninja -C "$external_dpdk_base_dir/build-tmp" $MAKEFLAGS install 2158ee698f8SMichal Berger 21686ad46dbSMichal Berger fi 21786ad46dbSMichal Berger 2184eb8f5b4SMichal Berger # Save this path. In tests are run using autorun.sh then autotest.sh 2194eb8f5b4SMichal Berger # script will be unaware of LD_LIBRARY_PATH and will fail tests. 220fc0214d5SMichal Berger cat <<- LD_PATH > /tmp/spdk-ld-path 221fc0214d5SMichal Berger export LD_LIBRARY_PATH=$LD_LIBRARY_PATH 222fc0214d5SMichal Berger export PKG_CONFIG_PATH=$PKG_CONFIG_PATH 223fc0214d5SMichal Berger LD_PATH 2244eb8f5b4SMichal Berger 2254eb8f5b4SMichal Berger cd "$orgdir" 2264eb8f5b4SMichal Berger} 2274eb8f5b4SMichal Berger 2284eb8f5b4SMichal Bergercheck_dpdk_pci_api() { 2294eb8f5b4SMichal Berger local dpdk_dir 2304eb8f5b4SMichal Berger 2314eb8f5b4SMichal Berger if [[ -n "$SPDK_TEST_NATIVE_DPDK" ]]; then 2324eb8f5b4SMichal Berger dpdk_dir=$(dirname "$SPDK_RUN_EXTERNAL_DPDK") 2334eb8f5b4SMichal Berger fi 2344eb8f5b4SMichal Berger 2354eb8f5b4SMichal Berger "$rootdir/scripts/env_dpdk/check_dpdk_pci_api.sh" check "$dpdk_dir" 2364eb8f5b4SMichal Berger} 2374eb8f5b4SMichal Berger 2384eb8f5b4SMichal Bergermake_fail_cleanup() { 2394eb8f5b4SMichal Berger if [ -d $out/scan-build-tmp ]; then 2404eb8f5b4SMichal Berger scanoutput=$(ls -1 $out/scan-build-tmp/) 2414eb8f5b4SMichal Berger mv $out/scan-build-tmp/$scanoutput $out/scan-build 2424eb8f5b4SMichal Berger rm -rf $out/scan-build-tmp 2434eb8f5b4SMichal Berger chmod -R a+rX $out/scan-build 2444eb8f5b4SMichal Berger fi 2454eb8f5b4SMichal Berger false 2464eb8f5b4SMichal Berger} 2474eb8f5b4SMichal Berger 24858ac71a4SMichal Berger_scanbuild_make() { 2494eb8f5b4SMichal Berger pass=true 2504eb8f5b4SMichal Berger "$rootdir/configure" $config_params --without-shared 2514eb8f5b4SMichal Berger $scanbuild $MAKE $MAKEFLAGS > $out/build_output.txt && rm -rf $out/scan-build-tmp || make_fail_cleanup 2524eb8f5b4SMichal Berger xtrace_disable 2534eb8f5b4SMichal Berger 2544eb8f5b4SMichal Berger rm -f $out/*files.txt 2554eb8f5b4SMichal Berger for ent in $(find app examples lib module test -type f | grep -vF ".h"); do 2564eb8f5b4SMichal Berger if [[ $ent == lib/env_ocf* ]]; then continue; fi 2574eb8f5b4SMichal Berger if file -bi $ent | grep -q 'text/x-c'; then 2584eb8f5b4SMichal Berger echo $ent | sed 's/\.cp\{0,2\}$//g' >> $out/all_c_files.txt 2594eb8f5b4SMichal Berger fi 2604eb8f5b4SMichal Berger done 2614eb8f5b4SMichal Berger xtrace_restore 2624eb8f5b4SMichal Berger 2634eb8f5b4SMichal Berger grep -E "CC|CXX" $out/build_output.txt | sed 's/\s\s\(CC\|CXX\)\s//g' | sed 's/\.o//g' > $out/built_c_files.txt 2644eb8f5b4SMichal Berger cat $rootdir/test/common/skipped_build_files.txt >> $out/built_c_files.txt 2654eb8f5b4SMichal Berger 2664eb8f5b4SMichal Berger sort -o $out/all_c_files.txt $out/all_c_files.txt 2674eb8f5b4SMichal Berger sort -o $out/built_c_files.txt $out/built_c_files.txt 2684eb8f5b4SMichal Berger # from comm manual: 2694eb8f5b4SMichal Berger # -2 suppress column 2 (lines unique to FILE2) 2704eb8f5b4SMichal Berger # -3 suppress column 3 (lines that appear in both files) 2714eb8f5b4SMichal Berger # comm may exit 1 if no lines were printed (undocumented, unreliable) 2724eb8f5b4SMichal Berger comm -2 -3 $out/all_c_files.txt $out/built_c_files.txt > $out/unbuilt_c_files.txt || true 2734eb8f5b4SMichal Berger 2744eb8f5b4SMichal Berger if [ $(wc -l < $out/unbuilt_c_files.txt) -ge 1 ]; then 2754eb8f5b4SMichal Berger echo "missing files" 2764eb8f5b4SMichal Berger cat <<- ERROR 2774eb8f5b4SMichal Berger The following C files were not built. Either scanbuild CI job needs to 2784eb8f5b4SMichal Berger be updated with proper flags to build these files, or exceptions need 2794eb8f5b4SMichal Berger to be added to test/common/skipped_build_files.txt 2804eb8f5b4SMichal Berger 2814eb8f5b4SMichal Berger $(< "$out/unbuilt_c_files.txt") 2824eb8f5b4SMichal Berger ERROR 2834eb8f5b4SMichal Berger pass=false 2844eb8f5b4SMichal Berger fi 2854eb8f5b4SMichal Berger 2864eb8f5b4SMichal Berger $pass 2874eb8f5b4SMichal Berger} 2884eb8f5b4SMichal Berger 2894eb8f5b4SMichal Bergerporcelain_check() { 2904eb8f5b4SMichal Berger if [ $(git status --porcelain --ignore-submodules | wc -l) -ne 0 ]; then 2914eb8f5b4SMichal Berger echo "Generated files missing from .gitignore:" 2924eb8f5b4SMichal Berger git status --porcelain --ignore-submodules 2934eb8f5b4SMichal Berger exit 1 2944eb8f5b4SMichal Berger fi 2954eb8f5b4SMichal Berger} 2964eb8f5b4SMichal Berger 2974eb8f5b4SMichal Berger# Check that header file dependencies are working correctly by 2984eb8f5b4SMichal Berger# capturing a binary's stat data before and after touching a 2994eb8f5b4SMichal Berger# header file and re-making. 3004eb8f5b4SMichal Bergerheader_dependency_check() { 3014eb8f5b4SMichal Berger STAT1=$(stat $SPDK_BIN_DIR/spdk_tgt) 3024eb8f5b4SMichal Berger sleep 1 3031995571dSMichal Berger touch "$rootdir/lib/nvme/nvme_internal.h" 3044eb8f5b4SMichal Berger $MAKE $MAKEFLAGS 3054eb8f5b4SMichal Berger STAT2=$(stat $SPDK_BIN_DIR/spdk_tgt) 3064eb8f5b4SMichal Berger 3074eb8f5b4SMichal Berger if [ "$STAT1" == "$STAT2" ]; then 3084eb8f5b4SMichal Berger echo "Header dependency check failed" 3094eb8f5b4SMichal Berger false 3104eb8f5b4SMichal Berger fi 3114eb8f5b4SMichal Berger} 3124eb8f5b4SMichal Berger 31392109c88SMichal Bergertest_make_install() { 31492109c88SMichal Berger $MAKE $MAKEFLAGS install DESTDIR="$SPDK_WORKSPACE" prefix=/usr 31592109c88SMichal Berger} 31692109c88SMichal Berger 3174eb8f5b4SMichal Bergertest_make_uninstall() { 3184eb8f5b4SMichal Berger # Create empty file to check if it is not deleted by target uninstall 3194eb8f5b4SMichal Berger touch "$SPDK_WORKSPACE/usr/lib/sample_xyz.a" 3204eb8f5b4SMichal Berger $MAKE $MAKEFLAGS uninstall DESTDIR="$SPDK_WORKSPACE" prefix=/usr 321faae7da2SBen Walker if [[ $(find "$SPDK_WORKSPACE/usr" -type f -print | wc -l) -ne 1 ]]; then 3224eb8f5b4SMichal Berger ls -lR "$SPDK_WORKSPACE" 3234eb8f5b4SMichal Berger echo "Make uninstall failed" 3244eb8f5b4SMichal Berger exit 1 3254eb8f5b4SMichal Berger fi 3264eb8f5b4SMichal Berger} 3274eb8f5b4SMichal Berger 328533039a2SMichal Berger_build_doc() { 3294eb8f5b4SMichal Berger local doxygenv 3304eb8f5b4SMichal Berger doxygenv=$(doxygen --version) 3314eb8f5b4SMichal Berger 33274efab1eSMichal Berger $MAKE -C "$rootdir"/doc --no-print-directory $MAKEFLAGS Q=@ &> "$out"/doxygen.log 3334eb8f5b4SMichal Berger if [ -s "$out"/doxygen.log ]; then 3344eb8f5b4SMichal Berger if [[ "$doxygenv" == "1.8.20" ]]; then 3354eb8f5b4SMichal Berger # Doxygen 1.8.20 produces false positives, see: 3364eb8f5b4SMichal Berger # https://github.com/doxygen/doxygen/issues/7948 3370fa77938SMichal Berger grep -vE '\\ilinebr' 3384eb8f5b4SMichal Berger elif [[ "$doxygenv" == "1.9.5" ]]; then 3394eb8f5b4SMichal Berger # Doxygen 1.9.5 produces false positives, see: 3404eb8f5b4SMichal Berger # https://github.com/doxygen/doxygen/issues/9552 and 3414eb8f5b4SMichal Berger # https://github.com/doxygen/doxygen/issues/9678 3420fa77938SMichal Berger grep -vE '\\ifile|@param' 343a01e1ef9SMichal Berger else 344a01e1ef9SMichal Berger cat - 3450fa77938SMichal Berger fi < "$out/doxygen.log" && echo "Doxygen errors found!" && return 1 3464eb8f5b4SMichal Berger 3474eb8f5b4SMichal Berger echo "Doxygen $doxygenv detected. No warnings except false positives, continuing the test" 3484eb8f5b4SMichal Berger fi 3494eb8f5b4SMichal Berger if hash pdflatex 2> /dev/null; then 3504eb8f5b4SMichal Berger $MAKE -C "$rootdir"/doc/output/latex --no-print-directory $MAKEFLAGS &>> "$out"/doxygen.log 3514eb8f5b4SMichal Berger fi 3524eb8f5b4SMichal Berger mkdir -p "$out"/doc 3534eb8f5b4SMichal Berger # Copy and remove files to avoid mv: failed to preserve ownership error 3544eb8f5b4SMichal Berger cp -r --preserve=mode "$rootdir"/doc/output/html "$out"/doc 3554eb8f5b4SMichal Berger rm -rf "$rootdir"/doc/output/html 3564eb8f5b4SMichal Berger if [ -f "$rootdir"/doc/output/latex/refman.pdf ]; then 3574eb8f5b4SMichal Berger mv "$rootdir"/doc/output/latex/refman.pdf "$out"/doc/spdk.pdf 3584eb8f5b4SMichal Berger fi 3594eb8f5b4SMichal Berger $MAKE -C "$rootdir"/doc --no-print-directory $MAKEFLAGS clean &>> "$out"/doxygen.log 3604eb8f5b4SMichal Berger if [ -s "$out"/doxygen.log ]; then 3614eb8f5b4SMichal Berger # Save the log as an artifact in case we are working with potentially broken version 3624eb8f5b4SMichal Berger eq "$doxygenv" 1.8.20 || rm "$out"/doxygen.log 3634eb8f5b4SMichal Berger fi 3644eb8f5b4SMichal Berger rm -rf "$rootdir"/doc/output 3654eb8f5b4SMichal Berger} 3664eb8f5b4SMichal Berger 367533039a2SMichal Bergercheck_format() { 3681995571dSMichal Berger run_test "autobuild_check_format" "$rootdir/scripts/check_format.sh" 369533039a2SMichal Berger} 370533039a2SMichal Berger 371533039a2SMichal Bergercheck_so_deps() { 372aab7c20fSTomasz Zawadzki run_test "autobuild_check_so_deps" "$rootdir/test/make/check_so_deps.sh" -c "$spdk_conf" -a "$SPDK_ABI_DIR" 373533039a2SMichal Berger} 374533039a2SMichal Berger 375533039a2SMichal Bergerexternal_code() { 376533039a2SMichal Berger run_test "autobuild_external_code" "$rootdir/test/external_code/test_make.sh" "$rootdir" 377533039a2SMichal Berger} 378533039a2SMichal Berger 379533039a2SMichal Bergerdpdk_pci_api() { 3804eb8f5b4SMichal Berger run_test "autobuild_check_dpdk_pci_api" check_dpdk_pci_api 381533039a2SMichal Berger} 382533039a2SMichal Berger 383533039a2SMichal Bergerbuild_files() { 3841995571dSMichal Berger "$rootdir/configure" $config_params --without-shared 3854eb8f5b4SMichal Berger $MAKE $MAKEFLAGS 3864eb8f5b4SMichal Berger run_test "autobuild_generated_files_check" porcelain_check 3874eb8f5b4SMichal Berger run_test "autobuild_header_dependency_check" header_dependency_check 38892109c88SMichal Berger run_test "autobuild_make_install" test_make_install 3894eb8f5b4SMichal Berger run_test "autobuild_make_uninstall" test_make_uninstall 39035d679a7SMichal Berger $MAKE clean 39135d679a7SMichal Berger run_test "autobuild_generated_files_check_post_clean" porcelain_check 392533039a2SMichal Berger} 393533039a2SMichal Berger 394533039a2SMichal Bergerbuild_doc() { 395533039a2SMichal Berger run_test "autobuild_build_doc" _build_doc 396533039a2SMichal Berger} 397533039a2SMichal Berger 3982bd4ba6eSMichal Bergerautobuild_test_suite_tiny() { 399533039a2SMichal Berger check_format 40088f8a6caSMichal Berger check_so_deps 401533039a2SMichal Berger dpdk_pci_api 4022bd4ba6eSMichal Berger} 4032bd4ba6eSMichal Berger 4042bd4ba6eSMichal Bergerautobuild_test_suite_ext() { 405533039a2SMichal Berger external_code 4062bd4ba6eSMichal Berger} 4072bd4ba6eSMichal Berger 4082bd4ba6eSMichal Bergerautobuild_test_suite_full() { 40988f8a6caSMichal Berger autobuild_test_suite_tiny 4102bd4ba6eSMichal Berger autobuild_test_suite_ext 411533039a2SMichal Berger build_files 412533039a2SMichal Berger build_doc 4132bd4ba6eSMichal Berger} 4142bd4ba6eSMichal Berger 41558ac71a4SMichal Berger_autobuild_test_suite() { 4162bd4ba6eSMichal Berger case "$SPDK_TEST_AUTOBUILD" in 41788f8a6caSMichal Berger tiny) autobuild_test_suite_tiny ;; 4182bd4ba6eSMichal Berger ext) autobuild_test_suite_ext ;; 41988f8a6caSMichal Berger full) autobuild_test_suite_full ;; 4202bd4ba6eSMichal Berger esac 4214eb8f5b4SMichal Berger} 4224eb8f5b4SMichal Berger 42358ac71a4SMichal Berger_unittest_build() { 4244eb8f5b4SMichal Berger "$rootdir/configure" $config_params --without-shared 4254eb8f5b4SMichal Berger $MAKE $MAKEFLAGS 4264eb8f5b4SMichal Berger} 4274eb8f5b4SMichal Berger 42858ac71a4SMichal Bergerautobuild_test_suite() { 42958ac71a4SMichal Berger run_test "autobuild" _autobuild_test_suite 43058ac71a4SMichal Berger} 43158ac71a4SMichal Berger 43258ac71a4SMichal Bergerunittest_build() { 43358ac71a4SMichal Berger run_test "unittest_build" _unittest_build 43458ac71a4SMichal Berger} 43558ac71a4SMichal Berger 43658ac71a4SMichal Bergerscanbuild_make() { 43758ac71a4SMichal Berger run_test "scanbuild_make" _scanbuild_make 43858ac71a4SMichal Berger} 43958ac71a4SMichal Berger 44058ac71a4SMichal Bergerocf_precompile() { 44158ac71a4SMichal Berger run_test "autobuild_ocf_precompile" _ocf_precompile 44258ac71a4SMichal Berger} 44358ac71a4SMichal Berger 44458ac71a4SMichal Bergerllvm_precompile() { 44558ac71a4SMichal Berger run_test "autobuild_llvm_precompile" _llvm_precompile 44658ac71a4SMichal Berger} 44758ac71a4SMichal Berger 44858ac71a4SMichal Bergerbuild_native_dpdk() { 44958ac71a4SMichal Berger run_test "build_native_dpdk" _build_native_dpdk 45058ac71a4SMichal Berger} 45158ac71a4SMichal Berger 4528ad60985SMichal Bergerbuild_packaging() { 4538ad60985SMichal Berger run_test "packaging" "$rootdir/test/packaging/packaging.sh" 4548ad60985SMichal Berger} 4558ad60985SMichal Berger 45658674af0SMichal Berger_build_release() ( 45758674af0SMichal Berger local jobs LD 45858674af0SMichal Berger 45958674af0SMichal Berger if [[ -n $SPDK_TEST_NATIVE_DPDK && -e /tmp/spdk-ld-path ]]; then 46058674af0SMichal Berger source /tmp/spdk-ld-path 46158674af0SMichal Berger fi 46258674af0SMichal Berger 46358674af0SMichal Berger if [[ $CC == *clang* ]]; then 46458674af0SMichal Berger jobs=$(($(nproc) / 2)) 46558674af0SMichal Berger case "$(uname -s)" in 4662df86d17SMichal Berger Linux) 4672df86d17SMichal Berger # ld.gold is shipped by default with binutils under most of the Linux distros. 4682df86d17SMichal Berger # But just in case, look for ld.lld as it's still better suited for the LTO 4692df86d17SMichal Berger # build under clang. 4702df86d17SMichal Berger if ! LD=$(type -P ld.lld); then 4712df86d17SMichal Berger LD=ld.gold LDFLAGS="-Wl,--threads,--thread-count=$jobs" MAKEFLAGS="-j$jobs" 4722df86d17SMichal Berger fi 4732df86d17SMichal Berger export LD LDFLAGS MAKEFLAGS 4742df86d17SMichal Berger ;; 47558674af0SMichal Berger FreeBSD) # Default compiler which does support LTO, set it explicitly for visibility 47658674af0SMichal Berger export LD=ld.lld ;; 47758674af0SMichal Berger esac 47858674af0SMichal Berger fi 47958674af0SMichal Berger 48058674af0SMichal Berger "$rootdir/configure" $config_params \ 48158674af0SMichal Berger --disable-debug \ 48258674af0SMichal Berger --disable-unit-tests \ 48358674af0SMichal Berger --enable-lto 48458674af0SMichal Berger 48558674af0SMichal Berger $MAKE -C "$rootdir" $MAKEFLAGS 48658674af0SMichal Berger) 48758674af0SMichal Berger 48858674af0SMichal Bergerbuild_release() { 48958674af0SMichal Berger run_test "build_release" _build_release 49058674af0SMichal Berger} 49158674af0SMichal Berger 4924eb8f5b4SMichal Bergerout=$output_dir 4934eb8f5b4SMichal BergerSPDK_WORKSPACE=$(mktemp -dt "spdk_$(date +%s).XXXXXX") 4944eb8f5b4SMichal Berger 4954eb8f5b4SMichal Bergerif [[ -n $EXTERNAL_MAKE_HUGEMEM ]]; then 4964eb8f5b4SMichal Berger export EXTERNAL_MAKE_HUGEMEM 4974eb8f5b4SMichal Bergerfi 4984eb8f5b4SMichal Berger 4994eb8f5b4SMichal Bergerif [ -n "$SPDK_TEST_NATIVE_DPDK" ]; then 5004eb8f5b4SMichal Berger scanbuild_exclude=" --exclude $(dirname $SPDK_RUN_EXTERNAL_DPDK)" 5014eb8f5b4SMichal Bergerelse 5024eb8f5b4SMichal Berger scanbuild_exclude="--exclude $rootdir/dpdk/" 5034eb8f5b4SMichal Bergerfi 5044eb8f5b4SMichal Berger# We exclude /tmp as it's used by xnvme's liburing subproject for storing 5054eb8f5b4SMichal Berger# temporary .c files which are picked up as buggy by the scanbuild. 5064eb8f5b4SMichal Bergerscanbuild_exclude+=" --exclude $rootdir/xnvme --exclude /tmp" 5074eb8f5b4SMichal Berger 5084eb8f5b4SMichal Bergerscanbuild="scan-build -o $output_dir/scan-build-tmp $scanbuild_exclude --status-bugs" 5094eb8f5b4SMichal Bergerconfig_params=$(get_config_params) 510d5fe62b2SMichal Berger 511d5fe62b2SMichal Bergerstart_monitor_resources 512d5fe62b2SMichal Bergertrap 'stop_monitor_resources' EXIT 513