xref: /spdk/test/common/autobuild_common.sh (revision f22e807f197b361787d55ef3f148db33139db671)
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