xref: /spdk/configure (revision e8f84531205f2229771fa6a48fb5301bd4cf1eda)
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"
596f338d4bSKrishna Kanth Reddy	echo " --with-xnvme              Build xNVMe bdev module."
606f338d4bSKrishna Kanth Reddy	echo " --without-xnvme           No path required."
612bc71094SMichal Berger	echo " --with-vhost              Build vhost target. Enabled by default."
622bc71094SMichal Berger	echo " --without-vhost           No path required."
632bc71094SMichal Berger	echo " --with-virtio             Build vhost initiator and virtio-pci bdev modules."
642bc71094SMichal Berger	echo " --without-virtio          No path required."
65e50ade31SChangpeng Liu	echo " --with-vfio-user[=DIR]    Build custom vfio-user transport for NVMf target and vfio-user target."
66e50ade31SChangpeng Liu	echo "                           vfio-user initiator is always built-in in Linux."
672f731c63SGangCao	echo "                           example: /usr/src/libvfio-user"
682f731c63SGangCao	echo " --without-vfio-user       No path required."
69ebf077cbSyidong0635	echo " --with-pmdk[=DIR]         Build persistent memory bdev.
70ebf077cbSyidong0635					 example: /usr/share/pmdk"
71ebf077cbSyidong0635	echo " --without-pmdk		 No path required."
722bc71094SMichal Berger	echo " --with-reduce             Build vbdev compression module."
732bc71094SMichal Berger	echo " --without-reduce          No path required."
742bc71094SMichal Berger	echo " --with-rbd                Build Ceph RBD bdev module."
752bc71094SMichal Berger	echo " --without-rbd             No path required."
762bc71094SMichal Berger	echo " --with-rdma[=DIR]         Build RDMA transport for NVMf target and initiator."
772bc71094SMichal Berger	echo " --without-rdma            Accepts optional RDMA provider name. Can be \"verbs\" or \"mlx5_dv\"."
78daee62a0SAlexey Marchuk	echo "                           If no provider specified, \"verbs\" provider is used by default."
792bc71094SMichal Berger	echo " --with-fc[=DIR]           Build FC transport for NVMf target."
802bc71094SMichal Berger	echo " --without-fc              If an argument is provided, it is considered a directory containing"
81ed56a3d4SAnil Veerabhadrappa	echo "                           libufc.a and fc_lld.h. Otherwise the regular system paths will"
82ed56a3d4SAnil Veerabhadrappa	echo "                           be searched."
83044bb175SDenis Barakthanov	echo " --with-daos[=DIR]         Build DAOS bdev module."
842e283fcbS0xe0f	echo " --without-daos            No path required."
852bc71094SMichal Berger	echo " --with-shared             Build spdk shared libraries."
862bc71094SMichal Berger	echo " --without-shared          No path required."
872bc71094SMichal Berger	echo " --with-iscsi-initiator    Build with iscsi bdev module."
882bc71094SMichal Berger	echo " --without-iscsi-initiator No path required."
892bc71094SMichal Berger	echo " --with-vtune=DIR          Required to profile I/O under Intel VTune Amplifier XE."
902bc71094SMichal Berger	echo " --without-vtune           example: /opt/intel/vtune_amplifier_xe_version"
912bc71094SMichal Berger	echo " --with-ocf[=DIR]          Build OCF library and bdev module."
922bc71094SMichal Berger	echo " --without-ocf             If argument is directory, interpret it as root of OCF repo"
93d1fee489SVitaliy Mysak	echo "                           If argument is file, interpret it as compiled OCF lib"
9498d60de6SPiotr Pelplinski	echo "                           If no argument is specified, OCF git submodule is used by default"
95d1fee489SVitaliy Mysak	echo "                           example: /usr/src/ocf/"
962bc71094SMichal Berger	echo " --with-uring[=DIR]        Build I/O uring bdev or socket module."
972bc71094SMichal Berger	echo " --without-uring           If an argument is provided, it is considered a directory containing"
98161c88a0SDarek Stojaczyk	echo "                           liburing.a and io_uring.h. Otherwise the regular system paths will"
99161c88a0SDarek Stojaczyk	echo "                           be searched."
100958d196cSIndraneel M	echo " --without-uring-zns       Build I/O uring module without ZNS (zoned namespaces) support."
10134192459SBoris Glimcher	echo " --with-openssl[=DIR]      Build OPENSSL with custom path. Otherwise the regular system paths will"
10234192459SBoris Glimcher	echo "                           be searched."
1032bc71094SMichal Berger	echo " --with-fuse               Build FUSE components for mounting a blobfs filesystem."
1042bc71094SMichal Berger	echo " --without-fuse            No path required."
1052bc71094SMichal Berger	echo " --with-nvme-cuse          Build NVMe driver with support for CUSE-based character devices."
1062bc71094SMichal Berger	echo " --without-nvme-cuse       No path required."
10783a4b155SArtur Paszkiewicz	echo " --with-raid5f             Build with bdev_raid module RAID5f support."
10883a4b155SArtur Paszkiewicz	echo " --without-raid5f          No path required."
1092bc71094SMichal Berger	echo " --with-wpdk=DIR           Build using WPDK to provide support for Windows (experimental)."
1102bc71094SMichal Berger	echo " --without-wpdk            The argument must be a directory containing lib and include."
1112bc71094SMichal Berger	echo " --with-usdt               Build with userspace DTrace probes enabled."
1122bc71094SMichal Berger	echo " --without-usdt            No path required."
113050565e5SJim Harris	echo " --with-fuzzer             Build with LLVM fuzzing enabled."
114050565e5SJim Harris	echo "                           Path to clang_rt.fuzzer_no_main library required."
115050565e5SJim Harris	echo "                           Requires setting CC and CXX to clang."
116050565e5SJim Harris	echo "                           (Typically /usr/lib/llvm-VER/lib/clang/VER/lib/linux/libclang_rt.fuzzer_no_main-ARCH.a)"
117509241ceSKonrad Sztyber	echo " --with-sma                Generate Storage Management Agent's protobuf interface"
118509241ceSKonrad Sztyber	echo " --without-sma             No path required."
1199dd998cdSBen Walker	echo ""
12008ec96ebSDaniel Verkamp	echo "Environment variables:"
12108ec96ebSDaniel Verkamp	echo ""
12273439e6fSBen Walker	echo "CC                         C compiler"
12308ec96ebSDaniel Verkamp	echo "CFLAGS                     C compiler flags"
12473439e6fSBen Walker	echo "CXX                        C++ compiler"
12508ec96ebSDaniel Verkamp	echo "CXXFLAGS                   C++ compiler flags"
12673439e6fSBen Walker	echo "LD                         Linker"
12708ec96ebSDaniel Verkamp	echo "LDFLAGS                    Linker flags"
12808ec96ebSDaniel Verkamp	echo "DESTDIR                    Destination for 'make install'"
12908ec96ebSDaniel Verkamp	echo ""
1309dd998cdSBen Walker}
1319dd998cdSBen Walker
132577df16aSPawel Wodkowski# Load default values
133ff238359SJosh Soref# Convert config to sourceable configuration file
134e62a3c65SSeth Howellsed -r 's/CONFIG_([[:alnum:]_]+)=(.*)/CONFIG[\1]=\2/g' $rootdir/CONFIG > $rootdir/CONFIG.sh
135577df16aSPawel Wodkowskideclare -A CONFIG
136e62a3c65SSeth Howellsource $rootdir/CONFIG.sh
137e62a3c65SSeth Howellrm $rootdir/CONFIG.sh
138577df16aSPawel Wodkowski
13911a5716dSMichal Berger# Try to expand literal ~ that might have been passed as an option via --long-opt=~/dir.
14011a5716dSMichal Bergerset -- "${@//\~/~}"
14111a5716dSMichal Berger
1424d2e26d8STomasz Zawadzkifor i in "$@"; do
1434d2e26d8STomasz Zawadzki	case "$i" in
1444d2e26d8STomasz Zawadzki		--cross-prefix=*)
1454d2e26d8STomasz Zawadzki			CONFIG[CROSS_PREFIX]="${i#*=}"
1464d2e26d8STomasz Zawadzki			;;
1474d2e26d8STomasz Zawadzki		--enable-lto)
1484d2e26d8STomasz Zawadzki			CONFIG[LTO]=y
1494d2e26d8STomasz Zawadzki			;;
1504d2e26d8STomasz Zawadzki		--disable-lto)
1514d2e26d8STomasz Zawadzki			CONFIG[LTO]=n
1524d2e26d8STomasz Zawadzki			;;
1534d2e26d8STomasz Zawadzki	esac
1544d2e26d8STomasz Zawadzkidone
1554d2e26d8STomasz Zawadzki
156873c8748STomasz Kulasek# Detect the compiler toolchain
157873c8748STomasz Kulasek$rootdir/scripts/detect_cc.sh --cc="$CC" --cxx="$CXX" --lto="${CONFIG[LTO]}" --ld="$LD" --cross-prefix="${CONFIG[CROSS_PREFIX]}" > $rootdir/mk/cc.mk
158873c8748STomasz Kulasek
159bb0f78a2SMichal BergerCC=$(grep "DEFAULT_CC=" "$rootdir/mk/cc.mk" | sed s/DEFAULT_CC=//)
160bb0f78a2SMichal BergerCC_TYPE=$(grep "CC_TYPE=" "$rootdir/mk/cc.mk" | cut -d "=" -f 2)
161873c8748STomasz Kulasek
162873c8748STomasz Kulasekarch=$($CC -dumpmachine)
1635a764955SMichal Bergersys_name=$(uname -s)
164873c8748STomasz Kulasek
1659854c138SNick Connollyif [[ $arch == *mingw* ]] || [[ $arch == *windows* ]]; then
1669854c138SNick Connolly	sys_name=Windows
1679854c138SNick Connollyfi
1689854c138SNick Connolly
1692a0c2a2dSNick Connollyif [[ $sys_name != "Linux" ]]; then
170873c8748STomasz Kulasek	# Vhost, rte_vhost library and virtio are only supported on Linux.
171873c8748STomasz Kulasek	CONFIG[VHOST]="n"
172873c8748STomasz Kulasek	CONFIG[VIRTIO]="n"
173873c8748STomasz Kulasek	echo "Notice: Vhost, rte_vhost library and virtio are only supported on Linux. Turning off default feature."
174873c8748STomasz Kulasekfi
175873c8748STomasz Kulasek
1761723a800SGangCaofunction check_dir() {
1771723a800SGangCao	arg="$1"
1781723a800SGangCao	dir="${arg#*=}"
1791723a800SGangCao	if [ ! -d "$dir" ]; then
1801723a800SGangCao		echo "$arg: directory not found"
1811723a800SGangCao		exit 1
1821723a800SGangCao	fi
1831723a800SGangCao}
1841723a800SGangCao
1857b04eb72SYuriy Umanets# On x86_64 'clang -dumpmachine' produces x86_64-pc-linux-gnu
1867b04eb72SYuriy Umanets# whereas the dpdk might be built with gcc and its libs lie in
1877b04eb72SYuriy Umanets# x86_64-linux-gnu. Let's find the right libdir for dpdkd libs.
1887b04eb72SYuriy Umanetsfunction find_dpdk_arch_libdir() {
1897b04eb72SYuriy Umanets	local dpdk_dir=$1
1907b04eb72SYuriy Umanets
1917b04eb72SYuriy Umanets	# Checking first what we have with $arch, then clang
1927b04eb72SYuriy Umanets	# variant of arch.
1937b04eb72SYuriy Umanets	arches=("$arch" "$(echo $arch | sed 's/-pc//g')")
1947b04eb72SYuriy Umanets	for a in "${arches[@]}"; do
1957b04eb72SYuriy Umanets		local libdir="$dpdk_dir/lib/$a"
1967b04eb72SYuriy Umanets		if [[ -d $libdir ]]; then
1977b04eb72SYuriy Umanets			echo $libdir
1987b04eb72SYuriy Umanets			return
1997b04eb72SYuriy Umanets		fi
2007b04eb72SYuriy Umanets	done
2017b04eb72SYuriy Umanets
2027b04eb72SYuriy Umanets	# Fallback to the libdir without arch component
2037b04eb72SYuriy Umanets	echo "$dpdk_dir/lib"
2047b04eb72SYuriy Umanets}
2057b04eb72SYuriy Umanets
206f1980244SYuriy Umanetsfunction check_IPSec_mb() {
207f1980244SYuriy Umanets	local mode=$1
208f1980244SYuriy Umanets	local dpdk_libdir=$2
209f1980244SYuriy Umanets	local dpdk_incdir=$3
210f1980244SYuriy Umanets	local have_ipsec_mb=n
211f1980244SYuriy Umanets
212f1980244SYuriy Umanets	if [[ $mode = "pkg-config" ]]; then
213f1980244SYuriy Umanets		local dpdk_libs
214f1980244SYuriy Umanets
215f1980244SYuriy Umanets		# Request libdpdk pkg-config settings to figure out if the IPSec_MB is used
216f1980244SYuriy Umanets		# as a dependency.
217f1980244SYuriy Umanets		# Due to some reason pkg-config shows -lIPSec_MB only with --static option
218f13ec525SKarol Latecki		dpdk_libs=$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --libs --static libdpdk)
219f1980244SYuriy Umanets		if echo "$dpdk_libs" | grep "\-lIPSec_MB" > /dev/null 2>&1; then
220f1980244SYuriy Umanets			have_ipsec_mb=y
221f1980244SYuriy Umanets		fi
222f1980244SYuriy Umanets	elif [[ $mode = "build-config" ]]; then
223f1980244SYuriy Umanets		# Use dpdk build config header to check if the IPSec_MB was used.
224f1980244SYuriy Umanets		if grep -F "define RTE_CRYPTO_IPSEC_MB 1" "$dpdk_incdir/rte_build_config.h" > /dev/null 2>&1; then
225f1980244SYuriy Umanets			have_ipsec_mb=y
226f1980244SYuriy Umanets		fi
227f1980244SYuriy Umanets	else
228f1980244SYuriy Umanets		echo "ERROR: Invalid IPSec_MB checking mode $mode."
229f1980244SYuriy Umanets		echo "ERROR: Only \"pkg-config\" and \"build-config\" available."
230f1980244SYuriy Umanets		exit 1
231f1980244SYuriy Umanets	fi
232f1980244SYuriy Umanets	if [[ $have_ipsec_mb = "n" ]]; then
233f1980244SYuriy Umanets		CONFIG[IPSEC_MB]=n
234f1980244SYuriy Umanets		return
235f1980244SYuriy Umanets	fi
236f1980244SYuriy Umanets
237f1980244SYuriy Umanets	# Since we don't know the library path where the IPSec_MB is located
238f1980244SYuriy Umanets	# let's find it out with the ldd utility. This can be a standard location
239f1980244SYuriy Umanets	# or a custom build.
240f1980244SYuriy Umanets	local librte_crypto_ipsec_mb="$dpdk_libdir/librte_crypto_ipsec_mb.so"
241f1980244SYuriy Umanets	if [[ -f "$librte_crypto_ipsec_mb" ]]; then
242f1980244SYuriy Umanets		local ipsec_mb_libdir
243f1980244SYuriy Umanets
244f1980244SYuriy Umanets		ipsec_mb_libdir=$(ldd "$librte_crypto_ipsec_mb" | grep "libIPSec_MB.so" \
245f1980244SYuriy Umanets			| sed -e 's/\s*libIPSec_MB.so.*=>\s//' -e 's/\/libIPSec_MB.so.*$//')
246f1980244SYuriy Umanets		if [[ -d $ipsec_mb_libdir ]]; then
247f1980244SYuriy Umanets			CONFIG[IPSEC_MB]=y
248f1980244SYuriy Umanets			CONFIG[IPSEC_MB_DIR]="$ipsec_mb_libdir"
249f1980244SYuriy Umanets		elif [[ $ipsec_mb_libdir = "not found" ]]; then
250f1980244SYuriy Umanets			# ldconfig cache is broken, old build with refs to non-existing libs, etc.
251f1980244SYuriy Umanets			echo "ERROR: Invalid IPSec_MB installation. Library is not found and/or ldconfig cache is broken!"
252f1980244SYuriy Umanets			exit 1
253f1980244SYuriy Umanets		else
254f1980244SYuriy Umanets			# Failed to check for IPSec_MB lib path. Let's just assume it is lives
255f1980244SYuriy Umanets			# in one of the standard locations (/usr/lib, etc.).
256f1980244SYuriy Umanets			CONFIG[IPSEC_MB]=y
257f1980244SYuriy Umanets		fi
258f1980244SYuriy Umanets	else
259f1980244SYuriy Umanets		# pkg-config says there is IPSec_mb and dpdk lib does not have it. Let's just
260f1980244SYuriy Umanets		# assume it is installed in the system in one of the standard locations.
261f1980244SYuriy Umanets		CONFIG[IPSEC_MB]=y
262f1980244SYuriy Umanets	fi
263f1980244SYuriy Umanets}
264f1980244SYuriy Umanets
2659dd998cdSBen Walkerfor i in "$@"; do
2669dd998cdSBen Walker	case "$i" in
2679dd998cdSBen Walker		-h | --help)
2689dd998cdSBen Walker			usage
2699dd998cdSBen Walker			exit 0
2709dd998cdSBen Walker			;;
2714d2e26d8STomasz Zawadzki		--cross-prefix=*) ;&
2724d2e26d8STomasz Zawadzki		--enable-lto) ;&
2734d2e26d8STomasz Zawadzki		--disable-lto)
2744d2e26d8STomasz Zawadzki			# Options handled before detecting CC.
2754d2e26d8STomasz Zawadzki			;;
2762e7fe8e8SDaniel Verkamp		--prefix=*)
277577df16aSPawel Wodkowski			CONFIG[PREFIX]="${i#*=}"
2782e7fe8e8SDaniel Verkamp			;;
2790e6ddfd6SBen Walker		--target-arch=*)
2800e6ddfd6SBen Walker			CONFIG[ARCH]="${i#*=}"
2810e6ddfd6SBen Walker			;;
282e8863cb7SMichal Berger		--libdir=*)
283e8863cb7SMichal Berger			CONFIG[LIBDIR]="${i#*=}"
284e8863cb7SMichal Berger			;;
2859dd998cdSBen Walker		--enable-debug)
286577df16aSPawel Wodkowski			CONFIG[DEBUG]=y
2879dd998cdSBen Walker			;;
2889dd998cdSBen Walker		--disable-debug)
289577df16aSPawel Wodkowski			CONFIG[DEBUG]=n
2909dd998cdSBen Walker			;;
2919dd998cdSBen Walker		--enable-asan)
292577df16aSPawel Wodkowski			CONFIG[ASAN]=y
2939dd998cdSBen Walker			;;
2949dd998cdSBen Walker		--disable-asan)
295577df16aSPawel Wodkowski			CONFIG[ASAN]=n
2969dd998cdSBen Walker			;;
2979dd998cdSBen Walker		--enable-ubsan)
298577df16aSPawel Wodkowski			CONFIG[UBSAN]=y
2999dd998cdSBen Walker			;;
3009dd998cdSBen Walker		--disable-ubsan)
301577df16aSPawel Wodkowski			CONFIG[UBSAN]=n
3029dd998cdSBen Walker			;;
303830912e2SBen Walker		--enable-tsan)
304577df16aSPawel Wodkowski			CONFIG[TSAN]=y
305830912e2SBen Walker			;;
306830912e2SBen Walker		--disable-tsan)
307577df16aSPawel Wodkowski			CONFIG[TSAN]=n
308830912e2SBen Walker			;;
3099dd998cdSBen Walker		--enable-coverage)
310577df16aSPawel Wodkowski			CONFIG[COVERAGE]=y
3119dd998cdSBen Walker			;;
3129dd998cdSBen Walker		--disable-coverage)
313577df16aSPawel Wodkowski			CONFIG[COVERAGE]=n
3149dd998cdSBen Walker			;;
315995d60f4SBen Walker		--enable-pgo-capture)
316995d60f4SBen Walker			CONFIG[PGO_CAPTURE]=y
317995d60f4SBen Walker			;;
318995d60f4SBen Walker		--disable-pgo-capture)
319995d60f4SBen Walker			CONFIG[PGO_CAPTURE]=n
320995d60f4SBen Walker			;;
321995d60f4SBen Walker		--enable-pgo-use)
322995d60f4SBen Walker			CONFIG[PGO_USE]=y
323995d60f4SBen Walker			;;
324995d60f4SBen Walker		--disable-pgo-use)
325995d60f4SBen Walker			CONFIG[PGO_USE]=n
326995d60f4SBen Walker			;;
3279022a59eSDaniel Verkamp		--enable-tests)
328577df16aSPawel Wodkowski			CONFIG[TESTS]=y
3299022a59eSDaniel Verkamp			;;
3309022a59eSDaniel Verkamp		--disable-tests)
331577df16aSPawel Wodkowski			CONFIG[TESTS]=n
3329022a59eSDaniel Verkamp			;;
3339fcb1cb0STomasz Zawadzki		--enable-unit-tests)
3349fcb1cb0STomasz Zawadzki			CONFIG[UNIT_TESTS]=y
3359fcb1cb0STomasz Zawadzki			;;
3369fcb1cb0STomasz Zawadzki		--disable-unit-tests)
3379fcb1cb0STomasz Zawadzki			CONFIG[UNIT_TESTS]=n
3389fcb1cb0STomasz Zawadzki			;;
3399b2c6452SJacek Kalwas		--enable-examples)
3409b2c6452SJacek Kalwas			CONFIG[EXAMPLES]=y
3419b2c6452SJacek Kalwas			;;
3429b2c6452SJacek Kalwas		--disable-examples)
3439b2c6452SJacek Kalwas			CONFIG[EXAMPLES]=n
3449b2c6452SJacek Kalwas			;;
345119158cdSRajarshi Chowdhury		--enable-apps)
346119158cdSRajarshi Chowdhury			CONFIG[APPS]=y
347119158cdSRajarshi Chowdhury			;;
348119158cdSRajarshi Chowdhury		--disable-apps)
349119158cdSRajarshi Chowdhury			CONFIG[APPS]=N
350119158cdSRajarshi Chowdhury			;;
3519dd998cdSBen Walker		--enable-werror)
352577df16aSPawel Wodkowski			CONFIG[WERROR]=y
3539dd998cdSBen Walker			;;
3549dd998cdSBen Walker		--disable-werror)
355577df16aSPawel Wodkowski			CONFIG[WERROR]=n
3569dd998cdSBen Walker			;;
35791e42257SJim Harris		--enable-cet)
35891e42257SJim Harris			CONFIG[CET]=y
35991e42257SJim Harris			;;
36091e42257SJim Harris		--disable-cet)
36191e42257SJim Harris			CONFIG[CET]=n
36291e42257SJim Harris			;;
3637232c450SMichal Berger		--with-dpdk)
3647b04eb72SYuriy Umanets			# Can we use pkg-config?
3657b04eb72SYuriy Umanets			if command -v "pkg-config" > /dev/null 2>&1 && pkg-config --exists libdpdk; then
3667b04eb72SYuriy Umanets				dpdk_libdir=$(pkg-config --variable=libdir libdpdk)
3677b04eb72SYuriy Umanets				dpdk_libdir=$(readlink -f $dpdk_libdir)
3687b04eb72SYuriy Umanets				dpdk_incdir=$(pkg-config --variable=includedir libdpdk)
3697b04eb72SYuriy Umanets				echo "Using DPDK lib dir $dpdk_libdir"
3707b04eb72SYuriy Umanets				CONFIG[DPDK_LIB_DIR]=$dpdk_libdir
3717b04eb72SYuriy Umanets				CONFIG[DPDK_INC_DIR]=$dpdk_incdir
3727232c450SMichal Berger				CONFIG[DPDK_PKG_CONFIG]=y
3733e3fbf91SYuriy Umanets				if pkg-config --print-requires libdpdk | grep "libbsd" > /dev/null 2>&1; then
3743e3fbf91SYuriy Umanets					CONFIG[HAVE_LIBBSD]=y
3753e3fbf91SYuriy Umanets				fi
3767232c450SMichal Berger				CFLAGS="${CFLAGS:+$CFLAGS }$(pkg-config --cflags libdpdk)"
377f1980244SYuriy Umanets				check_IPSec_mb "pkg-config" "$dpdk_libdir" "$dpdk_incdir"
3787232c450SMichal Berger			else
3797232c450SMichal Berger				echo "libdpdk.pc not found, aborting"
3807232c450SMichal Berger				exit 1
3817232c450SMichal Berger			fi
3827232c450SMichal Berger			;;
38306cc8045SBen Walker		--with-dpdk=*)
38406cc8045SBen Walker			check_dir "$i"
3857b04eb72SYuriy Umanets			dpdk_dir=$(readlink -f ${i#*=})
3867b04eb72SYuriy Umanets			dpdk_libdir=$(find_dpdk_arch_libdir $dpdk_dir)
3877b04eb72SYuriy Umanets			dpdk_incdir="$dpdk_dir/include"
3887b04eb72SYuriy Umanets
3897b04eb72SYuriy Umanets			# Can we use pkg-config?
390f13ec525SKarol Latecki			if command -v "pkg-config" > /dev/null 2>&1 && PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --exists libdpdk; then
3917b04eb72SYuriy Umanets				echo "Using $dpdk_libdir/pkgconfig for additional libs..."
3921e6db5fbSTomasz Zawadzki				sysroot_dir=$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --variable=pc_sysrootdir libdpdk)
393e9438453SJacek Kalwas				dpdk_libdir=$(PKG_CONFIG_SYSROOT_DIR='' PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --variable=libdir libdpdk)
3941e6db5fbSTomasz Zawadzki				dpdk_libdir=$(readlink -f "${sysroot_dir}$dpdk_libdir")
3957b04eb72SYuriy Umanets				if ! echo $dpdk_libdir | grep $dpdk_dir > /dev/null 2>&1; then
3967b04eb72SYuriy Umanets					echo "ERROR: pkg-config reported DPDK libdir $dpdk_libdir is out of the directory specified with --with-dpdk="
3977b04eb72SYuriy Umanets					echo "ERROR: do you have another DPDK installed in the system?"
3987b04eb72SYuriy Umanets					exit 1
3997b04eb72SYuriy Umanets				fi
400f13ec525SKarol Latecki				dpdk_reqs=$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --print-requires libdpdk)
4013e3fbf91SYuriy Umanets				if echo $dpdk_reqs | grep "libbsd" > /dev/null 2>&1; then
4023e3fbf91SYuriy Umanets					CONFIG[HAVE_LIBBSD]=y
4033e3fbf91SYuriy Umanets				fi
404f13ec525SKarol Latecki				CFLAGS="${CFLAGS:+$CFLAGS }$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --cflags libdpdk)"
4051e6db5fbSTomasz Zawadzki				dpdk_incdir="${sysroot_dir}$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --variable=includedir libdpdk)"
406f1980244SYuriy Umanets				check_IPSec_mb "pkg-config" "$dpdk_libdir" "$dpdk_incdir"
4073e3fbf91SYuriy Umanets			else
4083e3fbf91SYuriy Umanets				echo "Using $dpdk_incdir/rte_build_config.h for additional libs..."
4093e3fbf91SYuriy Umanets
4103e3fbf91SYuriy Umanets				if grep -F "define RTE_USE_LIBBSD 1" $dpdk_incdir/rte_build_config.h > /dev/null 2>&1; then
4113e3fbf91SYuriy Umanets					CONFIG[HAVE_LIBBSD]=y
4123e3fbf91SYuriy Umanets				fi
413f1980244SYuriy Umanets				check_IPSec_mb "build-config" "$dpdk_libdir" "$dpdk_incdir"
4147b04eb72SYuriy Umanets			fi
4157b04eb72SYuriy Umanets			echo "DPDK libraries: $dpdk_libdir"
4167b04eb72SYuriy Umanets			echo "DPDK includes: $dpdk_incdir"
4177b04eb72SYuriy Umanets			CONFIG[DPDK_DIR]=$dpdk_dir
4187b04eb72SYuriy Umanets			CONFIG[DPDK_LIB_DIR]="$dpdk_libdir"
4197b04eb72SYuriy Umanets			CONFIG[DPDK_INC_DIR]="$dpdk_incdir"
4207b04eb72SYuriy Umanets			CONFIG[DPDK_PKG_CONFIG]=n
42106cc8045SBen Walker			;;
42206cc8045SBen Walker		--without-dpdk)
42306cc8045SBen Walker			CONFIG[DPDK_DIR]=
42406cc8045SBen Walker			;;
4259854c138SNick Connolly		--with-wpdk=*)
4269854c138SNick Connolly			check_dir "$i"
4279854c138SNick Connolly			CONFIG[WPDK_DIR]=$(readlink -f ${i#*=})
4289854c138SNick Connolly			;;
4292bc71094SMichal Berger		--without-wpdk)
4302bc71094SMichal Berger			CONFIG[WPDK_DIR]=
4312bc71094SMichal Berger			;;
4329dd998cdSBen Walker		--with-env=*)
433577df16aSPawel Wodkowski			CONFIG[ENV]="${i#*=}"
4349dd998cdSBen Walker			;;
4359dd998cdSBen Walker		--with-rbd)
436577df16aSPawel Wodkowski			CONFIG[RBD]=y
4379dd998cdSBen Walker			;;
4389dd998cdSBen Walker		--without-rbd)
439577df16aSPawel Wodkowski			CONFIG[RBD]=n
4409dd998cdSBen Walker			;;
441daee62a0SAlexey Marchuk		--with-rdma=*)
442daee62a0SAlexey Marchuk			CONFIG[RDMA]=y
443daee62a0SAlexey Marchuk			CONFIG[RDMA_PROV]=${i#*=}
444daee62a0SAlexey Marchuk			;;
4459dd998cdSBen Walker		--with-rdma)
446577df16aSPawel Wodkowski			CONFIG[RDMA]=y
447daee62a0SAlexey Marchuk			CONFIG[RDMA_PROV]="verbs"
4489dd998cdSBen Walker			;;
4499dd998cdSBen Walker		--without-rdma)
450577df16aSPawel Wodkowski			CONFIG[RDMA]=n
4519dd998cdSBen Walker			;;
452ed56a3d4SAnil Veerabhadrappa		--with-fc=*)
453ed56a3d4SAnil Veerabhadrappa			CONFIG[FC]=y
454ed56a3d4SAnil Veerabhadrappa			CONFIG[FC_PATH]=$(readlink -f ${i#*=})
455ed56a3d4SAnil Veerabhadrappa			;;
456ed56a3d4SAnil Veerabhadrappa		--with-fc)
457ed56a3d4SAnil Veerabhadrappa			CONFIG[FC]=y
458ed56a3d4SAnil Veerabhadrappa			CONFIG[FC_PATH]=
459ed56a3d4SAnil Veerabhadrappa			;;
460ed56a3d4SAnil Veerabhadrappa		--without-fc)
461ed56a3d4SAnil Veerabhadrappa			CONFIG[FC]=n
462ed56a3d4SAnil Veerabhadrappa			CONFIG[FC_PATH]=
463ed56a3d4SAnil Veerabhadrappa			;;
4642e283fcbS0xe0f		--with-daos)
4652e283fcbS0xe0f			CONFIG[DAOS]=y
466044bb175SDenis Barakthanov			CONFIG[DAOS_DIR]=""
467044bb175SDenis Barakthanov			;;
468044bb175SDenis Barakthanov		--with-daos=*)
469044bb175SDenis Barakthanov			CONFIG[DAOS]=y
470044bb175SDenis Barakthanov			check_dir "$i"
471044bb175SDenis Barakthanov			CONFIG[DAOS_DIR]=$(readlink -f ${i#*=})
4722e283fcbS0xe0f			;;
4732e283fcbS0xe0f		--without-daos)
4742e283fcbS0xe0f			CONFIG[DAOS]=n
4752e283fcbS0xe0f			;;
4760923734cSLance Hartmann		--with-shared)
477577df16aSPawel Wodkowski			CONFIG[SHARED]=y
4780923734cSLance Hartmann			;;
4790923734cSLance Hartmann		--without-shared)
480577df16aSPawel Wodkowski			CONFIG[SHARED]=n
4810923734cSLance Hartmann			;;
4822af15344SJim Harris		--with-iscsi-initiator)
483577df16aSPawel Wodkowski			CONFIG[ISCSI_INITIATOR]=y
4842af15344SJim Harris			;;
4852af15344SJim Harris		--without-iscsi-initiator)
486577df16aSPawel Wodkowski			CONFIG[ISCSI_INITIATOR]=n
4872af15344SJim Harris			;;
4886118b853SDaniel Verkamp		--with-crypto)
489577df16aSPawel Wodkowski			CONFIG[CRYPTO]=y
4906118b853SDaniel Verkamp			;;
4916118b853SDaniel Verkamp		--without-crypto)
492577df16aSPawel Wodkowski			CONFIG[CRYPTO]=n
4936118b853SDaniel Verkamp			;;
49435260f2bSDaniel Verkamp		--with-vhost)
495577df16aSPawel Wodkowski			CONFIG[VHOST]=y
49635260f2bSDaniel Verkamp			;;
49735260f2bSDaniel Verkamp		--without-vhost)
498577df16aSPawel Wodkowski			CONFIG[VHOST]=n
49935260f2bSDaniel Verkamp			;;
5007dee96ceSDariusz Stojaczyk		--with-virtio)
501577df16aSPawel Wodkowski			CONFIG[VIRTIO]=y
5027dee96ceSDariusz Stojaczyk			;;
5037dee96ceSDariusz Stojaczyk		--without-virtio)
504577df16aSPawel Wodkowski			CONFIG[VIRTIO]=n
5057dee96ceSDariusz Stojaczyk			;;
506b30d57cdSChangpeng Liu		--with-vfio-user)
507b30d57cdSChangpeng Liu			CONFIG[VFIO_USER]=y
508d0b2448bSChangpeng Liu			CONFIG[VFIO_USER_DIR]=""
509d0b2448bSChangpeng Liu			;;
510d0b2448bSChangpeng Liu		--with-vfio-user=*)
511d0b2448bSChangpeng Liu			CONFIG[VFIO_USER]=y
512d0b2448bSChangpeng Liu			check_dir "$i"
513d0b2448bSChangpeng Liu			CONFIG[VFIO_USER_DIR]=$(readlink -f ${i#*=})
514b30d57cdSChangpeng Liu			;;
515b30d57cdSChangpeng Liu		--without-vfio-user)
516b30d57cdSChangpeng Liu			CONFIG[VFIO_USER]=n
517b30d57cdSChangpeng Liu			;;
518218dcd84SJim Harris		--with-pmdk)
519577df16aSPawel Wodkowski			CONFIG[PMDK]=y
520577df16aSPawel Wodkowski			CONFIG[PMDK_DIR]=""
521fca11f15SPiotr Pelplinski			;;
522218dcd84SJim Harris		--with-pmdk=*)
523577df16aSPawel Wodkowski			CONFIG[PMDK]=y
5241723a800SGangCao			check_dir "$i"
525577df16aSPawel Wodkowski			CONFIG[PMDK_DIR]=$(readlink -f ${i#*=})
526fca11f15SPiotr Pelplinski			;;
527218dcd84SJim Harris		--without-pmdk)
528577df16aSPawel Wodkowski			CONFIG[PMDK]=n
529fca11f15SPiotr Pelplinski			;;
53097022803SJim Harris		--with-reduce)
53197022803SJim Harris			CONFIG[REDUCE]=y
53297022803SJim Harris			;;
53397022803SJim Harris		--without-reduce)
53497022803SJim Harris			CONFIG[REDUCE]=n
53597022803SJim Harris			;;
5366f338d4bSKrishna Kanth Reddy		--with-xnvme)
5376f338d4bSKrishna Kanth Reddy			CONFIG[XNVME]=y
5386f338d4bSKrishna Kanth Reddy			;;
5396f338d4bSKrishna Kanth Reddy		--without-xnvme)
5406f338d4bSKrishna Kanth Reddy			CONFIG[XNVME]=n
5416f338d4bSKrishna Kanth Reddy			;;
542c3329b52SMichal Berger		--with-fio) ;&
5439dd998cdSBen Walker		--with-fio=*)
544c3329b52SMichal Berger			if [[ ${i#*=} != "$i" ]]; then
54511a5716dSMichal Berger				CONFIG[FIO_SOURCE_DIR]=${i#*=}
546c3329b52SMichal Berger			fi
547c3329b52SMichal Berger			check_dir "--with-fio=${CONFIG[FIO_SOURCE_DIR]}"
54811a5716dSMichal Berger			CONFIG[FIO_SOURCE_DIR]=$(readlink -f "${CONFIG[FIO_SOURCE_DIR]}")
549577df16aSPawel Wodkowski			CONFIG[FIO_PLUGIN]=y
5509dd998cdSBen Walker			;;
5519dd998cdSBen Walker		--without-fio)
552577df16aSPawel Wodkowski			CONFIG[FIO_PLUGIN]=n
5539dd998cdSBen Walker			;;
5545712088aSRoman Sudarikov		--with-vtune=*)
5551723a800SGangCao			check_dir "$i"
556577df16aSPawel Wodkowski			CONFIG[VTUNE_DIR]="${i#*=}"
557577df16aSPawel Wodkowski			CONFIG[VTUNE]=y
5585712088aSRoman Sudarikov			;;
5595712088aSRoman Sudarikov		--without-vtune)
560577df16aSPawel Wodkowski			CONFIG[VTUNE_DIR]=
561577df16aSPawel Wodkowski			CONFIG[VTUNE]=n
5625712088aSRoman Sudarikov			;;
56398d60de6SPiotr Pelplinski		--with-ocf)
56498d60de6SPiotr Pelplinski			CONFIG[OCF]=y
56598d60de6SPiotr Pelplinski			CONFIG[OCF_PATH]=$(readlink -f "./ocf")
56698d60de6SPiotr Pelplinski			;;
567d1fee489SVitaliy Mysak		--with-ocf=*)
568d1fee489SVitaliy Mysak			CONFIG[OCF]=y
569d1fee489SVitaliy Mysak			CONFIG[OCF_PATH]=$(readlink -f ${i#*=})
570d1fee489SVitaliy Mysak			;;
571d1fee489SVitaliy Mysak		--without-ocf)
572d1fee489SVitaliy Mysak			CONFIG[OCF]=n
573d1fee489SVitaliy Mysak			CONFIG[OCF_PATH]=
574d1fee489SVitaliy Mysak			;;
5758165bf71SBen Walker		--with-uring=*)
5768165bf71SBen Walker			CONFIG[URING]=y
5778165bf71SBen Walker			CONFIG[URING_PATH]=$(readlink -f ${i#*=})
5788165bf71SBen Walker			;;
5798165bf71SBen Walker		--with-uring)
5808165bf71SBen Walker			CONFIG[URING]=y
581958d196cSIndraneel M			CONFIG[URING_ZNS]=y
5828165bf71SBen Walker			CONFIG[URING_PATH]=
5838165bf71SBen Walker			;;
5848165bf71SBen Walker		--without-uring)
5858165bf71SBen Walker			CONFIG[URING]=n
5868165bf71SBen Walker			CONFIG[URING_PATH]=
5878165bf71SBen Walker			;;
588958d196cSIndraneel M		--without-uring-zns)
589958d196cSIndraneel M			CONFIG[URING_ZNS]=n
5908b840195SIndraneel M			;;
59134192459SBoris Glimcher		--with-openssl=*)
59234192459SBoris Glimcher			check_dir "$i"
59334192459SBoris Glimcher			CONFIG[OPENSSL_PATH]=$(readlink -f ${i#*=})
59434192459SBoris Glimcher			;;
5957fa15e28SXiaodong Liu		--with-fuse)
5967fa15e28SXiaodong Liu			CONFIG[FUSE]=y
5977fa15e28SXiaodong Liu			;;
5987fa15e28SXiaodong Liu		--without-fuse)
5997fa15e28SXiaodong Liu			CONFIG[FUSE]=n
6007fa15e28SXiaodong Liu			;;
601805d9942STomasz Kulasek		--with-nvme-cuse)
602805d9942STomasz Kulasek			CONFIG[NVME_CUSE]=y
603805d9942STomasz Kulasek			;;
604805d9942STomasz Kulasek		--without-nvme-cuse)
605805d9942STomasz Kulasek			CONFIG[NVME_CUSE]=n
606805d9942STomasz Kulasek			;;
60783a4b155SArtur Paszkiewicz		--with-raid5f)
60883a4b155SArtur Paszkiewicz			CONFIG[RAID5F]=y
60973763d40SArtur Paszkiewicz			;;
61083a4b155SArtur Paszkiewicz		--without-raid5f)
61183a4b155SArtur Paszkiewicz			CONFIG[RAID5F]=n
61273763d40SArtur Paszkiewicz			;;
613e58e9fbdSpaul luse		--with-idxd)
614e58e9fbdSpaul luse			CONFIG[IDXD]=y
6152ed914f8SZiye Yang			CONFIG[IDXD_KERNEL]=n
616e58e9fbdSpaul luse			;;
617e58e9fbdSpaul luse		--without-idxd)
618e58e9fbdSpaul luse			CONFIG[IDXD]=n
619e58e9fbdSpaul luse			;;
6205a1c74bfSJim Harris		--with-usdt)
6215a1c74bfSJim Harris			CONFIG[USDT]=y
6225a1c74bfSJim Harris			;;
6235a1c74bfSJim Harris		--without-usdt)
6245a1c74bfSJim Harris			CONFIG[USDT]=n
6255a1c74bfSJim Harris			;;
626050565e5SJim Harris		--with-fuzzer)
627050565e5SJim Harris			echo "Must specify fuzzer library path with --with-fuzzer"
628050565e5SJim Harris			usage
629050565e5SJim Harris			exit 1
630050565e5SJim Harris			;;
631050565e5SJim Harris		--with-fuzzer=*)
632050565e5SJim Harris			CONFIG[FUZZER]=y
633050565e5SJim Harris			CONFIG[FUZZER_LIB]=$(readlink -f ${i#*=})
634050565e5SJim Harris			;;
635050565e5SJim Harris		--without-fuzzer)
636050565e5SJim Harris			CONFIG[FUZZER]=n
637050565e5SJim Harris			CONFIG[FUZZER_LIB]=
638050565e5SJim Harris			;;
639509241ceSKonrad Sztyber		--with-sma)
640509241ceSKonrad Sztyber			CONFIG[SMA]=y
641509241ceSKonrad Sztyber			;;
642509241ceSKonrad Sztyber		--without-sma)
643509241ceSKonrad Sztyber			CONFIG[SMA]=n
644509241ceSKonrad Sztyber			;;
6459dd998cdSBen Walker		--)
6469dd998cdSBen Walker			break
6479dd998cdSBen Walker			;;
6489dd998cdSBen Walker		*)
6499dd998cdSBen Walker			echo "Unrecognized option $i"
6509dd998cdSBen Walker			usage
6519dd998cdSBen Walker			exit 1
6525ccabc8fSMichal Berger			;;
6539dd998cdSBen Walker	esac
6549dd998cdSBen Walkerdone
6559dd998cdSBen Walker
656131c9aadSAlexey Marchukif [[ $arch == x86_64* ]]; then
65710e1c615SFélix Piédallu	BUILD_CMD=($CC -o /dev/null -x c $CPPFLAGS $CFLAGS $LDFLAGS "-march=native")
658131c9aadSAlexey Marchukelse
65910e1c615SFélix Piédallu	BUILD_CMD=($CC -o /dev/null -x c $CPPFLAGS $CFLAGS $LDFLAGS)
660131c9aadSAlexey Marchukfi
6616c23a6f4SMichal BergerBUILD_CMD+=(-I/usr/local/include -L/usr/local/lib)
66273439e6fSBen Walker
663b30d57cdSChangpeng Liuif [[ "${CONFIG[VFIO_USER]}" = "y" ]]; then
664421368c0SGreg Inozemtsev	if ! echo -e '#include <json-c/json.h>' \
665421368c0SGreg Inozemtsev		| "${BUILD_CMD[@]}" -E - 2> /dev/null; then
6663b673b84SChangpeng Liu		echo "ERROR: --with-vfio-user requires json-c-devel"
6673b673b84SChangpeng Liu		echo "Please install then re-run this script"
6683b673b84SChangpeng Liu		exit 1
6693b673b84SChangpeng Liu	fi
670421368c0SGreg Inozemtsev	if ! echo -e '#include <cmocka.h>' \
671421368c0SGreg Inozemtsev		| "${BUILD_CMD[@]}" -E - 2> /dev/null; then
6723b673b84SChangpeng Liu		echo "ERROR: --with-vfio-user requires libcmocka-devel"
6733b673b84SChangpeng Liu		echo "Please install then re-run this script"
6743b673b84SChangpeng Liu		exit 1
675b30d57cdSChangpeng Liu	fi
676b30d57cdSChangpeng Liufi
677b30d57cdSChangpeng Liu
678e58e9fbdSpaul luse# IDXD uses Intel specific instructions.
679e58e9fbdSpaul luseif [[ "${CONFIG[IDXD]}" = "y" ]]; then
6802755fbdfSpaul luse	if [ $(uname -s) == "FreeBSD" ]; then
6812755fbdfSpaul luse		intel="hw.model: Intel"
6822755fbdfSpaul luse		cpu_vendor=$(sysctl -a | grep hw.model | cut -c 1-15)
6832755fbdfSpaul luse	else
684e58e9fbdSpaul luse		intel="GenuineIntel"
685e58e9fbdSpaul luse		cpu_vendor=$(grep -i 'vendor' /proc/cpuinfo --max-count=1)
6862755fbdfSpaul luse	fi
687e58e9fbdSpaul luse	if [[ "$cpu_vendor" != *"$intel"* ]]; then
688ff238359SJosh Soref		echo "ERROR: IDXD cannot be used due to CPU incompatibility."
689e58e9fbdSpaul luse		exit 1
690e58e9fbdSpaul luse	fi
6912ed914f8SZiye Yang	if [ -e /usr/include/accel-config/libaccel_config.h ]; then
6922ed914f8SZiye Yang		CONFIG[IDXD_KERNEL]=y
6932ed914f8SZiye Yang	fi
6942ed914f8SZiye Yang
695e58e9fbdSpaul lusefi
696e58e9fbdSpaul luse
697577df16aSPawel Wodkowskiif [ -z "${CONFIG[ENV]}" ]; then
698577df16aSPawel Wodkowski	CONFIG[ENV]=$rootdir/lib/env_dpdk
699577df16aSPawel Wodkowski	echo "Using default SPDK env in ${CONFIG[ENV]}"
7007232c450SMichal Berger	if [[ -z "${CONFIG[DPDK_DIR]}" && "${CONFIG[DPDK_PKG_CONFIG]}" == n ]]; then
70138e26cf5STomasz Zawadzki		if [ ! -f "$rootdir"/dpdk/config/meson.build ]; then
702d199eb29SDaniel Verkamp			echo "DPDK not found; please specify --with-dpdk=<path> or run:"
703d199eb29SDaniel Verkamp			echo
704d199eb29SDaniel Verkamp			echo "  git submodule update --init"
705d199eb29SDaniel Verkamp			exit 1
706577df16aSPawel Wodkowski		else
707577df16aSPawel Wodkowski			CONFIG[DPDK_DIR]="${rootdir}/dpdk/build"
708f1980244SYuriy Umanets			# Default ipsec libs
70919518dfbSAleksey Marchuk			if [[ "${CONFIG[CRYPTO]}" = "y" ]] && [[ $arch = x86_64* ]]; then
710f1980244SYuriy Umanets				CONFIG[IPSEC_MB]=y
711f1980244SYuriy Umanets				CONFIG[IPSEC_MB_DIR]="${rootdir}/intel-ipsec-mb/lib"
712f1980244SYuriy Umanets			fi
713577df16aSPawel Wodkowski			echo "Using default DPDK in ${CONFIG[DPDK_DIR]}"
714d199eb29SDaniel Verkamp		fi
7159dd998cdSBen Walker	fi
7167d2a2f52SBen Walkerelse
7177232c450SMichal Berger	if [[ -n "${CONFIG[DPDK_DIR]}" || "${CONFIG[DPDK_PKG_CONFIG]}" == y ]]; then
71806cc8045SBen Walker		echo "--with-env and --with-dpdk are mutually exclusive."
71906cc8045SBen Walker		exit 1
72006cc8045SBen Walker	fi
72106cc8045SBen Walker
722577df16aSPawel Wodkowski	if [ "${CONFIG[VHOST]}" = "y" ]; then
7237d2a2f52SBen Walker		echo "Vhost is only supported when using the default DPDK environment. Disabling it."
7247d2a2f52SBen Walker	fi
7257d2a2f52SBen Walker	# Always disable vhost, but only print the error message if the user explicitly turned it on.
726577df16aSPawel Wodkowski	CONFIG[VHOST]="n"
727577df16aSPawel Wodkowski	if [ "${CONFIG[VIRTIO]}" = "y" ]; then
7287d2a2f52SBen Walker		echo "Virtio is only supported when using the default DPDK environment. Disabling it."
7297d2a2f52SBen Walker	fi
7307d2a2f52SBen Walker	# Always disable virtio, but only print the error message if the user explicitly turned it on.
731577df16aSPawel Wodkowski	CONFIG[VIRTIO]="n"
7329dd998cdSBen Walkerfi
7339dd998cdSBen Walker
7347232c450SMichal Bergerif [[ "${CONFIG[DPDK_PKG_CONFIG]}" == y ]]; then
7357232c450SMichal Berger	if [[ "${CONFIG[SHARED]}" == n ]]; then
7367232c450SMichal Berger		# dpdk-devel doesn't provide static libs
7377232c450SMichal Berger		echo "Build against packaged DPDK requested, enabling shared libraries"
7387232c450SMichal Berger		CONFIG[SHARED]=y
7397232c450SMichal Berger	fi
7407232c450SMichal Bergerfi
7417232c450SMichal Berger
7429854c138SNick Connollyif [[ $sys_name == "Windows" ]]; then
7439854c138SNick Connolly	if [ -z "${CONFIG[WPDK_DIR]}" ]; then
7449854c138SNick Connolly		if [ ! -f "$rootdir"/wpdk/Makefile ]; then
7459854c138SNick Connolly			echo "WPDK not found; please specify --with-wpdk=<path>. See https://wpdk.github.io."
7469854c138SNick Connolly			exit 1
7479854c138SNick Connolly		else
7489854c138SNick Connolly			CONFIG[WPDK_DIR]="${rootdir}/wpdk/build"
7499854c138SNick Connolly			echo "Using default WPDK in ${CONFIG[WPDK_DIR]}"
7509854c138SNick Connolly		fi
7519854c138SNick Connolly	fi
7529854c138SNick Connollyelse
7539854c138SNick Connolly	if [ -n "${CONFIG[WPDK_DIR]}" ]; then
7549854c138SNick Connolly		echo "ERROR: --with-wpdk is only supported for Windows"
7559854c138SNick Connolly		exit 1
7569854c138SNick Connolly	fi
7579854c138SNick Connollyfi
7589854c138SNick Connolly
759577df16aSPawel Wodkowskiif [ "${CONFIG[VTUNE]}" = "y" ]; then
760577df16aSPawel Wodkowski	if [ -z "${CONFIG[VTUNE_DIR]}" ]; then
7615712088aSRoman Sudarikov		echo "When VTune is enabled, you must specify the VTune directory using --with-vtune=path"
7625712088aSRoman Sudarikov		exit 1
7635712088aSRoman Sudarikov	fi
7645712088aSRoman Sudarikovfi
7655712088aSRoman Sudarikov
766bb0f78a2SMichal Bergerif [[ "${CONFIG[ASAN]}" = "y" && "${CONFIG[TSAN]}" = "y" ]]; then
767830912e2SBen Walker	echo "ERROR: ASAN and TSAN cannot be enabled at the same time."
768830912e2SBen Walker	exit 1
769830912e2SBen Walkerfi
770830912e2SBen Walker
771ac5b53a5SJim Harrisif [[ "${CONFIG[FIO_PLUGIN]}" = "y" && "${CONFIG[EXAMPLES]}" = "n" ]]; then
772ac5b53a5SJim Harris	echo "ERROR: --with-fio and --disable-examples are mutually exclusive."
773ac5b53a5SJim Harris	exit 1
774ac5b53a5SJim Harrisfi
775ac5b53a5SJim Harris
7765a764955SMichal Bergerif [[ $sys_name == "FreeBSD" ]]; then
7775091cadcSPaul Luse	# FreeBSD doesn't support all configurations
778577df16aSPawel Wodkowski	if [[ "${CONFIG[COVERAGE]}" == "y" ]]; then
7795091cadcSPaul Luse		echo "ERROR: CONFIG_COVERAGE not available on FreeBSD"
7805091cadcSPaul Luse		exit 1
7815091cadcSPaul Luse	fi
7825091cadcSPaul Lusefi
7835091cadcSPaul Luse
7842a0c2a2dSNick Connollyif [[ $sys_name != "Linux" ]]; then
78527b920a2SDarek Stojaczyk	if [[ "${CONFIG[VHOST]}" == "y" ]]; then
786873c8748STomasz Kulasek		echo "Vhost is only supported on Linux."
787873c8748STomasz Kulasek		exit 1
78827b920a2SDarek Stojaczyk	fi
78927b920a2SDarek Stojaczyk	if [[ "${CONFIG[VIRTIO]}" == "y" ]]; then
790873c8748STomasz Kulasek		echo "Virtio is only supported on Linux."
791873c8748STomasz Kulasek		exit 1
79227b920a2SDarek Stojaczyk	fi
79327b920a2SDarek Stojaczykfi
79427b920a2SDarek Stojaczyk
795577df16aSPawel Wodkowskiif [ "${CONFIG[RDMA]}" = "y" ]; then
796daee62a0SAlexey Marchuk	if [[ ! "${CONFIG[RDMA_PROV]}" == "verbs" ]] && [[ ! "${CONFIG[RDMA_PROV]}" == "mlx5_dv" ]]; then
797daee62a0SAlexey Marchuk		echo "Invalid RDMA provider specified, must be \"verbs\" or \"mlx5_dv\""
798daee62a0SAlexey Marchuk		exit 1
799daee62a0SAlexey Marchuk	fi
800daee62a0SAlexey Marchuk
801eed0c6beSDarek Stojaczyk	if ! echo -e '#include <infiniband/verbs.h>\n#include <rdma/rdma_verbs.h>\n' \
802eed0c6beSDarek Stojaczyk		'int main(void) { return 0; }\n' \
803bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -libverbs -lrdmacm - 2> /dev/null; then
804bb0f78a2SMichal Berger		echo "--with-rdma requires libverbs and librdmacm."
805bb0f78a2SMichal Berger		echo "Please install then re-run this script."
806eed0c6beSDarek Stojaczyk		exit 1
807eed0c6beSDarek Stojaczyk	fi
808eed0c6beSDarek Stojaczyk
809eed0c6beSDarek Stojaczyk	if echo -e '#include <infiniband/verbs.h>\n' \
810eed0c6beSDarek Stojaczyk		'int main(void) { return !!IBV_WR_SEND_WITH_INV; }\n' \
811bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -c - 2> /dev/null; then
812577df16aSPawel Wodkowski		CONFIG[RDMA_SEND_WITH_INVAL]="y"
8137671073bSSeth Howell	else
814577df16aSPawel Wodkowski		CONFIG[RDMA_SEND_WITH_INVAL]="n"
81517a819f8SJim Harris		echo "
8167671073bSSeth Howell*******************************************************************************
8177671073bSSeth HowellWARNING: The Infiniband Verbs opcode Send With Invalidate is either not
8187671073bSSeth Howellsupported or is not functional with the current version of libibverbs installed
8197671073bSSeth Howellon this system. Please upgrade to at least version 1.1.
8207671073bSSeth Howell
8217671073bSSeth HowellBeginning with Linux kernel 4.14, the kernel NVMe-oF initiator leverages Send
8227671073bSSeth HowellWith Invalidate RDMA operations to improve performance. Failing to use the
8237671073bSSeth HowellSend With Invalidate operation on the NVMe-oF target side results in full
8247671073bSSeth Howellfunctionality, but greatly reduced performance. The SPDK NVMe-oF target will
8257671073bSSeth Howellbe unable to leverage that operation using the currently installed version
8267671073bSSeth Howellof libibverbs, so Linux kernel NVMe-oF initiators based on kernels greater
8277671073bSSeth Howellthan or equal to 4.14 will see significantly reduced performance.
82817a819f8SJim Harris*******************************************************************************"
8297671073bSSeth Howell	fi
83094966468SAlexey Marchuk
83194966468SAlexey Marchuk	if echo -e '#include <rdma/rdma_cma.h>\n' \
83294966468SAlexey Marchuk		'int main(void) { return !!RDMA_OPTION_ID_ACK_TIMEOUT; }\n' \
833bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -c - 2> /dev/null; then
83494966468SAlexey Marchuk		CONFIG[RDMA_SET_ACK_TIMEOUT]="y"
83594966468SAlexey Marchuk	else
83694966468SAlexey Marchuk		CONFIG[RDMA_SET_ACK_TIMEOUT]="n"
83794966468SAlexey Marchuk		echo "RDMA_OPTION_ID_ACK_TIMEOUT is not supported"
83894966468SAlexey Marchuk	fi
83994966468SAlexey Marchuk
840daee62a0SAlexey Marchuk	if [ "${CONFIG[RDMA_PROV]}" == "mlx5_dv" ]; then
841daee62a0SAlexey Marchuk		if ! echo -e '#include <spdk/stdinc.h>\n' \
842daee62a0SAlexey Marchuk			'#include <infiniband/mlx5dv.h>\n' \
843daee62a0SAlexey Marchuk			'#include <rdma/rdma_cma.h>\n' \
844daee62a0SAlexey Marchuk			'int main(void) { return rdma_establish(NULL) || ' \
845daee62a0SAlexey Marchuk			'!!IBV_QP_INIT_ATTR_SEND_OPS_FLAGS || !!MLX5_OPCODE_RDMA_WRITE; }\n' \
846bb0f78a2SMichal Berger			| "${BUILD_CMD[@]}" -lmlx5 -I${rootdir}/include -c - 2> /dev/null; then
847daee62a0SAlexey Marchuk			echo "mlx5_dv provider is not supported"
848daee62a0SAlexey Marchuk			exit 1
849daee62a0SAlexey Marchuk		fi
850daee62a0SAlexey Marchuk	fi
851daee62a0SAlexey Marchuk
852bb0f78a2SMichal Berger	echo "Using '${CONFIG[RDMA_PROV]}' RDMA provider"
8537671073bSSeth Howellfi
8547671073bSSeth Howell
855ed56a3d4SAnil Veerabhadrappaif [[ "${CONFIG[FC]}" = "y" ]]; then
856ed56a3d4SAnil Veerabhadrappa	if [[ -n "${CONFIG[FC_PATH]}" ]]; then
857ed56a3d4SAnil Veerabhadrappa		if [ ! -d "${CONFIG[FC_PATH]}" ]; then
858ed56a3d4SAnil Veerabhadrappa			echo "${CONFIG[FC_PATH]}: directory not found"
859ed56a3d4SAnil Veerabhadrappa			exit 1
860ed56a3d4SAnil Veerabhadrappa		fi
861ed56a3d4SAnil Veerabhadrappa	fi
862ed56a3d4SAnil Veerabhadrappafi
863ed56a3d4SAnil Veerabhadrappa
864ce711726SDarek Stojaczykif [[ "${CONFIG[PMDK]}" = "y" ]]; then
865ce711726SDarek Stojaczyk	if ! echo -e '#include <libpmemblk.h>\nint main(void) { return 0; }\n' \
866bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -lpmemblk - 2> /dev/null; then
867bb0f78a2SMichal Berger		echo "--with-pmdk requires libpmemblk."
868bb0f78a2SMichal Berger		echo "Please install then re-run this script."
869ce711726SDarek Stojaczyk		exit 1
870ce711726SDarek Stojaczyk	fi
871ce711726SDarek Stojaczykfi
872ce711726SDarek Stojaczyk
8732a6ddeb8SYuriy Umanetsfunction dpdk_version() {
8742a6ddeb8SYuriy Umanets	# Check DPDK version to determine if mlx5_pci driver is supported
8752a6ddeb8SYuriy Umanets	local dpdk_ver="none"
8762a6ddeb8SYuriy Umanets	if [[ "${CONFIG[DPDK_DIR]}" == "$rootdir/dpdk/build" ]]; then
8772a6ddeb8SYuriy Umanets		# DPDK_DIR points at our submodule so ./build may not exist yet. Use
8782a6ddeb8SYuriy Umanets		# absolute path to lookup the version.
8792a6ddeb8SYuriy Umanets		dpdk_ver=$(< "$rootdir/dpdk/VERSION")
8802a6ddeb8SYuriy Umanets	elif [[ -f "${CONFIG[DPDK_DIR]}"/../VERSION ]]; then
8812a6ddeb8SYuriy Umanets		dpdk_ver=$(< "${CONFIG[DPDK_DIR]}"/../VERSION)
8822a6ddeb8SYuriy Umanets	fi
8832a6ddeb8SYuriy Umanets	echo $dpdk_ver
8842a6ddeb8SYuriy Umanets}
8852a6ddeb8SYuriy Umanets
8862a6ddeb8SYuriy Umanetsfunction mlx5_build() {
8872a6ddeb8SYuriy Umanets	# Check if libmlx5 exists to enable mlx5_pci compress/crypto PMD
8882a6ddeb8SYuriy Umanets	if ! echo -e '#include <spdk/stdinc.h>\n' \
8892a6ddeb8SYuriy Umanets		'#include <infiniband/mlx5dv.h>\n' \
8902a6ddeb8SYuriy Umanets		'#include <infiniband/verbs.h>\n' \
8912a6ddeb8SYuriy Umanets		'int main(void) { return 0; }\n' \
8922a6ddeb8SYuriy Umanets		| "${BUILD_CMD[@]}" -lmlx5 -libverbs -I${rootdir}/include -c - 2> /dev/null; then
8932a6ddeb8SYuriy Umanets		return 1
8942a6ddeb8SYuriy Umanets	fi
8952a6ddeb8SYuriy Umanets	return 0
8962a6ddeb8SYuriy Umanets}
8972a6ddeb8SYuriy Umanets
89897022803SJim Harrisif [[ "${CONFIG[REDUCE]}" = "y" ]]; then
899c4a3b312SDarek Stojaczyk	if ! echo -e '#include <libpmem.h>\nint main(void) { return 0; }\n' \
900bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -lpmem - 2> /dev/null; then
901bb0f78a2SMichal Berger		echo "--with-reduce requires libpmem."
902bb0f78a2SMichal Berger		echo "Please install then re-run this script."
90397022803SJim Harris		exit 1
90497022803SJim Harris	fi
9052a6ddeb8SYuriy Umanets	# Try to enable mlx5 compress
906e71ae467SAlexey Marchuk	CONFIG[REDUCE_MLX5]="y"
9072a6ddeb8SYuriy Umanets
908e71ae467SAlexey Marchuk	# Check if libmlx5 exists to enable mlx5_pci compress PMD
9092a6ddeb8SYuriy Umanets	if ! mlx5_build; then
910e71ae467SAlexey Marchuk		echo "libmlx5 is not found, so disabling DPDK mlx5_pci compress PMD"
911e71ae467SAlexey Marchuk		CONFIG[REDUCE_MLX5]="n"
9122a6ddeb8SYuriy Umanets	else
913e71ae467SAlexey Marchuk		if [[ "${CONFIG[DPDK_PKG_CONFIG]}" = "y" ]]; then
914e71ae467SAlexey Marchuk			# Check if librte_compress_mlx5 exists in DPDK package
915e71ae467SAlexey Marchuk			if [ ! -f "${CONFIG[DPDK_LIB_DIR]}"/librte_compress_mlx5.so ]; then
916e71ae467SAlexey Marchuk				echo "librte_compress_mlx5 is not found, so disabling DPDK mlx5_pci compress PMD"
917e71ae467SAlexey Marchuk				CONFIG[REDUCE_MLX5]="n"
918e71ae467SAlexey Marchuk			fi
919e71ae467SAlexey Marchuk		else
920e71ae467SAlexey Marchuk			# Check DPDK version to determine if mlx5_pci driver is supported
9212a6ddeb8SYuriy Umanets			dpdk_ver=$(dpdk_version)
9222a6ddeb8SYuriy Umanets			if [[ $dpdk_ver = "none" ]]; then
923c2de56b0SMichal Berger				echo "Cannot get DPDK version, so disabling DPDK mlx5_pci compress PMD"
924e71ae467SAlexey Marchuk				CONFIG[REDUCE_MLX5]="n"
9252a6ddeb8SYuriy Umanets			elif [[ -n $dpdk_ver ]] && lt "$dpdk_ver" 21.02.0; then
9262a6ddeb8SYuriy Umanets				# mlx5_pci for compress is supported by DPDK >- 21.02.0
927c2de56b0SMichal Berger				echo "DPDK version ${dpdk_ver} doesn't support mlx5_pci compress PMD"
928c2de56b0SMichal Berger				CONFIG[REDUCE_MLX5]="n"
9292a6ddeb8SYuriy Umanets			elif [[ -n ${CONFIG[DPDK_LIB_DIR]} ]] && [ ! -f "${CONFIG[DPDK_LIB_DIR]}"/librte_compress_mlx5.so ]; then
9302a6ddeb8SYuriy Umanets				# This is only checked when --with-dpdk or --with-dpdk=* is used
9312a6ddeb8SYuriy Umanets				echo "librte_compress_mlx5 is not found, so disabling DPDK mlx5_pci compress PMD"
9322a6ddeb8SYuriy Umanets				CONFIG[REDUCE_MLX5]="n"
9332a6ddeb8SYuriy Umanets			fi
9342a6ddeb8SYuriy Umanets		fi
9352a6ddeb8SYuriy Umanets	fi
9362a6ddeb8SYuriy Umanetsfi
9372a6ddeb8SYuriy Umanets
9382a6ddeb8SYuriy Umanetsif [[ "${CONFIG[CRYPTO]}" = "y" ]]; then
9392a6ddeb8SYuriy Umanets	# Try to enable mlx5 crypto
9402a6ddeb8SYuriy Umanets	CONFIG[CRYPTO_MLX5]="y"
9412a6ddeb8SYuriy Umanets
9422a6ddeb8SYuriy Umanets	# Check if libmlx5 exists to enable mlx5_pci compress PMD
9432a6ddeb8SYuriy Umanets	if ! mlx5_build; then
9442a6ddeb8SYuriy Umanets		echo "libmlx5 is not found, so disabling DPDK mlx5_pci crypto PMD"
9452a6ddeb8SYuriy Umanets		CONFIG[CRYPTO_MLX5]="n"
9462a6ddeb8SYuriy Umanets	else
9472a6ddeb8SYuriy Umanets		if [[ "${CONFIG[DPDK_PKG_CONFIG]}" = "y" ]]; then
9482a6ddeb8SYuriy Umanets			# Check if librte_crypto_mlx5 exists in DPDK package
9492a6ddeb8SYuriy Umanets			if [ ! -f "${CONFIG[DPDK_LIB_DIR]}"/librte_crypto_mlx5.so ]; then
9502a6ddeb8SYuriy Umanets				echo "librte_crypto_mlx5 is not found, so disabling DPDK mlx5_pci crypto PMD"
9512a6ddeb8SYuriy Umanets				CONFIG[CRYPTO_MLX5]="n"
9522a6ddeb8SYuriy Umanets			fi
9532a6ddeb8SYuriy Umanets		else
9542a6ddeb8SYuriy Umanets			# Check DPDK version to determine if mlx5_pci driver is supported
9552a6ddeb8SYuriy Umanets			dpdk_ver=$(dpdk_version)
9562a6ddeb8SYuriy Umanets			if [[ $dpdk_ver = "none" ]]; then
9572a6ddeb8SYuriy Umanets				echo "Cannot get DPDK version, so disabling DPDK mlx5_pci crypto PMD"
9582a6ddeb8SYuriy Umanets				CONFIG[CRYPTO_MLX5]="n"
9598a2fc789SYuriy Umanets			elif [[ -n $dpdk_ver ]] && lt "$dpdk_ver" 21.11.0; then
9608a2fc789SYuriy Umanets				# mlx5_pci for crypto is supported by DPDK >- 21.11.0
9612a6ddeb8SYuriy Umanets				echo "DPDK version ${dpdk_ver} doesn't support mlx5_pci crypto PMD"
9622a6ddeb8SYuriy Umanets				CONFIG[CRYPTO_MLX5]="n"
9632a6ddeb8SYuriy Umanets			elif [[ -n ${CONFIG[DPDK_LIB_DIR]} ]] && [ ! -f "${CONFIG[DPDK_LIB_DIR]}"/librte_crypto_mlx5.so ]; then
9642a6ddeb8SYuriy Umanets				# This is only checked when --with-dpdk or --with-dpdk=* is used
9652a6ddeb8SYuriy Umanets				echo "librte_crypto_mlx5 is not found, so disabling DPDK mlx5_pci crypto PMD"
9662a6ddeb8SYuriy Umanets				CONFIG[CRYPTO_MLX5]="n"
9672a6ddeb8SYuriy Umanets			fi
968e71ae467SAlexey Marchuk		fi
969e269bf4eSAlexey Marchuk	fi
97097022803SJim Harrisfi
97197022803SJim Harris
972805d9942STomasz Kulasekif [[ "${CONFIG[NVME_CUSE]}" = "y" ]]; then
973805d9942STomasz 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' \
974bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -lfuse3 -D_FILE_OFFSET_BITS=64 - 2> /dev/null; then
975bb0f78a2SMichal Berger		echo "--with-cuse requires libfuse3."
976bb0f78a2SMichal Berger		echo "Please install then re-run this script."
977805d9942STomasz Kulasek		exit 1
978805d9942STomasz Kulasek	fi
979805d9942STomasz Kulasekfi
980805d9942STomasz Kulasek
98155bd0d3aSDarek Stojaczykif [[ "${CONFIG[RBD]}" = "y" ]]; then
98255bd0d3aSDarek Stojaczyk	if ! echo -e '#include <rbd/librbd.h>\n#include <rados/librados.h>\n' \
98355bd0d3aSDarek Stojaczyk		'int main(void) { return 0; }\n' \
984bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -lrados -lrbd - 2> /dev/null; then
985bb0f78a2SMichal Berger		echo "--with-rbd requires librados and librbd."
986bb0f78a2SMichal Berger		echo "Please install then re-run this script."
98755bd0d3aSDarek Stojaczyk		exit 1
98855bd0d3aSDarek Stojaczyk	fi
98955bd0d3aSDarek Stojaczykfi
99055bd0d3aSDarek Stojaczyk
9915cb18040SDarek Stojaczykif [[ "${CONFIG[ISCSI_INITIATOR]}" = "y" ]]; then
9925cb18040SDarek Stojaczyk	# Fedora installs libiscsi to /usr/lib64/iscsi for some reason.
9935cb18040SDarek Stojaczyk	if ! echo -e '#include <iscsi/iscsi.h>\n#include <iscsi/scsi-lowlevel.h>\n' \
9945cb18040SDarek Stojaczyk		'#if LIBISCSI_API_VERSION < 20150621\n' \
9955cb18040SDarek Stojaczyk		'#error\n' \
9965cb18040SDarek Stojaczyk		'#endif\n' \
9975cb18040SDarek Stojaczyk		'int main(void) { return 0; }\n' \
998bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -L/usr/lib64/iscsi -liscsi - 2> /dev/null; then
999bb0f78a2SMichal Berger		echo "--with-iscsi-initiator requires libiscsi with"
1000bb0f78a2SMichal Berger		echo "LIBISCSI_API_VERSION >= 20150621."
1001bb0f78a2SMichal Berger		echo "Please install then re-run this script."
10025cb18040SDarek Stojaczyk		exit 1
10035cb18040SDarek Stojaczyk	fi
10045cb18040SDarek Stojaczykfi
10055cb18040SDarek Stojaczyk
10062e283fcbS0xe0fif [[ "${CONFIG[DAOS]}" = "y" ]]; then
1007044bb175SDenis Barakthanov	daos_build_cmd=("${BUILD_CMD[@]}")
1008044bb175SDenis Barakthanov	if [[ -n "${CONFIG[DAOS_DIR]}" ]]; then
1009044bb175SDenis Barakthanov		daos_build_cmd+=(-I"${CONFIG[DAOS_DIR]}"/include -L"${CONFIG[DAOS_DIR]}"/lib64)
1010044bb175SDenis Barakthanov	fi
10112e283fcbS0xe0f	if ! echo -e '#include <daos.h>\n#include <daos_fs.h>\n' \
10122e283fcbS0xe0f		'int main(void) { return 0; }\n' \
1013044bb175SDenis Barakthanov		| "${daos_build_cmd[@]}" -lgurt -ldaos -ldaos_common -ldfs - 2> /dev/null; then
10142e283fcbS0xe0f		echo "--with-daos requires libdaos, libdaos_common, libdfs and libgurt"
10152e283fcbS0xe0f		echo "Please install then re-run this script."
10162e283fcbS0xe0f		exit 1
10172e283fcbS0xe0f	fi
10182e283fcbS0xe0ffi
10192e283fcbS0xe0f
10203674c1d3SDarek Stojaczykif [[ "${CONFIG[ASAN]}" = "y" ]]; then
10213674c1d3SDarek Stojaczyk	if ! echo -e 'int main(void) { return 0; }\n' \
1022bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -fsanitize=address - 2> /dev/null; then
1023bb0f78a2SMichal Berger		echo "--enable-asan requires libasan."
1024bb0f78a2SMichal Berger		echo "Please install then re-run this script."
10253674c1d3SDarek Stojaczyk		exit 1
10263674c1d3SDarek Stojaczyk	fi
10273674c1d3SDarek Stojaczykfi
10283674c1d3SDarek Stojaczyk
10293674c1d3SDarek Stojaczykif [[ "${CONFIG[UBSAN]}" = "y" ]]; then
10303674c1d3SDarek Stojaczyk	if ! echo -e 'int main(void) { return 0; }\n' \
1031bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -fsanitize=undefined - 2> /dev/null; then
1032bb0f78a2SMichal Berger		echo "--enable-ubsan requires libubsan."
1033bb0f78a2SMichal Berger		echo "Please install then re-run this script."
1034bb0f78a2SMichal Berger		echo "If installed, please check that the GCC version is at least 6.4"
1035bb0f78a2SMichal Berger		echo "and synchronize CC accordingly."
10363674c1d3SDarek Stojaczyk		exit 1
10373674c1d3SDarek Stojaczyk	fi
10383674c1d3SDarek Stojaczykfi
10393674c1d3SDarek Stojaczyk
10403674c1d3SDarek Stojaczykif [[ "${CONFIG[TSAN]}" = "y" ]]; then
10413674c1d3SDarek Stojaczyk	if ! echo -e 'int main(void) { return 0; }\n' \
1042bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -fsanitize=thread - 2> /dev/null; then
1043bb0f78a2SMichal Berger		echo "--enable-tsan requires libtsan."
1044bb0f78a2SMichal Berger		echo "Please install then re-run this script."
10453674c1d3SDarek Stojaczyk		exit 1
10463674c1d3SDarek Stojaczyk	fi
10473674c1d3SDarek Stojaczykfi
10483674c1d3SDarek Stojaczyk
104943a3984cSJim Harrisif echo -e '#include <stdlib.h>\nint main(void) { arc4random(); return 0; }\n' \
105043a3984cSJim Harris	| "${BUILD_CMD[@]}" - 2> /dev/null; then
105143a3984cSJim Harris	CONFIG[HAVE_ARC4RANDOM]="y"
105243a3984cSJim Harrisfi
105343a3984cSJim Harris
1054d1fee489SVitaliy Mysakif [[ "${CONFIG[OCF]}" = "y" ]]; then
1055d1fee489SVitaliy Mysak	# If OCF_PATH is a file, assume it is a library and use it to compile with
1056d1fee489SVitaliy Mysak	if [ -f ${CONFIG[OCF_PATH]} ]; then
1057d1fee489SVitaliy Mysak		CONFIG[CUSTOMOCF]=y
1058d1fee489SVitaliy Mysak	else
1059d1fee489SVitaliy Mysak		CONFIG[CUSTOMOCF]=n
1060d1fee489SVitaliy Mysak	fi
1061d1fee489SVitaliy Mysakfi
1062d1fee489SVitaliy Mysak
1063995d60f4SBen Walkerif [[ "${CONFIG[PGO_CAPTURE]}" = "y" && "${CONFIG[PGO_USE]}" = "y" ]]; then
1064995d60f4SBen Walker	echo "ERROR: --enable-pgo-capture and --enable-pgo-use are mutually exclusive."
1065995d60f4SBen Walker	exit 1
1066954728e9SBen Walkerelif [[ "${CONFIG[PGO_USE]}" = "y" ]]; then
1067954728e9SBen Walker	if [[ "$CC_TYPE" = "clang" ]]; then
1068954728e9SBen Walker		# For clang we need to run an extra step on gathered profiling data.
1069954728e9SBen Walker		echo "Generating suitable profile data"
1070954728e9SBen Walker		llvm-profdata merge -output=build/pgo/default.profdata build/pgo
1071954728e9SBen Walker	fi
1072995d60f4SBen Walkerfi
1073995d60f4SBen Walker
10748165bf71SBen Walkerif [[ "${CONFIG[URING]}" = "y" ]]; then
10758165bf71SBen Walker	if [[ -n "${CONFIG[URING_PATH]}" ]]; then
10768165bf71SBen Walker		if [ ! -d "${CONFIG[URING_PATH]}" ]; then
10778165bf71SBen Walker			echo "${CONFIG[URING_PATH]}: directory not found"
10788165bf71SBen Walker			exit 1
10798165bf71SBen Walker		fi
10804ccc9ea3SJim Harris	elif ! echo -e '#include <liburing.h>\nint main(void) { return 0; }\n' \
10814ccc9ea3SJim Harris		| "${BUILD_CMD[@]}" -luring - 2> /dev/null; then
10824ccc9ea3SJim Harris		echo "--with-uring requires liburing."
10834ccc9ea3SJim Harris		echo "Please build and install then re-run this script."
10844ccc9ea3SJim Harris		exit 1
10858165bf71SBen Walker	fi
1086958d196cSIndraneel M	# Support for Zoned devices is enabled by default for Uring bdev. Check appropriate support in kernel.
10878b840195SIndraneel M	if [[ "${CONFIG[URING_ZNS]}" = "y" ]]; then
10888b840195SIndraneel M		if ! echo -e '#include<linux/blkzoned.h>\nint main(void) { return BLK_ZONE_REP_CAPACITY; }\n' \
10898b840195SIndraneel M			| "${BUILD_CMD[@]}" -c - 2> /dev/null; then
1090958d196cSIndraneel M			echo "Disabling Zoned NS support in Uring! Requires blkzoned.h from kernel >= linux-5.9."
1091958d196cSIndraneel M			CONFIG[URING_ZNS]=n
1092958d196cSIndraneel M		fi
10938b840195SIndraneel M	fi
10948b840195SIndraneel Mfi
10958b840195SIndraneel M
10967fa15e28SXiaodong Liuif [[ "${CONFIG[FUSE]}" = "y" ]]; then
10977fa15e28SXiaodong Liu	if [[ ! -d /usr/include/fuse3 ]] && [[ ! -d /usr/local/include/fuse3 ]]; then
10987fa15e28SXiaodong Liu		echo "--with-fuse requires libfuse3."
10997fa15e28SXiaodong Liu		echo "Please install then re-run this script."
11007fa15e28SXiaodong Liu		exit 1
11017fa15e28SXiaodong Liu	fi
11027fa15e28SXiaodong Liufi
11037fa15e28SXiaodong Liu
110491e42257SJim Harrisif [ "${CONFIG[CET]}" = "y" ]; then
1105bb0f78a2SMichal Berger	if ! echo -e 'int main(void) { return 0; }\n' | "${BUILD_CMD[@]}" -fcf-protection - 2> /dev/null; then
1106bb0f78a2SMichal Berger		echo "--enable-cet requires compiler/linker that supports CET."
1107bb0f78a2SMichal Berger		echo "Please install then re-run this script."
110891e42257SJim Harris		exit 1
110991e42257SJim Harris	fi
111091e42257SJim Harrisfi
111191e42257SJim Harris
1112050565e5SJim Harrisif [[ "${CONFIG[FUZZER]}" = "y" && "$CC_TYPE" != "clang" ]]; then
1113050565e5SJim Harris	echo "--with-fuzzer requires setting CC and CXX to clang."
1114050565e5SJim Harris	exit 1
1115050565e5SJim Harrisfi
1116050565e5SJim Harris
1117dd2c08d2Spaul luseif [[ $arch == x86_64* ]] || [[ $arch == aarch64* ]]; then
1118dd2c08d2Spaul luse	CONFIG[ISAL]=y
1119dd2c08d2Spaul luse	# make sure the submodule is initialized
11209d2f6f86SJim Harris	if [ ! -f "$rootdir"/isa-l/autogen.sh ]; then
1121dd2c08d2Spaul luse		echo "ISA-L is required but was not found, please init the submodule with:"
11229d2f6f86SJim Harris		echo "  git submodule update --init"
1123dd2c08d2Spaul luse		echo "and then re-run this script."
11249d2f6f86SJim Harris		exit 1
11259d2f6f86SJim Harris	fi
1126dd2c08d2Spaul luse	# for x86 only, check the nasm version for ISA-L and IPSEC
1127dd2c08d2Spaul luse	if [[ $arch == x86_64* ]]; then
1128dd2c08d2Spaul luse		ver=$(nasm -v 2> /dev/null | awk '{print $3}' | awk -Fr '{print $1}')
1129dd2c08d2Spaul luse		if lt "$ver" 2.14; then
1130dd2c08d2Spaul luse			CONFIG[ISAL]=n
1131dd2c08d2Spaul luse			# IPSEC has nasm requirement and DPDK crypto relies on IPSEC
1132dd2c08d2Spaul luse			CONFIG[IPSEC_MB]=n
1133dd2c08d2Spaul luse			echo "WARNING: ISA-L & DPDK crypto cannot be used as nasm ver must be 2.14 or newer."
1134dd2c08d2Spaul luse		fi
1135dd2c08d2Spaul luse	fi
1136dd2c08d2Spaul luseelse
1137dd2c08d2Spaul luse	# for PPC
1138dd2c08d2Spaul luse	CONFIG[ISAL]=n
1139dd2c08d2Spaul luse	echo "WARNING: ISA-L cannot be used due to architecture incompatibility."
1140dd2c08d2Spaul lusefi
11419d2f6f86SJim Harris
1142dd2c08d2Spaul luse# now either configure ISA-L or disable unavailable features
1143dd2c08d2Spaul luseif [[ "${CONFIG[ISAL]}" = "y" ]]; then
11449d2f6f86SJim Harris	cd $rootdir/isa-l
11459d2f6f86SJim Harris	ISAL_LOG=$rootdir/isa-l/spdk-isal.log
11469d2f6f86SJim Harris	if [[ -n "${CONFIG[CROSS_PREFIX]}" ]]; then
11479d2f6f86SJim Harris		ISAL_OPTS=("--host=${CONFIG[CROSS_PREFIX]}")
11489d2f6f86SJim Harris	else
11499d2f6f86SJim Harris		ISAL_OPTS=()
11509d2f6f86SJim Harris	fi
11519d2f6f86SJim Harris	echo -n "Configuring ISA-L (logfile: $ISAL_LOG)..."
11529d2f6f86SJim Harris	./autogen.sh &> $ISAL_LOG
11539d2f6f86SJim Harris	./configure CFLAGS="-fPIC -g -O2" "${ISAL_OPTS[@]}" --enable-shared=no >> $ISAL_LOG 2>&1
11549d2f6f86SJim Harris	echo "done."
11559d2f6f86SJim Harris	cd $rootdir
1156dd2c08d2Spaul luseelse
1157dd2c08d2Spaul luse	echo "Without ISA-L, there is no software support for crypto or compression,"
1158dd2c08d2Spaul luse	echo "so these features will be disabled."
1159dd2c08d2Spaul luse	CONFIG[CRYPTO]=n
1160dd2c08d2Spaul luse	CONFIG[REDUCE]=n
11619d2f6f86SJim Harrisfi
11629d2f6f86SJim Harris
1163509241ceSKonrad Sztyberif [[ "${CONFIG[SMA]}" = "y" ]]; then
1164509241ceSKonrad Sztyber	if ! python3 -c 'import grpc; import grpc_tools' 2> /dev/null; then
1165509241ceSKonrad Sztyber		echo "--with-sma requires grpcio and grpcio-tools python packages."
1166509241ceSKonrad Sztyber		echo "Please install then re-run this script."
1167509241ceSKonrad Sztyber		exit 1
1168509241ceSKonrad Sztyber	fi
1169509241ceSKonrad Sztyberfi
1170509241ceSKonrad Sztyber
1171fcc38949SRui Chang# For ARM Neoverse-N1 platform, debug build needs gcc version newer than 8.4
1172fcc38949SRui Changif [[ "${CONFIG[DEBUG]}" = "y" && $arch = aarch64* && "$CC_TYPE" = "gcc" ]]; then
1173fcc38949SRui Chang	GCC_VERSION=$($CC -dumpfullversion)
1174fcc38949SRui Chang	PART_NUM=$(grep -i -m 1 "CPU part" /proc/cpuinfo | awk '{print $4}')
1175fcc38949SRui Chang
1176fcc38949SRui Chang	if [[ "$(printf '%s\n' "8.4.0" "$GCC_VERSION" | sort -V | head -n1)" != "8.4.0" ]]; then
1177fcc38949SRui Chang		if [[ $PART_NUM = 0xd0c ]]; then
1178fcc38949SRui Chang			echo "WARNING: For ARM Neoverse-N1 platform, debug build needs GCC version newer than 8.4."
1179fcc38949SRui Chang			echo "         Will work around this by using armv8.2-a+crypto as target architecture for now."
1180fcc38949SRui Chang			CONFIG[ARCH]=armv8.2-a+crypto
1181*e8f84531SSunil Shahu		elif [[ $PART_NUM = 0x0b2 ]]; then
1182*e8f84531SSunil Shahu			echo "WARNING: For ARM octeontx2 platform, debug build needs GCC version newer than 8.4."
1183*e8f84531SSunil Shahu			echo "         Will work around this by using armv8.2-a+crypto as target architecture for now."
1184*e8f84531SSunil Shahu			CONFIG[ARCH]=armv8.2-a+crypto
1185fcc38949SRui Chang		fi
1186fcc38949SRui Chang	fi
1187fcc38949SRui Changfi
1188fcc38949SRui Chang
118948f70f48SPawel Wodkowski# We are now ready to generate final configuration. But first do sanity
119048f70f48SPawel Wodkowski# check to see if all keys in CONFIG array have its reflection in CONFIG file.
1191bb0f78a2SMichal Bergerif (($(grep -cE "^\s*CONFIG_[[:alnum:]_]+=" "$rootdir/CONFIG") != ${#CONFIG[@]})); then
119248f70f48SPawel Wodkowski	echo ""
119348f70f48SPawel Wodkowski	echo "BUG: Some configuration options are not present in CONFIG file. Please update this file."
119448f70f48SPawel Wodkowski	echo "Missing options in CONFIG (+) file and in current config (-): "
119548f70f48SPawel Wodkowski	diff -u --label "CONFIG file" --label "CONFIG[@]" \
1196f8d6541dSMichal Berger		<(sed -r -e '/^[[:space:]]*$/d; /^[[:space:]]*#.*/d; s/(CONFIG_[[:alnum:]_]+)=.*/\1/g' CONFIG | sort) \
1197bb0f78a2SMichal Berger		<(printf "CONFIG_%s\n" "${!CONFIG[@]}" | sort)
119848f70f48SPawel Wodkowski	exit 1
119948f70f48SPawel Wodkowskifi
120048f70f48SPawel Wodkowski
120185bc2bbeSPawel Wodkowskiecho -n "Creating mk/config.mk..."
1202e62a3c65SSeth Howellcp -f $rootdir/CONFIG $rootdir/mk/config.mk
120351ab849bSJim HarrisARGS=$(echo "$@" | sed 's/ /\\ /g')
120451ab849bSJim Harrissed -i.bak -r "s#__CONFIGURE_OPTIONS__#${ARGS}#g" $rootdir/mk/config.mk
1205bb0f78a2SMichal Bergerfor key in "${!CONFIG[@]}"; do
1206f8d6541dSMichal Berger	sed -i.bak -r "s#[[:space:]]*CONFIG_${key}=.*#CONFIG_${key}\?=${CONFIG[$key]}#g" $rootdir/mk/config.mk
1207577df16aSPawel Wodkowskidone
1208577df16aSPawel Wodkowski# On FreeBSD sed -i 'SUFFIX' - SUFFIX is mandatory. So no way but to delete the backed file.
1209e62a3c65SSeth Howellrm -f $rootdir/mk/config.mk.bak
1210baa6eac0SDarek Stojaczykecho "done."
12119dd998cdSBen Walker
121208ec96ebSDaniel Verkamp# Environment variables
1213baa6eac0SDarek Stojaczykecho -n "Creating mk/cc.flags.mk..."
1214e62a3c65SSeth Howellrm -f $rootdir/mk/cc.flags.mk
1215e62a3c65SSeth Howell[ -n "$CFLAGS" ] && echo "CFLAGS?=$CFLAGS" > $rootdir/mk/cc.flags.mk
1216e62a3c65SSeth Howell[ -n "$CXXFLAGS" ] && echo "CXXFLAGS?=$CXXFLAGS" >> $rootdir/mk/cc.flags.mk
1217e62a3c65SSeth Howell[ -n "$LDFLAGS" ] && echo "LDFLAGS?=$LDFLAGS" >> $rootdir/mk/cc.flags.mk
1218e62a3c65SSeth Howell[ -n "$DESTDIR" ] && echo "DESTDIR?=$DESTDIR" >> $rootdir/mk/cc.flags.mk
12190b56a5b4SJim Harrisecho "done."
122085bc2bbeSPawel Wodkowski
1221db3ebfe6SMichal Berger# Create .sh with build config for easy sourcing|lookup during the tests.
1222db3ebfe6SMichal Bergerfor conf in "${!CONFIG[@]}"; do
1223db3ebfe6SMichal Berger	echo "CONFIG_$conf=${CONFIG[$conf]}"
1224db3ebfe6SMichal Bergerdone > "$rootdir/test/common/build_config.sh"
1225db3ebfe6SMichal Berger
12265a764955SMichal Bergerif [[ $sys_name == "FreeBSD" ]]; then
1227870ce250SPaul Luse	echo "Type 'gmake' to build."
1228870ce250SPaul Luseelse
12290b56a5b4SJim Harris	echo "Type 'make' to build."
1230870ce250SPaul Lusefi
12319dd998cdSBen Walker
12329dd998cdSBen Walkerexit 0
1233