xref: /spdk/configure (revision 421368c04fdfdd3506b03deeca52071d9959ffe9)
19dd998cdSBen Walker#!/usr/bin/env bash
29dd998cdSBen Walker
39dd998cdSBen Walkerset -e
49dd998cdSBen Walker
514bbde7bSPawel Wodkowskitrap 'echo -e "\n\nConfiguration failed\n\n" >&2' ERR
614bbde7bSPawel Wodkowski
7e62a3c65SSeth Howellrootdir=$(readlink -f $(dirname $0))
865ed6034SMichal Bergersource "$rootdir/scripts/common.sh"
9e62a3c65SSeth Howell
105ccabc8fSMichal Bergerfunction usage() {
119dd998cdSBen Walker	echo "'configure' configures SPDK to compile on supported platforms."
129dd998cdSBen Walker	echo ""
139dd998cdSBen Walker	echo "Usage: ./configure [OPTION]..."
149dd998cdSBen Walker	echo ""
159dd998cdSBen Walker	echo "Defaults for the options are specified in brackets."
169dd998cdSBen Walker	echo ""
179dd998cdSBen Walker	echo "General:"
189dd998cdSBen Walker	echo " -h, --help                Display this help and exit"
192e7fe8e8SDaniel Verkamp	echo ""
202e7fe8e8SDaniel Verkamp	echo " --prefix=path             Configure installation prefix (default: /usr/local)"
210e6ddfd6SBen Walker	echo " --target-arch=arch        Target build architecture. Must be a valid GNU arch. Default: native"
222e7fe8e8SDaniel Verkamp	echo ""
233def834cSAmelia Blachuciak	echo " --cross-prefix=prefix     Prefix for cross compilation (default: none)"
243def834cSAmelia Blachuciak	echo "                           example: aarch64-linux-gnu"
25e8863cb7SMichal Berger	echo " --libdir=path             Configure installation path for the libraries (default: \$prefix/lib)"
263def834cSAmelia Blachuciak	echo ""
279dd998cdSBen Walker	echo " --enable-debug            Configure for debug builds"
289dd998cdSBen Walker	echo " --enable-werror           Treat compiler warnings as errors"
299dd998cdSBen Walker	echo " --enable-asan             Enable address sanitizer"
309dd998cdSBen Walker	echo " --enable-ubsan            Enable undefined behavior sanitizer"
319dd998cdSBen Walker	echo " --enable-coverage         Enable code coverage tracking"
326d6d1161SDaniel Verkamp	echo " --enable-lto              Enable link-time optimization"
33995d60f4SBen Walker	echo " --enable-pgo-capture      Enable generation of profile guided optimization data"
34995d60f4SBen Walker	echo " --enable-pgo-use          Use previously captured profile guided optimization data"
3591e42257SJim Harris	echo " --enable-cet              Enable Intel Control-flow Enforcement Technology (CET)"
369fcb1cb0STomasz Zawadzki	echo " --disable-tests           Disable building of functional tests"
379fcb1cb0STomasz Zawadzki	echo " --disable-unit-tests      Disable building of unit tests"
389b2c6452SJacek Kalwas	echo " --disable-examples        Disable building of examples"
39119158cdSRajarshi Chowdhury	echo " --disable-apps            Disable building of apps"
409dd998cdSBen Walker	echo ""
419dd998cdSBen Walker	echo "Specifying Dependencies:"
429dd998cdSBen Walker	echo "--with-DEPENDENCY[=path]   Use the given dependency. Optionally, provide the"
439dd998cdSBen Walker	echo "                           path."
449dd998cdSBen Walker	echo "--without-DEPENDENCY       Do not link to the given dependency. This may"
459dd998cdSBen Walker	echo "                           disable features and components."
469dd998cdSBen Walker	echo ""
479dd998cdSBen Walker	echo "Valid dependencies are listed below."
482bc71094SMichal Berger	echo " --with-dpdk[=DIR]         Build against a custom dpdk version. By default, the dpdk"
492bc71094SMichal Berger	echo " --without-dpdk            submodule in spdk tree will be used."
509dd998cdSBen Walker	echo "                           example: /usr/share/dpdk/x86_64-default-linuxapp-gcc"
512bc71094SMichal Berger	echo " --with-env=DIR            Use an alternate environment implementation instead of DPDK."
5206cc8045SBen Walker	echo "                           Implies --without-dpdk."
532bc71094SMichal Berger	echo " --with-idxd               Build the IDXD library and accel framework plug-in module."
542bc71094SMichal Berger	echo " --without-idxd            Disabled while experimental. Only built for x86 when enabled."
552bc71094SMichal Berger	echo " --with-crypto             Build vbdev crypto module."
562bc71094SMichal Berger	echo " --without-crypto          No path required."
572bc71094SMichal Berger	echo " --with-fio[=DIR]          Build fio_plugin."
582bc71094SMichal Berger	echo " --without-fio             default: /usr/src/fio"
592bc71094SMichal Berger	echo " --with-vhost              Build vhost target. Enabled by default."
602bc71094SMichal Berger	echo " --without-vhost           No path required."
612bc71094SMichal Berger	echo " --with-virtio             Build vhost initiator and virtio-pci bdev modules."
622bc71094SMichal Berger	echo " --without-virtio          No path required."
632bc71094SMichal Berger	echo " --with-vfio-user[=DIR]    Build custom vfio-user transport for NVMf target and NVMe initiator."
642bc71094SMichal Berger	echo " --without-vfio-user       example: /usr/src/libvfio-user"
65ebf077cbSyidong0635	echo " --with-pmdk[=DIR]         Build persistent memory bdev.
66ebf077cbSyidong0635					 example: /usr/share/pmdk"
67ebf077cbSyidong0635	echo " --without-pmdk		 No path required."
682bc71094SMichal Berger	echo " --with-reduce             Build vbdev compression module."
692bc71094SMichal Berger	echo " --without-reduce          No path required."
702bc71094SMichal Berger	echo " --with-rbd                Build Ceph RBD bdev module."
712bc71094SMichal Berger	echo " --without-rbd             No path required."
722bc71094SMichal Berger	echo " --with-rdma[=DIR]         Build RDMA transport for NVMf target and initiator."
732bc71094SMichal Berger	echo " --without-rdma            Accepts optional RDMA provider name. Can be \"verbs\" or \"mlx5_dv\"."
74daee62a0SAlexey Marchuk	echo "                           If no provider specified, \"verbs\" provider is used by default."
752bc71094SMichal Berger	echo " --with-fc[=DIR]           Build FC transport for NVMf target."
762bc71094SMichal Berger	echo " --without-fc              If an argument is provided, it is considered a directory containing"
77ed56a3d4SAnil Veerabhadrappa	echo "                           libufc.a and fc_lld.h. Otherwise the regular system paths will"
78ed56a3d4SAnil Veerabhadrappa	echo "                           be searched."
792bc71094SMichal Berger	echo " --with-shared             Build spdk shared libraries."
802bc71094SMichal Berger	echo " --without-shared          No path required."
812bc71094SMichal Berger	echo " --with-iscsi-initiator    Build with iscsi bdev module."
822bc71094SMichal Berger	echo " --without-iscsi-initiator No path required."
832bc71094SMichal Berger	echo " --with-vtune=DIR          Required to profile I/O under Intel VTune Amplifier XE."
842bc71094SMichal Berger	echo " --without-vtune           example: /opt/intel/vtune_amplifier_xe_version"
852bc71094SMichal Berger	echo " --with-ocf[=DIR]          Build OCF library and bdev module."
862bc71094SMichal Berger	echo " --without-ocf             If argument is directory, interpret it as root of OCF repo"
87d1fee489SVitaliy Mysak	echo "                           If argument is file, interpret it as compiled OCF lib"
8898d60de6SPiotr Pelplinski	echo "                           If no argument is specified, OCF git submodule is used by default"
89d1fee489SVitaliy Mysak	echo "                           example: /usr/src/ocf/"
902bc71094SMichal Berger	echo " --with-isal               Build with ISA-L. Enabled by default on x86 and aarch64 architectures."
912bc71094SMichal Berger	echo " --without-isal            No path required."
922bc71094SMichal Berger	echo " --with-uring[=DIR]        Build I/O uring bdev or socket module."
932bc71094SMichal Berger	echo " --without-uring           If an argument is provided, it is considered a directory containing"
94161c88a0SDarek Stojaczyk	echo "                           liburing.a and io_uring.h. Otherwise the regular system paths will"
95161c88a0SDarek Stojaczyk	echo "                           be searched."
9634192459SBoris Glimcher	echo " --with-openssl[=DIR]      Build OPENSSL with custom path. Otherwise the regular system paths will"
9734192459SBoris Glimcher	echo "                           be searched."
982bc71094SMichal Berger	echo " --with-fuse               Build FUSE components for mounting a blobfs filesystem."
992bc71094SMichal Berger	echo " --without-fuse            No path required."
1002bc71094SMichal Berger	echo " --with-nvme-cuse          Build NVMe driver with support for CUSE-based character devices."
1012bc71094SMichal Berger	echo " --without-nvme-cuse       No path required."
1022bc71094SMichal Berger	echo " --with-raid5              Build with bdev_raid module RAID5 support."
1032bc71094SMichal Berger	echo " --without-raid5           No path required."
1042bc71094SMichal Berger	echo " --with-wpdk=DIR           Build using WPDK to provide support for Windows (experimental)."
1052bc71094SMichal Berger	echo " --without-wpdk            The argument must be a directory containing lib and include."
1062bc71094SMichal Berger	echo " --with-usdt               Build with userspace DTrace probes enabled."
1072bc71094SMichal Berger	echo " --without-usdt            No path required."
108050565e5SJim Harris	echo " --with-fuzzer             Build with LLVM fuzzing enabled."
109050565e5SJim Harris	echo "                           Path to clang_rt.fuzzer_no_main library required."
110050565e5SJim Harris	echo "                           Requires setting CC and CXX to clang."
111050565e5SJim Harris	echo "                           (Typically /usr/lib/llvm-VER/lib/clang/VER/lib/linux/libclang_rt.fuzzer_no_main-ARCH.a)"
112509241ceSKonrad Sztyber	echo " --with-sma                Generate Storage Management Agent's protobuf interface"
113509241ceSKonrad Sztyber	echo " --without-sma             No path required."
1149dd998cdSBen Walker	echo ""
11508ec96ebSDaniel Verkamp	echo "Environment variables:"
11608ec96ebSDaniel Verkamp	echo ""
11773439e6fSBen Walker	echo "CC                         C compiler"
11808ec96ebSDaniel Verkamp	echo "CFLAGS                     C compiler flags"
11973439e6fSBen Walker	echo "CXX                        C++ compiler"
12008ec96ebSDaniel Verkamp	echo "CXXFLAGS                   C++ compiler flags"
12173439e6fSBen Walker	echo "LD                         Linker"
12208ec96ebSDaniel Verkamp	echo "LDFLAGS                    Linker flags"
12308ec96ebSDaniel Verkamp	echo "DESTDIR                    Destination for 'make install'"
12408ec96ebSDaniel Verkamp	echo ""
1259dd998cdSBen Walker}
1269dd998cdSBen Walker
127577df16aSPawel Wodkowski# Load default values
128ff238359SJosh Soref# Convert config to sourceable configuration file
129e62a3c65SSeth Howellsed -r 's/CONFIG_([[:alnum:]_]+)=(.*)/CONFIG[\1]=\2/g' $rootdir/CONFIG > $rootdir/CONFIG.sh
130577df16aSPawel Wodkowskideclare -A CONFIG
131e62a3c65SSeth Howellsource $rootdir/CONFIG.sh
132e62a3c65SSeth Howellrm $rootdir/CONFIG.sh
133577df16aSPawel Wodkowski
13411a5716dSMichal Berger# Try to expand literal ~ that might have been passed as an option via --long-opt=~/dir.
13511a5716dSMichal Bergerset -- "${@//\~/~}"
13611a5716dSMichal Berger
1374d2e26d8STomasz Zawadzkifor i in "$@"; do
1384d2e26d8STomasz Zawadzki	case "$i" in
1394d2e26d8STomasz Zawadzki		--cross-prefix=*)
1404d2e26d8STomasz Zawadzki			CONFIG[CROSS_PREFIX]="${i#*=}"
1414d2e26d8STomasz Zawadzki			;;
1424d2e26d8STomasz Zawadzki		--enable-lto)
1434d2e26d8STomasz Zawadzki			CONFIG[LTO]=y
1444d2e26d8STomasz Zawadzki			;;
1454d2e26d8STomasz Zawadzki		--disable-lto)
1464d2e26d8STomasz Zawadzki			CONFIG[LTO]=n
1474d2e26d8STomasz Zawadzki			;;
1484d2e26d8STomasz Zawadzki	esac
1494d2e26d8STomasz Zawadzkidone
1504d2e26d8STomasz Zawadzki
151873c8748STomasz Kulasek# Detect the compiler toolchain
152873c8748STomasz Kulasek$rootdir/scripts/detect_cc.sh --cc="$CC" --cxx="$CXX" --lto="${CONFIG[LTO]}" --ld="$LD" --cross-prefix="${CONFIG[CROSS_PREFIX]}" > $rootdir/mk/cc.mk
153873c8748STomasz Kulasek
154bb0f78a2SMichal BergerCC=$(grep "DEFAULT_CC=" "$rootdir/mk/cc.mk" | sed s/DEFAULT_CC=//)
155bb0f78a2SMichal BergerCC_TYPE=$(grep "CC_TYPE=" "$rootdir/mk/cc.mk" | cut -d "=" -f 2)
156873c8748STomasz Kulasek
157873c8748STomasz Kulasekarch=$($CC -dumpmachine)
1585a764955SMichal Bergersys_name=$(uname -s)
159873c8748STomasz Kulasek
1609854c138SNick Connollyif [[ $arch == *mingw* ]] || [[ $arch == *windows* ]]; then
1619854c138SNick Connolly	sys_name=Windows
1629854c138SNick Connollyfi
1639854c138SNick Connolly
164873c8748STomasz Kulasek# Sanitize default configuration. All parameters set by user explicit should fail
165873c8748STomasz Kulasek# Force no ISA-L if non-x86 or non-aarch64 architecture
166873c8748STomasz Kulasekif [[ "${CONFIG[ISAL]}" = "y" ]]; then
167873c8748STomasz Kulasek	if [[ $arch != x86_64* ]] && [[ $arch != aarch64* ]]; then
168873c8748STomasz Kulasek		CONFIG[ISAL]=n
169873c8748STomasz Kulasek		echo "Notice: ISA-L not supported for ${arch}. Turning off default feature."
170873c8748STomasz Kulasek	fi
171873c8748STomasz Kulasekfi
172873c8748STomasz Kulasek
1732a0c2a2dSNick Connollyif [[ $sys_name != "Linux" ]]; then
174873c8748STomasz Kulasek	# Vhost, rte_vhost library and virtio are only supported on Linux.
175873c8748STomasz Kulasek	CONFIG[VHOST]="n"
176873c8748STomasz Kulasek	CONFIG[VIRTIO]="n"
177873c8748STomasz Kulasek	echo "Notice: Vhost, rte_vhost library and virtio are only supported on Linux. Turning off default feature."
178873c8748STomasz Kulasekfi
179873c8748STomasz Kulasek
180325010bfSRichael Zhuang#check nasm only on x86
181325010bfSRichael Zhuangif [[ $arch == x86_64* ]]; then
182d172854aSZiye Yang	ver=$(nasm -v 2> /dev/null | awk '{print $3}' | awk -Fr '{print $1}')
18365ed6034SMichal Berger	if lt "$ver" 2.14; then
18435e54647STomasz Zawadzki		# ISA-L, compression & crypto require NASM version 2.14 or newer.
185873c8748STomasz Kulasek		CONFIG[ISAL]=n
186873c8748STomasz Kulasek		CONFIG[CRYPTO]=n
187873c8748STomasz Kulasek		CONFIG[IPSEC_MB]=n
188873c8748STomasz Kulasek		CONFIG[REDUCE]=n
189873c8748STomasz Kulasek		HAVE_NASM=n
19035e54647STomasz Zawadzki		echo "Notice: ISA-L, compression & crypto require NASM version 2.14 or newer. Turning off default ISA-L and crypto features."
191873c8748STomasz Kulasek	else
192873c8748STomasz Kulasek		HAVE_NASM=y
193873c8748STomasz Kulasek	fi
194325010bfSRichael Zhuangfi
195873c8748STomasz Kulasek
1961723a800SGangCaofunction check_dir() {
1971723a800SGangCao	arg="$1"
1981723a800SGangCao	dir="${arg#*=}"
1991723a800SGangCao	if [ ! -d "$dir" ]; then
2001723a800SGangCao		echo "$arg: directory not found"
2011723a800SGangCao		exit 1
2021723a800SGangCao	fi
2031723a800SGangCao}
2041723a800SGangCao
2057b04eb72SYuriy Umanets# On x86_64 'clang -dumpmachine' produces x86_64-pc-linux-gnu
2067b04eb72SYuriy Umanets# whereas the dpdk might be built with gcc and its libs lie in
2077b04eb72SYuriy Umanets# x86_64-linux-gnu. Let's find the right libdir for dpdkd libs.
2087b04eb72SYuriy Umanetsfunction find_dpdk_arch_libdir() {
2097b04eb72SYuriy Umanets	local dpdk_dir=$1
2107b04eb72SYuriy Umanets
2117b04eb72SYuriy Umanets	# Checking first what we have with $arch, then clang
2127b04eb72SYuriy Umanets	# variant of arch.
2137b04eb72SYuriy Umanets	arches=("$arch" "$(echo $arch | sed 's/-pc//g')")
2147b04eb72SYuriy Umanets	for a in "${arches[@]}"; do
2157b04eb72SYuriy Umanets		local libdir="$dpdk_dir/lib/$a"
2167b04eb72SYuriy Umanets		if [[ -d $libdir ]]; then
2177b04eb72SYuriy Umanets			echo $libdir
2187b04eb72SYuriy Umanets			return
2197b04eb72SYuriy Umanets		fi
2207b04eb72SYuriy Umanets	done
2217b04eb72SYuriy Umanets
2227b04eb72SYuriy Umanets	# Fallback to the libdir without arch component
2237b04eb72SYuriy Umanets	echo "$dpdk_dir/lib"
2247b04eb72SYuriy Umanets}
2257b04eb72SYuriy Umanets
226f1980244SYuriy Umanetsfunction check_IPSec_mb() {
227f1980244SYuriy Umanets	local mode=$1
228f1980244SYuriy Umanets	local dpdk_libdir=$2
229f1980244SYuriy Umanets	local dpdk_incdir=$3
230f1980244SYuriy Umanets	local have_ipsec_mb=n
231f1980244SYuriy Umanets
232f1980244SYuriy Umanets	if [[ $mode = "pkg-config" ]]; then
233f1980244SYuriy Umanets		local dpdk_libs
234f1980244SYuriy Umanets
235f1980244SYuriy Umanets		# Request libdpdk pkg-config settings to figure out if the IPSec_MB is used
236f1980244SYuriy Umanets		# as a dependency.
237f1980244SYuriy Umanets		# Due to some reason pkg-config shows -lIPSec_MB only with --static option
238f13ec525SKarol Latecki		dpdk_libs=$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --libs --static libdpdk)
239f1980244SYuriy Umanets		if echo "$dpdk_libs" | grep "\-lIPSec_MB" > /dev/null 2>&1; then
240f1980244SYuriy Umanets			have_ipsec_mb=y
241f1980244SYuriy Umanets		fi
242f1980244SYuriy Umanets	elif [[ $mode = "build-config" ]]; then
243f1980244SYuriy Umanets		# Use dpdk build config header to check if the IPSec_MB was used.
244f1980244SYuriy Umanets		if grep -F "define RTE_CRYPTO_IPSEC_MB 1" "$dpdk_incdir/rte_build_config.h" > /dev/null 2>&1; then
245f1980244SYuriy Umanets			have_ipsec_mb=y
246f1980244SYuriy Umanets		fi
247f1980244SYuriy Umanets	else
248f1980244SYuriy Umanets		echo "ERROR: Invalid IPSec_MB checking mode $mode."
249f1980244SYuriy Umanets		echo "ERROR: Only \"pkg-config\" and \"build-config\" available."
250f1980244SYuriy Umanets		exit 1
251f1980244SYuriy Umanets	fi
252f1980244SYuriy Umanets	if [[ $have_ipsec_mb = "n" ]]; then
253f1980244SYuriy Umanets		CONFIG[IPSEC_MB]=n
254f1980244SYuriy Umanets		return
255f1980244SYuriy Umanets	fi
256f1980244SYuriy Umanets
257f1980244SYuriy Umanets	# Since we don't know the library path where the IPSec_MB is located
258f1980244SYuriy Umanets	# let's find it out with the ldd utility. This can be a standard location
259f1980244SYuriy Umanets	# or a custom build.
260f1980244SYuriy Umanets	local librte_crypto_ipsec_mb="$dpdk_libdir/librte_crypto_ipsec_mb.so"
261f1980244SYuriy Umanets	if [[ -f "$librte_crypto_ipsec_mb" ]]; then
262f1980244SYuriy Umanets		local ipsec_mb_libdir
263f1980244SYuriy Umanets
264f1980244SYuriy Umanets		ipsec_mb_libdir=$(ldd "$librte_crypto_ipsec_mb" | grep "libIPSec_MB.so" \
265f1980244SYuriy Umanets			| sed -e 's/\s*libIPSec_MB.so.*=>\s//' -e 's/\/libIPSec_MB.so.*$//')
266f1980244SYuriy Umanets		if [[ -d $ipsec_mb_libdir ]]; then
267f1980244SYuriy Umanets			CONFIG[IPSEC_MB]=y
268f1980244SYuriy Umanets			CONFIG[IPSEC_MB_DIR]="$ipsec_mb_libdir"
269f1980244SYuriy Umanets		elif [[ $ipsec_mb_libdir = "not found" ]]; then
270f1980244SYuriy Umanets			# ldconfig cache is broken, old build with refs to non-existing libs, etc.
271f1980244SYuriy Umanets			echo "ERROR: Invalid IPSec_MB installation. Library is not found and/or ldconfig cache is broken!"
272f1980244SYuriy Umanets			exit 1
273f1980244SYuriy Umanets		else
274f1980244SYuriy Umanets			# Failed to check for IPSec_MB lib path. Let's just assume it is lives
275f1980244SYuriy Umanets			# in one of the standard locations (/usr/lib, etc.).
276f1980244SYuriy Umanets			CONFIG[IPSEC_MB]=y
277f1980244SYuriy Umanets		fi
278f1980244SYuriy Umanets	else
279f1980244SYuriy Umanets		# pkg-config says there is IPSec_mb and dpdk lib does not have it. Let's just
280f1980244SYuriy Umanets		# assume it is installed in the system in one of the standard locations.
281f1980244SYuriy Umanets		CONFIG[IPSEC_MB]=y
282f1980244SYuriy Umanets	fi
283f1980244SYuriy Umanets}
284f1980244SYuriy Umanets
2859dd998cdSBen Walkerfor i in "$@"; do
2869dd998cdSBen Walker	case "$i" in
2879dd998cdSBen Walker		-h | --help)
2889dd998cdSBen Walker			usage
2899dd998cdSBen Walker			exit 0
2909dd998cdSBen Walker			;;
2914d2e26d8STomasz Zawadzki		--cross-prefix=*) ;&
2924d2e26d8STomasz Zawadzki		--enable-lto) ;&
2934d2e26d8STomasz Zawadzki		--disable-lto)
2944d2e26d8STomasz Zawadzki			# Options handled before detecting CC.
2954d2e26d8STomasz Zawadzki			;;
2962e7fe8e8SDaniel Verkamp		--prefix=*)
297577df16aSPawel Wodkowski			CONFIG[PREFIX]="${i#*=}"
2982e7fe8e8SDaniel Verkamp			;;
2990e6ddfd6SBen Walker		--target-arch=*)
3000e6ddfd6SBen Walker			CONFIG[ARCH]="${i#*=}"
3010e6ddfd6SBen Walker			;;
302e8863cb7SMichal Berger		--libdir=*)
303e8863cb7SMichal Berger			CONFIG[LIBDIR]="${i#*=}"
304e8863cb7SMichal Berger			;;
3059dd998cdSBen Walker		--enable-debug)
306577df16aSPawel Wodkowski			CONFIG[DEBUG]=y
3079dd998cdSBen Walker			;;
3089dd998cdSBen Walker		--disable-debug)
309577df16aSPawel Wodkowski			CONFIG[DEBUG]=n
3109dd998cdSBen Walker			;;
3119dd998cdSBen Walker		--enable-asan)
312577df16aSPawel Wodkowski			CONFIG[ASAN]=y
3139dd998cdSBen Walker			;;
3149dd998cdSBen Walker		--disable-asan)
315577df16aSPawel Wodkowski			CONFIG[ASAN]=n
3169dd998cdSBen Walker			;;
3179dd998cdSBen Walker		--enable-ubsan)
318577df16aSPawel Wodkowski			CONFIG[UBSAN]=y
3199dd998cdSBen Walker			;;
3209dd998cdSBen Walker		--disable-ubsan)
321577df16aSPawel Wodkowski			CONFIG[UBSAN]=n
3229dd998cdSBen Walker			;;
323830912e2SBen Walker		--enable-tsan)
324577df16aSPawel Wodkowski			CONFIG[TSAN]=y
325830912e2SBen Walker			;;
326830912e2SBen Walker		--disable-tsan)
327577df16aSPawel Wodkowski			CONFIG[TSAN]=n
328830912e2SBen Walker			;;
3299dd998cdSBen Walker		--enable-coverage)
330577df16aSPawel Wodkowski			CONFIG[COVERAGE]=y
3319dd998cdSBen Walker			;;
3329dd998cdSBen Walker		--disable-coverage)
333577df16aSPawel Wodkowski			CONFIG[COVERAGE]=n
3349dd998cdSBen Walker			;;
335995d60f4SBen Walker		--enable-pgo-capture)
336995d60f4SBen Walker			CONFIG[PGO_CAPTURE]=y
337995d60f4SBen Walker			;;
338995d60f4SBen Walker		--disable-pgo-capture)
339995d60f4SBen Walker			CONFIG[PGO_CAPTURE]=n
340995d60f4SBen Walker			;;
341995d60f4SBen Walker		--enable-pgo-use)
342995d60f4SBen Walker			CONFIG[PGO_USE]=y
343995d60f4SBen Walker			;;
344995d60f4SBen Walker		--disable-pgo-use)
345995d60f4SBen Walker			CONFIG[PGO_USE]=n
346995d60f4SBen Walker			;;
3479022a59eSDaniel Verkamp		--enable-tests)
348577df16aSPawel Wodkowski			CONFIG[TESTS]=y
3499022a59eSDaniel Verkamp			;;
3509022a59eSDaniel Verkamp		--disable-tests)
351577df16aSPawel Wodkowski			CONFIG[TESTS]=n
3529022a59eSDaniel Verkamp			;;
3539fcb1cb0STomasz Zawadzki		--enable-unit-tests)
3549fcb1cb0STomasz Zawadzki			CONFIG[UNIT_TESTS]=y
3559fcb1cb0STomasz Zawadzki			;;
3569fcb1cb0STomasz Zawadzki		--disable-unit-tests)
3579fcb1cb0STomasz Zawadzki			CONFIG[UNIT_TESTS]=n
3589fcb1cb0STomasz Zawadzki			;;
3599b2c6452SJacek Kalwas		--enable-examples)
3609b2c6452SJacek Kalwas			CONFIG[EXAMPLES]=y
3619b2c6452SJacek Kalwas			;;
3629b2c6452SJacek Kalwas		--disable-examples)
3639b2c6452SJacek Kalwas			CONFIG[EXAMPLES]=n
3649b2c6452SJacek Kalwas			;;
365119158cdSRajarshi Chowdhury		--enable-apps)
366119158cdSRajarshi Chowdhury			CONFIG[APPS]=y
367119158cdSRajarshi Chowdhury			;;
368119158cdSRajarshi Chowdhury		--disable-apps)
369119158cdSRajarshi Chowdhury			CONFIG[APPS]=N
370119158cdSRajarshi Chowdhury			;;
3719dd998cdSBen Walker		--enable-werror)
372577df16aSPawel Wodkowski			CONFIG[WERROR]=y
3739dd998cdSBen Walker			;;
3749dd998cdSBen Walker		--disable-werror)
375577df16aSPawel Wodkowski			CONFIG[WERROR]=n
3769dd998cdSBen Walker			;;
37791e42257SJim Harris		--enable-cet)
37891e42257SJim Harris			CONFIG[CET]=y
37991e42257SJim Harris			;;
38091e42257SJim Harris		--disable-cet)
38191e42257SJim Harris			CONFIG[CET]=n
38291e42257SJim Harris			;;
3837232c450SMichal Berger		--with-dpdk)
3847b04eb72SYuriy Umanets			# Can we use pkg-config?
3857b04eb72SYuriy Umanets			if command -v "pkg-config" > /dev/null 2>&1 && pkg-config --exists libdpdk; then
3867b04eb72SYuriy Umanets				dpdk_libdir=$(pkg-config --variable=libdir libdpdk)
3877b04eb72SYuriy Umanets				dpdk_libdir=$(readlink -f $dpdk_libdir)
3887b04eb72SYuriy Umanets				dpdk_incdir=$(pkg-config --variable=includedir libdpdk)
3897b04eb72SYuriy Umanets				echo "Using DPDK lib dir $dpdk_libdir"
3907b04eb72SYuriy Umanets				CONFIG[DPDK_LIB_DIR]=$dpdk_libdir
3917b04eb72SYuriy Umanets				CONFIG[DPDK_INC_DIR]=$dpdk_incdir
3927232c450SMichal Berger				CONFIG[DPDK_PKG_CONFIG]=y
3933e3fbf91SYuriy Umanets				if pkg-config --print-requires libdpdk | grep "libbsd" > /dev/null 2>&1; then
3943e3fbf91SYuriy Umanets					CONFIG[HAVE_LIBBSD]=y
3953e3fbf91SYuriy Umanets				fi
3967232c450SMichal Berger				CFLAGS="${CFLAGS:+$CFLAGS }$(pkg-config --cflags libdpdk)"
397f1980244SYuriy Umanets				check_IPSec_mb "pkg-config" "$dpdk_libdir" "$dpdk_incdir"
3987232c450SMichal Berger			else
3997232c450SMichal Berger				echo "libdpdk.pc not found, aborting"
4007232c450SMichal Berger				exit 1
4017232c450SMichal Berger			fi
4027232c450SMichal Berger			;;
40306cc8045SBen Walker		--with-dpdk=*)
40406cc8045SBen Walker			check_dir "$i"
4057b04eb72SYuriy Umanets			dpdk_dir=$(readlink -f ${i#*=})
4067b04eb72SYuriy Umanets			dpdk_libdir=$(find_dpdk_arch_libdir $dpdk_dir)
4077b04eb72SYuriy Umanets			dpdk_incdir="$dpdk_dir/include"
4087b04eb72SYuriy Umanets
4097b04eb72SYuriy Umanets			# Can we use pkg-config?
410f13ec525SKarol Latecki			if command -v "pkg-config" > /dev/null 2>&1 && PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --exists libdpdk; then
4117b04eb72SYuriy Umanets				echo "Using $dpdk_libdir/pkgconfig for additional libs..."
4121e6db5fbSTomasz Zawadzki				sysroot_dir=$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --variable=pc_sysrootdir libdpdk)
413f13ec525SKarol Latecki				dpdk_libdir=$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --variable=libdir libdpdk)
4141e6db5fbSTomasz Zawadzki				dpdk_libdir=$(readlink -f "${sysroot_dir}$dpdk_libdir")
4157b04eb72SYuriy Umanets				if ! echo $dpdk_libdir | grep $dpdk_dir > /dev/null 2>&1; then
4167b04eb72SYuriy Umanets					echo "ERROR: pkg-config reported DPDK libdir $dpdk_libdir is out of the directory specified with --with-dpdk="
4177b04eb72SYuriy Umanets					echo "ERROR: do you have another DPDK installed in the system?"
4187b04eb72SYuriy Umanets					exit 1
4197b04eb72SYuriy Umanets				fi
420f13ec525SKarol Latecki				dpdk_reqs=$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --print-requires libdpdk)
4213e3fbf91SYuriy Umanets				if echo $dpdk_reqs | grep "libbsd" > /dev/null 2>&1; then
4223e3fbf91SYuriy Umanets					CONFIG[HAVE_LIBBSD]=y
4233e3fbf91SYuriy Umanets				fi
424f13ec525SKarol Latecki				CFLAGS="${CFLAGS:+$CFLAGS }$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --cflags libdpdk)"
4251e6db5fbSTomasz Zawadzki				dpdk_incdir="${sysroot_dir}$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --variable=includedir libdpdk)"
426f1980244SYuriy Umanets				check_IPSec_mb "pkg-config" "$dpdk_libdir" "$dpdk_incdir"
4273e3fbf91SYuriy Umanets			else
4283e3fbf91SYuriy Umanets				echo "Using $dpdk_incdir/rte_build_config.h for additional libs..."
4293e3fbf91SYuriy Umanets
4303e3fbf91SYuriy Umanets				if grep -F "define RTE_USE_LIBBSD 1" $dpdk_incdir/rte_build_config.h > /dev/null 2>&1; then
4313e3fbf91SYuriy Umanets					CONFIG[HAVE_LIBBSD]=y
4323e3fbf91SYuriy Umanets				fi
433f1980244SYuriy Umanets				check_IPSec_mb "build-config" "$dpdk_libdir" "$dpdk_incdir"
4347b04eb72SYuriy Umanets			fi
4357b04eb72SYuriy Umanets			echo "DPDK libraries: $dpdk_libdir"
4367b04eb72SYuriy Umanets			echo "DPDK includes: $dpdk_incdir"
4377b04eb72SYuriy Umanets			CONFIG[DPDK_DIR]=$dpdk_dir
4387b04eb72SYuriy Umanets			CONFIG[DPDK_LIB_DIR]="$dpdk_libdir"
4397b04eb72SYuriy Umanets			CONFIG[DPDK_INC_DIR]="$dpdk_incdir"
4407b04eb72SYuriy Umanets			CONFIG[DPDK_PKG_CONFIG]=n
44106cc8045SBen Walker			;;
44206cc8045SBen Walker		--without-dpdk)
44306cc8045SBen Walker			CONFIG[DPDK_DIR]=
44406cc8045SBen Walker			;;
4459854c138SNick Connolly		--with-wpdk=*)
4469854c138SNick Connolly			check_dir "$i"
4479854c138SNick Connolly			CONFIG[WPDK_DIR]=$(readlink -f ${i#*=})
4489854c138SNick Connolly			;;
4492bc71094SMichal Berger		--without-wpdk)
4502bc71094SMichal Berger			CONFIG[WPDK_DIR]=
4512bc71094SMichal Berger			;;
4529dd998cdSBen Walker		--with-env=*)
453577df16aSPawel Wodkowski			CONFIG[ENV]="${i#*=}"
4549dd998cdSBen Walker			;;
4559dd998cdSBen Walker		--with-rbd)
456577df16aSPawel Wodkowski			CONFIG[RBD]=y
4579dd998cdSBen Walker			;;
4589dd998cdSBen Walker		--without-rbd)
459577df16aSPawel Wodkowski			CONFIG[RBD]=n
4609dd998cdSBen Walker			;;
461daee62a0SAlexey Marchuk		--with-rdma=*)
462daee62a0SAlexey Marchuk			CONFIG[RDMA]=y
463daee62a0SAlexey Marchuk			CONFIG[RDMA_PROV]=${i#*=}
464daee62a0SAlexey Marchuk			;;
4659dd998cdSBen Walker		--with-rdma)
466577df16aSPawel Wodkowski			CONFIG[RDMA]=y
467daee62a0SAlexey Marchuk			CONFIG[RDMA_PROV]="verbs"
4689dd998cdSBen Walker			;;
4699dd998cdSBen Walker		--without-rdma)
470577df16aSPawel Wodkowski			CONFIG[RDMA]=n
4719dd998cdSBen Walker			;;
472ed56a3d4SAnil Veerabhadrappa		--with-fc=*)
473ed56a3d4SAnil Veerabhadrappa			CONFIG[FC]=y
474ed56a3d4SAnil Veerabhadrappa			CONFIG[FC_PATH]=$(readlink -f ${i#*=})
475ed56a3d4SAnil Veerabhadrappa			;;
476ed56a3d4SAnil Veerabhadrappa		--with-fc)
477ed56a3d4SAnil Veerabhadrappa			CONFIG[FC]=y
478ed56a3d4SAnil Veerabhadrappa			CONFIG[FC_PATH]=
479ed56a3d4SAnil Veerabhadrappa			;;
480ed56a3d4SAnil Veerabhadrappa		--without-fc)
481ed56a3d4SAnil Veerabhadrappa			CONFIG[FC]=n
482ed56a3d4SAnil Veerabhadrappa			CONFIG[FC_PATH]=
483ed56a3d4SAnil Veerabhadrappa			;;
4840923734cSLance Hartmann		--with-shared)
485577df16aSPawel Wodkowski			CONFIG[SHARED]=y
4860923734cSLance Hartmann			;;
4870923734cSLance Hartmann		--without-shared)
488577df16aSPawel Wodkowski			CONFIG[SHARED]=n
4890923734cSLance Hartmann			;;
4902af15344SJim Harris		--with-iscsi-initiator)
491577df16aSPawel Wodkowski			CONFIG[ISCSI_INITIATOR]=y
4922af15344SJim Harris			;;
4932af15344SJim Harris		--without-iscsi-initiator)
494577df16aSPawel Wodkowski			CONFIG[ISCSI_INITIATOR]=n
4952af15344SJim Harris			;;
4966118b853SDaniel Verkamp		--with-crypto)
497577df16aSPawel Wodkowski			CONFIG[CRYPTO]=y
4986118b853SDaniel Verkamp			;;
4996118b853SDaniel Verkamp		--without-crypto)
500577df16aSPawel Wodkowski			CONFIG[CRYPTO]=n
5016118b853SDaniel Verkamp			;;
50235260f2bSDaniel Verkamp		--with-vhost)
503577df16aSPawel Wodkowski			CONFIG[VHOST]=y
50435260f2bSDaniel Verkamp			;;
50535260f2bSDaniel Verkamp		--without-vhost)
506577df16aSPawel Wodkowski			CONFIG[VHOST]=n
50735260f2bSDaniel Verkamp			;;
5087dee96ceSDariusz Stojaczyk		--with-virtio)
509577df16aSPawel Wodkowski			CONFIG[VIRTIO]=y
5107dee96ceSDariusz Stojaczyk			;;
5117dee96ceSDariusz Stojaczyk		--without-virtio)
512577df16aSPawel Wodkowski			CONFIG[VIRTIO]=n
5137dee96ceSDariusz Stojaczyk			;;
514b30d57cdSChangpeng Liu		--with-vfio-user)
515b30d57cdSChangpeng Liu			CONFIG[VFIO_USER]=y
516d0b2448bSChangpeng Liu			CONFIG[VFIO_USER_DIR]=""
517d0b2448bSChangpeng Liu			;;
518d0b2448bSChangpeng Liu		--with-vfio-user=*)
519d0b2448bSChangpeng Liu			CONFIG[VFIO_USER]=y
520d0b2448bSChangpeng Liu			check_dir "$i"
521d0b2448bSChangpeng Liu			CONFIG[VFIO_USER_DIR]=$(readlink -f ${i#*=})
522b30d57cdSChangpeng Liu			;;
523b30d57cdSChangpeng Liu		--without-vfio-user)
524b30d57cdSChangpeng Liu			CONFIG[VFIO_USER]=n
525b30d57cdSChangpeng Liu			;;
526218dcd84SJim Harris		--with-pmdk)
527577df16aSPawel Wodkowski			CONFIG[PMDK]=y
528577df16aSPawel Wodkowski			CONFIG[PMDK_DIR]=""
529fca11f15SPiotr Pelplinski			;;
530218dcd84SJim Harris		--with-pmdk=*)
531577df16aSPawel Wodkowski			CONFIG[PMDK]=y
5321723a800SGangCao			check_dir "$i"
533577df16aSPawel Wodkowski			CONFIG[PMDK_DIR]=$(readlink -f ${i#*=})
534fca11f15SPiotr Pelplinski			;;
535218dcd84SJim Harris		--without-pmdk)
536577df16aSPawel Wodkowski			CONFIG[PMDK]=n
537fca11f15SPiotr Pelplinski			;;
53897022803SJim Harris		--with-reduce)
53997022803SJim Harris			CONFIG[REDUCE]=y
54097022803SJim Harris			;;
54197022803SJim Harris		--without-reduce)
54297022803SJim Harris			CONFIG[REDUCE]=n
54397022803SJim Harris			;;
544c3329b52SMichal Berger		--with-fio) ;&
5459dd998cdSBen Walker		--with-fio=*)
546c3329b52SMichal Berger			if [[ ${i#*=} != "$i" ]]; then
54711a5716dSMichal Berger				CONFIG[FIO_SOURCE_DIR]=${i#*=}
548c3329b52SMichal Berger			fi
549c3329b52SMichal Berger			check_dir "--with-fio=${CONFIG[FIO_SOURCE_DIR]}"
55011a5716dSMichal Berger			CONFIG[FIO_SOURCE_DIR]=$(readlink -f "${CONFIG[FIO_SOURCE_DIR]}")
551577df16aSPawel Wodkowski			CONFIG[FIO_PLUGIN]=y
5529dd998cdSBen Walker			;;
5539dd998cdSBen Walker		--without-fio)
554577df16aSPawel Wodkowski			CONFIG[FIO_PLUGIN]=n
5559dd998cdSBen Walker			;;
5565712088aSRoman Sudarikov		--with-vtune=*)
5571723a800SGangCao			check_dir "$i"
558577df16aSPawel Wodkowski			CONFIG[VTUNE_DIR]="${i#*=}"
559577df16aSPawel Wodkowski			CONFIG[VTUNE]=y
5605712088aSRoman Sudarikov			;;
5615712088aSRoman Sudarikov		--without-vtune)
562577df16aSPawel Wodkowski			CONFIG[VTUNE_DIR]=
563577df16aSPawel Wodkowski			CONFIG[VTUNE]=n
5645712088aSRoman Sudarikov			;;
56598d60de6SPiotr Pelplinski		--with-ocf)
56698d60de6SPiotr Pelplinski			CONFIG[OCF]=y
56798d60de6SPiotr Pelplinski			CONFIG[OCF_PATH]=$(readlink -f "./ocf")
56898d60de6SPiotr Pelplinski			;;
569d1fee489SVitaliy Mysak		--with-ocf=*)
570d1fee489SVitaliy Mysak			CONFIG[OCF]=y
571d1fee489SVitaliy Mysak			CONFIG[OCF_PATH]=$(readlink -f ${i#*=})
572d1fee489SVitaliy Mysak			;;
573d1fee489SVitaliy Mysak		--without-ocf)
574d1fee489SVitaliy Mysak			CONFIG[OCF]=n
575d1fee489SVitaliy Mysak			CONFIG[OCF_PATH]=
576d1fee489SVitaliy Mysak			;;
577552e21ccSZiye Yang		--with-isal)
578552e21ccSZiye Yang			CONFIG[ISAL]=y
579552e21ccSZiye Yang			;;
580552e21ccSZiye Yang		--without-isal)
581552e21ccSZiye Yang			CONFIG[ISAL]=n
582552e21ccSZiye Yang			;;
5838165bf71SBen Walker		--with-uring=*)
5848165bf71SBen Walker			CONFIG[URING]=y
5858165bf71SBen Walker			CONFIG[URING_PATH]=$(readlink -f ${i#*=})
5868165bf71SBen Walker			;;
5878165bf71SBen Walker		--with-uring)
5888165bf71SBen Walker			CONFIG[URING]=y
5898165bf71SBen Walker			CONFIG[URING_PATH]=
5908165bf71SBen Walker			;;
5918165bf71SBen Walker		--without-uring)
5928165bf71SBen Walker			CONFIG[URING]=n
5938165bf71SBen Walker			CONFIG[URING_PATH]=
5948165bf71SBen Walker			;;
59534192459SBoris Glimcher		--with-openssl=*)
59634192459SBoris Glimcher			check_dir "$i"
59734192459SBoris Glimcher			CONFIG[OPENSSL_PATH]=$(readlink -f ${i#*=})
59834192459SBoris Glimcher			;;
5997fa15e28SXiaodong Liu		--with-fuse)
6007fa15e28SXiaodong Liu			CONFIG[FUSE]=y
6017fa15e28SXiaodong Liu			;;
6027fa15e28SXiaodong Liu		--without-fuse)
6037fa15e28SXiaodong Liu			CONFIG[FUSE]=n
6047fa15e28SXiaodong Liu			;;
605805d9942STomasz Kulasek		--with-nvme-cuse)
606805d9942STomasz Kulasek			CONFIG[NVME_CUSE]=y
607805d9942STomasz Kulasek			;;
608805d9942STomasz Kulasek		--without-nvme-cuse)
609805d9942STomasz Kulasek			CONFIG[NVME_CUSE]=n
610805d9942STomasz Kulasek			;;
61173763d40SArtur Paszkiewicz		--with-raid5)
61273763d40SArtur Paszkiewicz			CONFIG[RAID5]=y
61373763d40SArtur Paszkiewicz			;;
61473763d40SArtur Paszkiewicz		--without-raid5)
61573763d40SArtur Paszkiewicz			CONFIG[RAID5]=n
61673763d40SArtur Paszkiewicz			;;
617e58e9fbdSpaul luse		--with-idxd)
618e58e9fbdSpaul luse			CONFIG[IDXD]=y
6192ed914f8SZiye Yang			CONFIG[IDXD_KERNEL]=n
620e58e9fbdSpaul luse			;;
621e58e9fbdSpaul luse		--without-idxd)
622e58e9fbdSpaul luse			CONFIG[IDXD]=n
623e58e9fbdSpaul luse			;;
6245a1c74bfSJim Harris		--with-usdt)
6255a1c74bfSJim Harris			CONFIG[USDT]=y
6265a1c74bfSJim Harris			;;
6275a1c74bfSJim Harris		--without-usdt)
6285a1c74bfSJim Harris			CONFIG[USDT]=n
6295a1c74bfSJim Harris			;;
630050565e5SJim Harris		--with-fuzzer)
631050565e5SJim Harris			echo "Must specify fuzzer library path with --with-fuzzer"
632050565e5SJim Harris			usage
633050565e5SJim Harris			exit 1
634050565e5SJim Harris			;;
635050565e5SJim Harris		--with-fuzzer=*)
636050565e5SJim Harris			CONFIG[FUZZER]=y
637050565e5SJim Harris			CONFIG[FUZZER_LIB]=$(readlink -f ${i#*=})
638050565e5SJim Harris			;;
639050565e5SJim Harris		--without-fuzzer)
640050565e5SJim Harris			CONFIG[FUZZER]=n
641050565e5SJim Harris			CONFIG[FUZZER_LIB]=
642050565e5SJim Harris			;;
643509241ceSKonrad Sztyber		--with-sma)
644509241ceSKonrad Sztyber			CONFIG[SMA]=y
645509241ceSKonrad Sztyber			;;
646509241ceSKonrad Sztyber		--without-sma)
647509241ceSKonrad Sztyber			CONFIG[SMA]=n
648509241ceSKonrad Sztyber			;;
6499dd998cdSBen Walker		--)
6509dd998cdSBen Walker			break
6519dd998cdSBen Walker			;;
6529dd998cdSBen Walker		*)
6539dd998cdSBen Walker			echo "Unrecognized option $i"
6549dd998cdSBen Walker			usage
6559dd998cdSBen Walker			exit 1
6565ccabc8fSMichal Berger			;;
6579dd998cdSBen Walker	esac
6589dd998cdSBen Walkerdone
6599dd998cdSBen Walker
660131c9aadSAlexey Marchukif [[ $arch == x86_64* ]]; then
66110e1c615SFélix Piédallu	BUILD_CMD=($CC -o /dev/null -x c $CPPFLAGS $CFLAGS $LDFLAGS "-march=native")
662131c9aadSAlexey Marchukelse
66310e1c615SFélix Piédallu	BUILD_CMD=($CC -o /dev/null -x c $CPPFLAGS $CFLAGS $LDFLAGS)
664131c9aadSAlexey Marchukfi
6656c23a6f4SMichal BergerBUILD_CMD+=(-I/usr/local/include -L/usr/local/lib)
66673439e6fSBen Walker
667b30d57cdSChangpeng Liuif [[ "${CONFIG[VFIO_USER]}" = "y" ]]; then
668*421368c0SGreg Inozemtsev	if ! echo -e '#include <json-c/json.h>' \
669*421368c0SGreg Inozemtsev		| "${BUILD_CMD[@]}" -E - 2> /dev/null; then
6703b673b84SChangpeng Liu		echo "ERROR: --with-vfio-user requires json-c-devel"
6713b673b84SChangpeng Liu		echo "Please install then re-run this script"
6723b673b84SChangpeng Liu		exit 1
6733b673b84SChangpeng Liu	fi
674*421368c0SGreg Inozemtsev	if ! echo -e '#include <cmocka.h>' \
675*421368c0SGreg Inozemtsev		| "${BUILD_CMD[@]}" -E - 2> /dev/null; then
6763b673b84SChangpeng Liu		echo "ERROR: --with-vfio-user requires libcmocka-devel"
6773b673b84SChangpeng Liu		echo "Please install then re-run this script"
6783b673b84SChangpeng Liu		exit 1
679b30d57cdSChangpeng Liu	fi
680b30d57cdSChangpeng Liufi
681b30d57cdSChangpeng Liu
682e58e9fbdSpaul luse# IDXD uses Intel specific instructions.
683e58e9fbdSpaul luseif [[ "${CONFIG[IDXD]}" = "y" ]]; then
6842755fbdfSpaul luse	if [ $(uname -s) == "FreeBSD" ]; then
6852755fbdfSpaul luse		intel="hw.model: Intel"
6862755fbdfSpaul luse		cpu_vendor=$(sysctl -a | grep hw.model | cut -c 1-15)
6872755fbdfSpaul luse	else
688e58e9fbdSpaul luse		intel="GenuineIntel"
689e58e9fbdSpaul luse		cpu_vendor=$(grep -i 'vendor' /proc/cpuinfo --max-count=1)
6902755fbdfSpaul luse	fi
691e58e9fbdSpaul luse	if [[ "$cpu_vendor" != *"$intel"* ]]; then
692ff238359SJosh Soref		echo "ERROR: IDXD cannot be used due to CPU incompatibility."
693e58e9fbdSpaul luse		exit 1
694e58e9fbdSpaul luse	fi
6952ed914f8SZiye Yang	if [ -e /usr/include/accel-config/libaccel_config.h ]; then
6962ed914f8SZiye Yang		CONFIG[IDXD_KERNEL]=y
6972ed914f8SZiye Yang	fi
6982ed914f8SZiye Yang
699e58e9fbdSpaul lusefi
700e58e9fbdSpaul luse
7018cad9cc1SRichael Zhuang# Detect architecture and force no ISA-L if non-x86 or non-aarch64 architecture
702c510bd88SBen Walkerif [[ "${CONFIG[ISAL]}" = "y" ]]; then
7038cad9cc1SRichael Zhuang	if [[ $arch != x86_64* ]] && [[ $arch != aarch64* ]]; then
704ff238359SJosh Soref		echo "ERROR: ISA-L cannot be used due to CPU incompatibility."
705873c8748STomasz Kulasek		exit 1
706552e21ccSZiye Yang	fi
707c510bd88SBen Walkerfi
708552e21ccSZiye Yang
709d9d4e40dSpaul luseif [[ "${CONFIG[ISAL]}" = "n" ]] && [[ "${CONFIG[REDUCE]}" = "y" ]]; then
710d9d4e40dSpaul luse	echo "ERROR Conflicting options: --with-reduce is not compatible with --without-isal."
711d9d4e40dSpaul luse	exit 1
712d9d4e40dSpaul lusefi
713d9d4e40dSpaul luse
714577df16aSPawel Wodkowskiif [ -z "${CONFIG[ENV]}" ]; then
715577df16aSPawel Wodkowski	CONFIG[ENV]=$rootdir/lib/env_dpdk
716577df16aSPawel Wodkowski	echo "Using default SPDK env in ${CONFIG[ENV]}"
7177232c450SMichal Berger	if [[ -z "${CONFIG[DPDK_DIR]}" && "${CONFIG[DPDK_PKG_CONFIG]}" == n ]]; then
71838e26cf5STomasz Zawadzki		if [ ! -f "$rootdir"/dpdk/config/meson.build ]; then
719d199eb29SDaniel Verkamp			echo "DPDK not found; please specify --with-dpdk=<path> or run:"
720d199eb29SDaniel Verkamp			echo
721d199eb29SDaniel Verkamp			echo "  git submodule update --init"
722d199eb29SDaniel Verkamp			exit 1
723577df16aSPawel Wodkowski		else
724577df16aSPawel Wodkowski			CONFIG[DPDK_DIR]="${rootdir}/dpdk/build"
725f1980244SYuriy Umanets			# Default ipsec libs
726f1980244SYuriy Umanets			if [[ "${CONFIG[CRYPTO]}" = "y" ]]; then
727f1980244SYuriy Umanets				CONFIG[IPSEC_MB]=y
728f1980244SYuriy Umanets				CONFIG[IPSEC_MB_DIR]="${rootdir}/intel-ipsec-mb/lib"
729f1980244SYuriy Umanets			fi
730577df16aSPawel Wodkowski			echo "Using default DPDK in ${CONFIG[DPDK_DIR]}"
731d199eb29SDaniel Verkamp		fi
7329dd998cdSBen Walker	fi
7337d2a2f52SBen Walkerelse
7347232c450SMichal Berger	if [[ -n "${CONFIG[DPDK_DIR]}" || "${CONFIG[DPDK_PKG_CONFIG]}" == y ]]; then
73506cc8045SBen Walker		echo "--with-env and --with-dpdk are mutually exclusive."
73606cc8045SBen Walker		exit 1
73706cc8045SBen Walker	fi
73806cc8045SBen Walker
739577df16aSPawel Wodkowski	if [ "${CONFIG[VHOST]}" = "y" ]; then
7407d2a2f52SBen Walker		echo "Vhost is only supported when using the default DPDK environment. Disabling it."
7417d2a2f52SBen Walker	fi
7427d2a2f52SBen Walker	# Always disable vhost, but only print the error message if the user explicitly turned it on.
743577df16aSPawel Wodkowski	CONFIG[VHOST]="n"
744577df16aSPawel Wodkowski	if [ "${CONFIG[VIRTIO]}" = "y" ]; then
7457d2a2f52SBen Walker		echo "Virtio is only supported when using the default DPDK environment. Disabling it."
7467d2a2f52SBen Walker	fi
7477d2a2f52SBen Walker	# Always disable virtio, but only print the error message if the user explicitly turned it on.
748577df16aSPawel Wodkowski	CONFIG[VIRTIO]="n"
7499dd998cdSBen Walkerfi
7509dd998cdSBen Walker
7517232c450SMichal Bergerif [[ "${CONFIG[DPDK_PKG_CONFIG]}" == y ]]; then
7527232c450SMichal Berger	if [[ "${CONFIG[SHARED]}" == n ]]; then
7537232c450SMichal Berger		# dpdk-devel doesn't provide static libs
7547232c450SMichal Berger		echo "Build against packaged DPDK requested, enabling shared libraries"
7557232c450SMichal Berger		CONFIG[SHARED]=y
7567232c450SMichal Berger	fi
7577232c450SMichal Bergerfi
7587232c450SMichal Berger
7599854c138SNick Connollyif [[ $sys_name == "Windows" ]]; then
7609854c138SNick Connolly	if [ -z "${CONFIG[WPDK_DIR]}" ]; then
7619854c138SNick Connolly		if [ ! -f "$rootdir"/wpdk/Makefile ]; then
7629854c138SNick Connolly			echo "WPDK not found; please specify --with-wpdk=<path>. See https://wpdk.github.io."
7639854c138SNick Connolly			exit 1
7649854c138SNick Connolly		else
7659854c138SNick Connolly			CONFIG[WPDK_DIR]="${rootdir}/wpdk/build"
7669854c138SNick Connolly			echo "Using default WPDK in ${CONFIG[WPDK_DIR]}"
7679854c138SNick Connolly		fi
7689854c138SNick Connolly	fi
7699854c138SNick Connollyelse
7709854c138SNick Connolly	if [ -n "${CONFIG[WPDK_DIR]}" ]; then
7719854c138SNick Connolly		echo "ERROR: --with-wpdk is only supported for Windows"
7729854c138SNick Connolly		exit 1
7739854c138SNick Connolly	fi
7749854c138SNick Connollyfi
7759854c138SNick Connolly
776577df16aSPawel Wodkowskiif [ "${CONFIG[VTUNE]}" = "y" ]; then
777577df16aSPawel Wodkowski	if [ -z "${CONFIG[VTUNE_DIR]}" ]; then
7785712088aSRoman Sudarikov		echo "When VTune is enabled, you must specify the VTune directory using --with-vtune=path"
7795712088aSRoman Sudarikov		exit 1
7805712088aSRoman Sudarikov	fi
7815712088aSRoman Sudarikovfi
7825712088aSRoman Sudarikov
783bb0f78a2SMichal Bergerif [[ "${CONFIG[ASAN]}" = "y" && "${CONFIG[TSAN]}" = "y" ]]; then
784830912e2SBen Walker	echo "ERROR: ASAN and TSAN cannot be enabled at the same time."
785830912e2SBen Walker	exit 1
786830912e2SBen Walkerfi
787830912e2SBen Walker
788ac5b53a5SJim Harrisif [[ "${CONFIG[FIO_PLUGIN]}" = "y" && "${CONFIG[EXAMPLES]}" = "n" ]]; then
789ac5b53a5SJim Harris	echo "ERROR: --with-fio and --disable-examples are mutually exclusive."
790ac5b53a5SJim Harris	exit 1
791ac5b53a5SJim Harrisfi
792ac5b53a5SJim Harris
7935a764955SMichal Bergerif [[ $sys_name == "FreeBSD" ]]; then
7945091cadcSPaul Luse	# FreeBSD doesn't support all configurations
795577df16aSPawel Wodkowski	if [[ "${CONFIG[COVERAGE]}" == "y" ]]; then
7965091cadcSPaul Luse		echo "ERROR: CONFIG_COVERAGE not available on FreeBSD"
7975091cadcSPaul Luse		exit 1
7985091cadcSPaul Luse	fi
7995091cadcSPaul Lusefi
8005091cadcSPaul Luse
8012a0c2a2dSNick Connollyif [[ $sys_name != "Linux" ]]; then
80227b920a2SDarek Stojaczyk	if [[ "${CONFIG[VHOST]}" == "y" ]]; then
803873c8748STomasz Kulasek		echo "Vhost is only supported on Linux."
804873c8748STomasz Kulasek		exit 1
80527b920a2SDarek Stojaczyk	fi
80627b920a2SDarek Stojaczyk	if [[ "${CONFIG[VIRTIO]}" == "y" ]]; then
807873c8748STomasz Kulasek		echo "Virtio is only supported on Linux."
808873c8748STomasz Kulasek		exit 1
80927b920a2SDarek Stojaczyk	fi
81027b920a2SDarek Stojaczykfi
81127b920a2SDarek Stojaczyk
812577df16aSPawel Wodkowskiif [ "${CONFIG[RDMA]}" = "y" ]; then
813daee62a0SAlexey Marchuk	if [[ ! "${CONFIG[RDMA_PROV]}" == "verbs" ]] && [[ ! "${CONFIG[RDMA_PROV]}" == "mlx5_dv" ]]; then
814daee62a0SAlexey Marchuk		echo "Invalid RDMA provider specified, must be \"verbs\" or \"mlx5_dv\""
815daee62a0SAlexey Marchuk		exit 1
816daee62a0SAlexey Marchuk	fi
817daee62a0SAlexey Marchuk
818eed0c6beSDarek Stojaczyk	if ! echo -e '#include <infiniband/verbs.h>\n#include <rdma/rdma_verbs.h>\n' \
819eed0c6beSDarek Stojaczyk		'int main(void) { return 0; }\n' \
820bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -libverbs -lrdmacm - 2> /dev/null; then
821bb0f78a2SMichal Berger		echo "--with-rdma requires libverbs and librdmacm."
822bb0f78a2SMichal Berger		echo "Please install then re-run this script."
823eed0c6beSDarek Stojaczyk		exit 1
824eed0c6beSDarek Stojaczyk	fi
825eed0c6beSDarek Stojaczyk
826eed0c6beSDarek Stojaczyk	if echo -e '#include <infiniband/verbs.h>\n' \
827eed0c6beSDarek Stojaczyk		'int main(void) { return !!IBV_WR_SEND_WITH_INV; }\n' \
828bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -c - 2> /dev/null; then
829577df16aSPawel Wodkowski		CONFIG[RDMA_SEND_WITH_INVAL]="y"
8307671073bSSeth Howell	else
831577df16aSPawel Wodkowski		CONFIG[RDMA_SEND_WITH_INVAL]="n"
83217a819f8SJim Harris		echo "
8337671073bSSeth Howell*******************************************************************************
8347671073bSSeth HowellWARNING: The Infiniband Verbs opcode Send With Invalidate is either not
8357671073bSSeth Howellsupported or is not functional with the current version of libibverbs installed
8367671073bSSeth Howellon this system. Please upgrade to at least version 1.1.
8377671073bSSeth Howell
8387671073bSSeth HowellBeginning with Linux kernel 4.14, the kernel NVMe-oF initiator leverages Send
8397671073bSSeth HowellWith Invalidate RDMA operations to improve performance. Failing to use the
8407671073bSSeth HowellSend With Invalidate operation on the NVMe-oF target side results in full
8417671073bSSeth Howellfunctionality, but greatly reduced performance. The SPDK NVMe-oF target will
8427671073bSSeth Howellbe unable to leverage that operation using the currently installed version
8437671073bSSeth Howellof libibverbs, so Linux kernel NVMe-oF initiators based on kernels greater
8447671073bSSeth Howellthan or equal to 4.14 will see significantly reduced performance.
84517a819f8SJim Harris*******************************************************************************"
8467671073bSSeth Howell	fi
84794966468SAlexey Marchuk
84894966468SAlexey Marchuk	if echo -e '#include <rdma/rdma_cma.h>\n' \
84994966468SAlexey Marchuk		'int main(void) { return !!RDMA_OPTION_ID_ACK_TIMEOUT; }\n' \
850bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -c - 2> /dev/null; then
85194966468SAlexey Marchuk		CONFIG[RDMA_SET_ACK_TIMEOUT]="y"
85294966468SAlexey Marchuk	else
85394966468SAlexey Marchuk		CONFIG[RDMA_SET_ACK_TIMEOUT]="n"
85494966468SAlexey Marchuk		echo "RDMA_OPTION_ID_ACK_TIMEOUT is not supported"
85594966468SAlexey Marchuk	fi
85694966468SAlexey Marchuk
857daee62a0SAlexey Marchuk	if [ "${CONFIG[RDMA_PROV]}" == "mlx5_dv" ]; then
858daee62a0SAlexey Marchuk		if ! echo -e '#include <spdk/stdinc.h>\n' \
859daee62a0SAlexey Marchuk			'#include <infiniband/mlx5dv.h>\n' \
860daee62a0SAlexey Marchuk			'#include <rdma/rdma_cma.h>\n' \
861daee62a0SAlexey Marchuk			'int main(void) { return rdma_establish(NULL) || ' \
862daee62a0SAlexey Marchuk			'!!IBV_QP_INIT_ATTR_SEND_OPS_FLAGS || !!MLX5_OPCODE_RDMA_WRITE; }\n' \
863bb0f78a2SMichal Berger			| "${BUILD_CMD[@]}" -lmlx5 -I${rootdir}/include -c - 2> /dev/null; then
864daee62a0SAlexey Marchuk			echo "mlx5_dv provider is not supported"
865daee62a0SAlexey Marchuk			exit 1
866daee62a0SAlexey Marchuk		fi
867daee62a0SAlexey Marchuk	fi
868daee62a0SAlexey Marchuk
869bb0f78a2SMichal Berger	echo "Using '${CONFIG[RDMA_PROV]}' RDMA provider"
8707671073bSSeth Howellfi
8717671073bSSeth Howell
872ed56a3d4SAnil Veerabhadrappaif [[ "${CONFIG[FC]}" = "y" ]]; then
873ed56a3d4SAnil Veerabhadrappa	if [[ -n "${CONFIG[FC_PATH]}" ]]; then
874ed56a3d4SAnil Veerabhadrappa		if [ ! -d "${CONFIG[FC_PATH]}" ]; then
875ed56a3d4SAnil Veerabhadrappa			echo "${CONFIG[FC_PATH]}: directory not found"
876ed56a3d4SAnil Veerabhadrappa			exit 1
877ed56a3d4SAnil Veerabhadrappa		fi
878ed56a3d4SAnil Veerabhadrappa	fi
879ed56a3d4SAnil Veerabhadrappafi
880ed56a3d4SAnil Veerabhadrappa
881552e21ccSZiye Yangif [[ "${CONFIG[ISAL]}" = "y" ]] || [[ "${CONFIG[CRYPTO]}" = "y" ]]; then
882325010bfSRichael Zhuang	if [[ "${HAVE_NASM}" = "n" ]] && [[ $arch == x86_64* ]]; then
88335e54647STomasz Zawadzki		echo "ERROR: ISA-L, compression & crypto require NASM version 2.14 or newer."
884873c8748STomasz Kulasek		echo "Please install or upgrade them re-run this script."
885873c8748STomasz Kulasek		exit 1
886552e21ccSZiye Yang	fi
887552e21ccSZiye Yangfi
888552e21ccSZiye Yang
889ce711726SDarek Stojaczykif [[ "${CONFIG[PMDK]}" = "y" ]]; then
890ce711726SDarek Stojaczyk	if ! echo -e '#include <libpmemblk.h>\nint main(void) { return 0; }\n' \
891bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -lpmemblk - 2> /dev/null; then
892bb0f78a2SMichal Berger		echo "--with-pmdk requires libpmemblk."
893bb0f78a2SMichal Berger		echo "Please install then re-run this script."
894ce711726SDarek Stojaczyk		exit 1
895ce711726SDarek Stojaczyk	fi
896ce711726SDarek Stojaczykfi
897ce711726SDarek Stojaczyk
8982a6ddeb8SYuriy Umanetsfunction dpdk_version() {
8992a6ddeb8SYuriy Umanets	# Check DPDK version to determine if mlx5_pci driver is supported
9002a6ddeb8SYuriy Umanets	local dpdk_ver="none"
9012a6ddeb8SYuriy Umanets	if [[ "${CONFIG[DPDK_DIR]}" == "$rootdir/dpdk/build" ]]; then
9022a6ddeb8SYuriy Umanets		# DPDK_DIR points at our submodule so ./build may not exist yet. Use
9032a6ddeb8SYuriy Umanets		# absolute path to lookup the version.
9042a6ddeb8SYuriy Umanets		dpdk_ver=$(< "$rootdir/dpdk/VERSION")
9052a6ddeb8SYuriy Umanets	elif [[ -f "${CONFIG[DPDK_DIR]}"/../VERSION ]]; then
9062a6ddeb8SYuriy Umanets		dpdk_ver=$(< "${CONFIG[DPDK_DIR]}"/../VERSION)
9072a6ddeb8SYuriy Umanets	fi
9082a6ddeb8SYuriy Umanets	echo $dpdk_ver
9092a6ddeb8SYuriy Umanets}
9102a6ddeb8SYuriy Umanets
9112a6ddeb8SYuriy Umanetsfunction mlx5_build() {
9122a6ddeb8SYuriy Umanets	# Check if libmlx5 exists to enable mlx5_pci compress/crypto PMD
9132a6ddeb8SYuriy Umanets	if ! echo -e '#include <spdk/stdinc.h>\n' \
9142a6ddeb8SYuriy Umanets		'#include <infiniband/mlx5dv.h>\n' \
9152a6ddeb8SYuriy Umanets		'#include <infiniband/verbs.h>\n' \
9162a6ddeb8SYuriy Umanets		'int main(void) { return 0; }\n' \
9172a6ddeb8SYuriy Umanets		| "${BUILD_CMD[@]}" -lmlx5 -libverbs -I${rootdir}/include -c - 2> /dev/null; then
9182a6ddeb8SYuriy Umanets		return 1
9192a6ddeb8SYuriy Umanets	fi
9202a6ddeb8SYuriy Umanets	return 0
9212a6ddeb8SYuriy Umanets}
9222a6ddeb8SYuriy Umanets
92397022803SJim Harrisif [[ "${CONFIG[REDUCE]}" = "y" ]]; then
924c4a3b312SDarek Stojaczyk	if ! echo -e '#include <libpmem.h>\nint main(void) { return 0; }\n' \
925bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -lpmem - 2> /dev/null; then
926bb0f78a2SMichal Berger		echo "--with-reduce requires libpmem."
927bb0f78a2SMichal Berger		echo "Please install then re-run this script."
92897022803SJim Harris		exit 1
92997022803SJim Harris	fi
9302a6ddeb8SYuriy Umanets	# Try to enable mlx5 compress
931e71ae467SAlexey Marchuk	CONFIG[REDUCE_MLX5]="y"
9322a6ddeb8SYuriy Umanets
933e71ae467SAlexey Marchuk	# Check if libmlx5 exists to enable mlx5_pci compress PMD
9342a6ddeb8SYuriy Umanets	if ! mlx5_build; then
935e71ae467SAlexey Marchuk		echo "libmlx5 is not found, so disabling DPDK mlx5_pci compress PMD"
936e71ae467SAlexey Marchuk		CONFIG[REDUCE_MLX5]="n"
9372a6ddeb8SYuriy Umanets	else
938e71ae467SAlexey Marchuk		if [[ "${CONFIG[DPDK_PKG_CONFIG]}" = "y" ]]; then
939e71ae467SAlexey Marchuk			# Check if librte_compress_mlx5 exists in DPDK package
940e71ae467SAlexey Marchuk			if [ ! -f "${CONFIG[DPDK_LIB_DIR]}"/librte_compress_mlx5.so ]; then
941e71ae467SAlexey Marchuk				echo "librte_compress_mlx5 is not found, so disabling DPDK mlx5_pci compress PMD"
942e71ae467SAlexey Marchuk				CONFIG[REDUCE_MLX5]="n"
943e71ae467SAlexey Marchuk			fi
944e71ae467SAlexey Marchuk		else
945e71ae467SAlexey Marchuk			# Check DPDK version to determine if mlx5_pci driver is supported
9462a6ddeb8SYuriy Umanets			dpdk_ver=$(dpdk_version)
9472a6ddeb8SYuriy Umanets			if [[ $dpdk_ver = "none" ]]; then
948c2de56b0SMichal Berger				echo "Cannot get DPDK version, so disabling DPDK mlx5_pci compress PMD"
949e71ae467SAlexey Marchuk				CONFIG[REDUCE_MLX5]="n"
9502a6ddeb8SYuriy Umanets			elif [[ -n $dpdk_ver ]] && lt "$dpdk_ver" 21.02.0; then
9512a6ddeb8SYuriy Umanets				# mlx5_pci for compress is supported by DPDK >- 21.02.0
952c2de56b0SMichal Berger				echo "DPDK version ${dpdk_ver} doesn't support mlx5_pci compress PMD"
953c2de56b0SMichal Berger				CONFIG[REDUCE_MLX5]="n"
9542a6ddeb8SYuriy Umanets			elif [[ -n ${CONFIG[DPDK_LIB_DIR]} ]] && [ ! -f "${CONFIG[DPDK_LIB_DIR]}"/librte_compress_mlx5.so ]; then
9552a6ddeb8SYuriy Umanets				# This is only checked when --with-dpdk or --with-dpdk=* is used
9562a6ddeb8SYuriy Umanets				echo "librte_compress_mlx5 is not found, so disabling DPDK mlx5_pci compress PMD"
9572a6ddeb8SYuriy Umanets				CONFIG[REDUCE_MLX5]="n"
9582a6ddeb8SYuriy Umanets			fi
9592a6ddeb8SYuriy Umanets		fi
9602a6ddeb8SYuriy Umanets	fi
9612a6ddeb8SYuriy Umanetsfi
9622a6ddeb8SYuriy Umanets
9632a6ddeb8SYuriy Umanetsif [[ "${CONFIG[CRYPTO]}" = "y" ]]; then
9642a6ddeb8SYuriy Umanets	# Try to enable mlx5 crypto
9652a6ddeb8SYuriy Umanets	CONFIG[CRYPTO_MLX5]="y"
9662a6ddeb8SYuriy Umanets
9672a6ddeb8SYuriy Umanets	# Check if libmlx5 exists to enable mlx5_pci compress PMD
9682a6ddeb8SYuriy Umanets	if ! mlx5_build; then
9692a6ddeb8SYuriy Umanets		echo "libmlx5 is not found, so disabling DPDK mlx5_pci crypto PMD"
9702a6ddeb8SYuriy Umanets		CONFIG[CRYPTO_MLX5]="n"
9712a6ddeb8SYuriy Umanets	else
9722a6ddeb8SYuriy Umanets		if [[ "${CONFIG[DPDK_PKG_CONFIG]}" = "y" ]]; then
9732a6ddeb8SYuriy Umanets			# Check if librte_crypto_mlx5 exists in DPDK package
9742a6ddeb8SYuriy Umanets			if [ ! -f "${CONFIG[DPDK_LIB_DIR]}"/librte_crypto_mlx5.so ]; then
9752a6ddeb8SYuriy Umanets				echo "librte_crypto_mlx5 is not found, so disabling DPDK mlx5_pci crypto PMD"
9762a6ddeb8SYuriy Umanets				CONFIG[CRYPTO_MLX5]="n"
9772a6ddeb8SYuriy Umanets			fi
9782a6ddeb8SYuriy Umanets		else
9792a6ddeb8SYuriy Umanets			# Check DPDK version to determine if mlx5_pci driver is supported
9802a6ddeb8SYuriy Umanets			dpdk_ver=$(dpdk_version)
9812a6ddeb8SYuriy Umanets			if [[ $dpdk_ver = "none" ]]; then
9822a6ddeb8SYuriy Umanets				echo "Cannot get DPDK version, so disabling DPDK mlx5_pci crypto PMD"
9832a6ddeb8SYuriy Umanets				CONFIG[CRYPTO_MLX5]="n"
9848a2fc789SYuriy Umanets			elif [[ -n $dpdk_ver ]] && lt "$dpdk_ver" 21.11.0; then
9858a2fc789SYuriy Umanets				# mlx5_pci for crypto is supported by DPDK >- 21.11.0
9862a6ddeb8SYuriy Umanets				echo "DPDK version ${dpdk_ver} doesn't support mlx5_pci crypto PMD"
9872a6ddeb8SYuriy Umanets				CONFIG[CRYPTO_MLX5]="n"
9882a6ddeb8SYuriy Umanets			elif [[ -n ${CONFIG[DPDK_LIB_DIR]} ]] && [ ! -f "${CONFIG[DPDK_LIB_DIR]}"/librte_crypto_mlx5.so ]; then
9892a6ddeb8SYuriy Umanets				# This is only checked when --with-dpdk or --with-dpdk=* is used
9902a6ddeb8SYuriy Umanets				echo "librte_crypto_mlx5 is not found, so disabling DPDK mlx5_pci crypto PMD"
9912a6ddeb8SYuriy Umanets				CONFIG[CRYPTO_MLX5]="n"
9922a6ddeb8SYuriy Umanets			fi
993e71ae467SAlexey Marchuk		fi
994e269bf4eSAlexey Marchuk	fi
99597022803SJim Harrisfi
99697022803SJim Harris
997805d9942STomasz Kulasekif [[ "${CONFIG[NVME_CUSE]}" = "y" ]]; then
998805d9942STomasz Kulasek	if ! echo -e '#define FUSE_USE_VERSION 31\n#include <fuse3/cuse_lowlevel.h>\n#include <fuse3/fuse_lowlevel.h>\n#include <fuse3/fuse_opt.h>\nint main(void) { return 0; }\n' \
999bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -lfuse3 -D_FILE_OFFSET_BITS=64 - 2> /dev/null; then
1000bb0f78a2SMichal Berger		echo "--with-cuse requires libfuse3."
1001bb0f78a2SMichal Berger		echo "Please install then re-run this script."
1002805d9942STomasz Kulasek		exit 1
1003805d9942STomasz Kulasek	fi
1004805d9942STomasz Kulasekfi
1005805d9942STomasz Kulasek
100655bd0d3aSDarek Stojaczykif [[ "${CONFIG[RBD]}" = "y" ]]; then
100755bd0d3aSDarek Stojaczyk	if ! echo -e '#include <rbd/librbd.h>\n#include <rados/librados.h>\n' \
100855bd0d3aSDarek Stojaczyk		'int main(void) { return 0; }\n' \
1009bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -lrados -lrbd - 2> /dev/null; then
1010bb0f78a2SMichal Berger		echo "--with-rbd requires librados and librbd."
1011bb0f78a2SMichal Berger		echo "Please install then re-run this script."
101255bd0d3aSDarek Stojaczyk		exit 1
101355bd0d3aSDarek Stojaczyk	fi
101455bd0d3aSDarek Stojaczykfi
101555bd0d3aSDarek Stojaczyk
10165cb18040SDarek Stojaczykif [[ "${CONFIG[ISCSI_INITIATOR]}" = "y" ]]; then
10175cb18040SDarek Stojaczyk	# Fedora installs libiscsi to /usr/lib64/iscsi for some reason.
10185cb18040SDarek Stojaczyk	if ! echo -e '#include <iscsi/iscsi.h>\n#include <iscsi/scsi-lowlevel.h>\n' \
10195cb18040SDarek Stojaczyk		'#if LIBISCSI_API_VERSION < 20150621\n' \
10205cb18040SDarek Stojaczyk		'#error\n' \
10215cb18040SDarek Stojaczyk		'#endif\n' \
10225cb18040SDarek Stojaczyk		'int main(void) { return 0; }\n' \
1023bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -L/usr/lib64/iscsi -liscsi - 2> /dev/null; then
1024bb0f78a2SMichal Berger		echo "--with-iscsi-initiator requires libiscsi with"
1025bb0f78a2SMichal Berger		echo "LIBISCSI_API_VERSION >= 20150621."
1026bb0f78a2SMichal Berger		echo "Please install then re-run this script."
10275cb18040SDarek Stojaczyk		exit 1
10285cb18040SDarek Stojaczyk	fi
10295cb18040SDarek Stojaczykfi
10305cb18040SDarek Stojaczyk
10313674c1d3SDarek Stojaczykif [[ "${CONFIG[ASAN]}" = "y" ]]; then
10323674c1d3SDarek Stojaczyk	if ! echo -e 'int main(void) { return 0; }\n' \
1033bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -fsanitize=address - 2> /dev/null; then
1034bb0f78a2SMichal Berger		echo "--enable-asan requires libasan."
1035bb0f78a2SMichal Berger		echo "Please install then re-run this script."
10363674c1d3SDarek Stojaczyk		exit 1
10373674c1d3SDarek Stojaczyk	fi
10383674c1d3SDarek Stojaczykfi
10393674c1d3SDarek Stojaczyk
10403674c1d3SDarek Stojaczykif [[ "${CONFIG[UBSAN]}" = "y" ]]; then
10413674c1d3SDarek Stojaczyk	if ! echo -e 'int main(void) { return 0; }\n' \
1042bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -fsanitize=undefined - 2> /dev/null; then
1043bb0f78a2SMichal Berger		echo "--enable-ubsan requires libubsan."
1044bb0f78a2SMichal Berger		echo "Please install then re-run this script."
1045bb0f78a2SMichal Berger		echo "If installed, please check that the GCC version is at least 6.4"
1046bb0f78a2SMichal Berger		echo "and synchronize CC accordingly."
10473674c1d3SDarek Stojaczyk		exit 1
10483674c1d3SDarek Stojaczyk	fi
10493674c1d3SDarek Stojaczykfi
10503674c1d3SDarek Stojaczyk
10513674c1d3SDarek Stojaczykif [[ "${CONFIG[TSAN]}" = "y" ]]; then
10523674c1d3SDarek Stojaczyk	if ! echo -e 'int main(void) { return 0; }\n' \
1053bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -fsanitize=thread - 2> /dev/null; then
1054bb0f78a2SMichal Berger		echo "--enable-tsan requires libtsan."
1055bb0f78a2SMichal Berger		echo "Please install then re-run this script."
10563674c1d3SDarek Stojaczyk		exit 1
10573674c1d3SDarek Stojaczyk	fi
10583674c1d3SDarek Stojaczykfi
10593674c1d3SDarek Stojaczyk
1060d1fee489SVitaliy Mysakif [[ "${CONFIG[OCF]}" = "y" ]]; then
1061d1fee489SVitaliy Mysak	# If OCF_PATH is a file, assume it is a library and use it to compile with
1062d1fee489SVitaliy Mysak	if [ -f ${CONFIG[OCF_PATH]} ]; then
1063d1fee489SVitaliy Mysak		CONFIG[CUSTOMOCF]=y
1064d1fee489SVitaliy Mysak	else
1065d1fee489SVitaliy Mysak		CONFIG[CUSTOMOCF]=n
1066d1fee489SVitaliy Mysak	fi
1067d1fee489SVitaliy Mysakfi
1068d1fee489SVitaliy Mysak
1069995d60f4SBen Walkerif [[ "${CONFIG[PGO_CAPTURE]}" = "y" && "${CONFIG[PGO_USE]}" = "y" ]]; then
1070995d60f4SBen Walker	echo "ERROR: --enable-pgo-capture and --enable-pgo-use are mutually exclusive."
1071995d60f4SBen Walker	exit 1
1072954728e9SBen Walkerelif [[ "${CONFIG[PGO_USE]}" = "y" ]]; then
1073954728e9SBen Walker	if [[ "$CC_TYPE" = "clang" ]]; then
1074954728e9SBen Walker		# For clang we need to run an extra step on gathered profiling data.
1075954728e9SBen Walker		echo "Generating suitable profile data"
1076954728e9SBen Walker		llvm-profdata merge -output=build/pgo/default.profdata build/pgo
1077954728e9SBen Walker	fi
1078995d60f4SBen Walkerfi
1079995d60f4SBen Walker
10808165bf71SBen Walkerif [[ "${CONFIG[URING]}" = "y" ]]; then
10818165bf71SBen Walker	if [[ -n "${CONFIG[URING_PATH]}" ]]; then
10828165bf71SBen Walker		if [ ! -d "${CONFIG[URING_PATH]}" ]; then
10838165bf71SBen Walker			echo "${CONFIG[URING_PATH]}: directory not found"
10848165bf71SBen Walker			exit 1
10858165bf71SBen Walker		fi
10864ccc9ea3SJim Harris	elif ! echo -e '#include <liburing.h>\nint main(void) { return 0; }\n' \
10874ccc9ea3SJim Harris		| "${BUILD_CMD[@]}" -luring - 2> /dev/null; then
10884ccc9ea3SJim Harris		echo "--with-uring requires liburing."
10894ccc9ea3SJim Harris		echo "Please build and install then re-run this script."
10904ccc9ea3SJim Harris		exit 1
10918165bf71SBen Walker	fi
10928165bf71SBen Walkerfi
1093995d60f4SBen Walker
10947fa15e28SXiaodong Liuif [[ "${CONFIG[FUSE]}" = "y" ]]; then
10957fa15e28SXiaodong Liu	if [[ ! -d /usr/include/fuse3 ]] && [[ ! -d /usr/local/include/fuse3 ]]; then
10967fa15e28SXiaodong Liu		echo "--with-fuse requires libfuse3."
10977fa15e28SXiaodong Liu		echo "Please install then re-run this script."
10987fa15e28SXiaodong Liu		exit 1
10997fa15e28SXiaodong Liu	fi
11007fa15e28SXiaodong Liufi
11017fa15e28SXiaodong Liu
110291e42257SJim Harrisif [ "${CONFIG[CET]}" = "y" ]; then
1103bb0f78a2SMichal Berger	if ! echo -e 'int main(void) { return 0; }\n' | "${BUILD_CMD[@]}" -fcf-protection - 2> /dev/null; then
1104bb0f78a2SMichal Berger		echo "--enable-cet requires compiler/linker that supports CET."
1105bb0f78a2SMichal Berger		echo "Please install then re-run this script."
110691e42257SJim Harris		exit 1
110791e42257SJim Harris	fi
110891e42257SJim Harrisfi
110991e42257SJim Harris
1110050565e5SJim Harrisif [[ "${CONFIG[FUZZER]}" = "y" && "$CC_TYPE" != "clang" ]]; then
1111050565e5SJim Harris	echo "--with-fuzzer requires setting CC and CXX to clang."
1112050565e5SJim Harris	exit 1
1113050565e5SJim Harrisfi
1114050565e5SJim Harris
11159d2f6f86SJim Harrisif [[ "${CONFIG[ISAL]}" = "y" ]]; then
11169d2f6f86SJim Harris	if [ ! -f "$rootdir"/isa-l/autogen.sh ]; then
11179d2f6f86SJim Harris		echo "ISA-L was not found; To install ISA-L run:"
11189d2f6f86SJim Harris		echo "  git submodule update --init"
11199d2f6f86SJim Harris		exit 1
11209d2f6f86SJim Harris	fi
11219d2f6f86SJim Harris
11229d2f6f86SJim Harris	cd $rootdir/isa-l
11239d2f6f86SJim Harris	ISAL_LOG=$rootdir/isa-l/spdk-isal.log
11249d2f6f86SJim Harris	if [[ -n "${CONFIG[CROSS_PREFIX]}" ]]; then
11259d2f6f86SJim Harris		ISAL_OPTS=("--host=${CONFIG[CROSS_PREFIX]}")
11269d2f6f86SJim Harris	else
11279d2f6f86SJim Harris		ISAL_OPTS=()
11289d2f6f86SJim Harris	fi
11299d2f6f86SJim Harris	echo -n "Configuring ISA-L (logfile: $ISAL_LOG)..."
11309d2f6f86SJim Harris	./autogen.sh &> $ISAL_LOG
11319d2f6f86SJim Harris	./configure CFLAGS="-fPIC -g -O2" "${ISAL_OPTS[@]}" --enable-shared=no >> $ISAL_LOG 2>&1
11329d2f6f86SJim Harris	echo "done."
11339d2f6f86SJim Harris	cd $rootdir
11349d2f6f86SJim Harrisfi
11359d2f6f86SJim Harris
1136509241ceSKonrad Sztyberif [[ "${CONFIG[SMA]}" = "y" ]]; then
1137509241ceSKonrad Sztyber	if ! python3 -c 'import grpc; import grpc_tools' 2> /dev/null; then
1138509241ceSKonrad Sztyber		echo "--with-sma requires grpcio and grpcio-tools python packages."
1139509241ceSKonrad Sztyber		echo "Please install then re-run this script."
1140509241ceSKonrad Sztyber		exit 1
1141509241ceSKonrad Sztyber	fi
1142509241ceSKonrad Sztyberfi
1143509241ceSKonrad Sztyber
1144fcc38949SRui Chang# For ARM Neoverse-N1 platform, debug build needs gcc version newer than 8.4
1145fcc38949SRui Changif [[ "${CONFIG[DEBUG]}" = "y" && $arch = aarch64* && "$CC_TYPE" = "gcc" ]]; then
1146fcc38949SRui Chang	GCC_VERSION=$($CC -dumpfullversion)
1147fcc38949SRui Chang	PART_NUM=$(grep -i -m 1 "CPU part" /proc/cpuinfo | awk '{print $4}')
1148fcc38949SRui Chang
1149fcc38949SRui Chang	if [[ "$(printf '%s\n' "8.4.0" "$GCC_VERSION" | sort -V | head -n1)" != "8.4.0" ]]; then
1150fcc38949SRui Chang		if [[ $PART_NUM = 0xd0c ]]; then
1151fcc38949SRui Chang			echo "WARNING: For ARM Neoverse-N1 platform, debug build needs GCC version newer than 8.4."
1152fcc38949SRui Chang			echo "         Will work around this by using armv8.2-a+crypto as target architecture for now."
1153fcc38949SRui Chang			CONFIG[ARCH]=armv8.2-a+crypto
1154fcc38949SRui Chang		fi
1155fcc38949SRui Chang	fi
1156fcc38949SRui Changfi
1157fcc38949SRui Chang
115848f70f48SPawel Wodkowski# We are now ready to generate final configuration. But first do sanity
115948f70f48SPawel Wodkowski# check to see if all keys in CONFIG array have its reflection in CONFIG file.
1160bb0f78a2SMichal Bergerif (($(grep -cE "^\s*CONFIG_[[:alnum:]_]+=" "$rootdir/CONFIG") != ${#CONFIG[@]})); then
116148f70f48SPawel Wodkowski	echo ""
116248f70f48SPawel Wodkowski	echo "BUG: Some configuration options are not present in CONFIG file. Please update this file."
116348f70f48SPawel Wodkowski	echo "Missing options in CONFIG (+) file and in current config (-): "
116448f70f48SPawel Wodkowski	diff -u --label "CONFIG file" --label "CONFIG[@]" \
1165f8d6541dSMichal Berger		<(sed -r -e '/^[[:space:]]*$/d; /^[[:space:]]*#.*/d; s/(CONFIG_[[:alnum:]_]+)=.*/\1/g' CONFIG | sort) \
1166bb0f78a2SMichal Berger		<(printf "CONFIG_%s\n" "${!CONFIG[@]}" | sort)
116748f70f48SPawel Wodkowski	exit 1
116848f70f48SPawel Wodkowskifi
116948f70f48SPawel Wodkowski
117085bc2bbeSPawel Wodkowskiecho -n "Creating mk/config.mk..."
1171e62a3c65SSeth Howellcp -f $rootdir/CONFIG $rootdir/mk/config.mk
1172bb0f78a2SMichal Bergerfor key in "${!CONFIG[@]}"; do
1173f8d6541dSMichal Berger	sed -i.bak -r "s#[[:space:]]*CONFIG_${key}=.*#CONFIG_${key}\?=${CONFIG[$key]}#g" $rootdir/mk/config.mk
1174577df16aSPawel Wodkowskidone
1175577df16aSPawel Wodkowski# On FreeBSD sed -i 'SUFFIX' - SUFFIX is mandatory. So no way but to delete the backed file.
1176e62a3c65SSeth Howellrm -f $rootdir/mk/config.mk.bak
1177baa6eac0SDarek Stojaczykecho "done."
11789dd998cdSBen Walker
117908ec96ebSDaniel Verkamp# Environment variables
1180baa6eac0SDarek Stojaczykecho -n "Creating mk/cc.flags.mk..."
1181e62a3c65SSeth Howellrm -f $rootdir/mk/cc.flags.mk
1182e62a3c65SSeth Howell[ -n "$CFLAGS" ] && echo "CFLAGS?=$CFLAGS" > $rootdir/mk/cc.flags.mk
1183e62a3c65SSeth Howell[ -n "$CXXFLAGS" ] && echo "CXXFLAGS?=$CXXFLAGS" >> $rootdir/mk/cc.flags.mk
1184e62a3c65SSeth Howell[ -n "$LDFLAGS" ] && echo "LDFLAGS?=$LDFLAGS" >> $rootdir/mk/cc.flags.mk
1185e62a3c65SSeth Howell[ -n "$DESTDIR" ] && echo "DESTDIR?=$DESTDIR" >> $rootdir/mk/cc.flags.mk
11860b56a5b4SJim Harrisecho "done."
118785bc2bbeSPawel Wodkowski
1188db3ebfe6SMichal Berger# Create .sh with build config for easy sourcing|lookup during the tests.
1189db3ebfe6SMichal Bergerfor conf in "${!CONFIG[@]}"; do
1190db3ebfe6SMichal Berger	echo "CONFIG_$conf=${CONFIG[$conf]}"
1191db3ebfe6SMichal Bergerdone > "$rootdir/test/common/build_config.sh"
1192db3ebfe6SMichal Berger
11935a764955SMichal Bergerif [[ $sys_name == "FreeBSD" ]]; then
1194870ce250SPaul Luse	echo "Type 'gmake' to build."
1195870ce250SPaul Luseelse
11960b56a5b4SJim Harris	echo "Type 'make' to build."
1197870ce250SPaul Lusefi
11989dd998cdSBen Walker
11999dd998cdSBen Walkerexit 0
1200