xref: /spdk/configure (revision c9b4654bd41a7ea95c08df35b43839aa9cb51df4)
19dd998cdSBen Walker#!/usr/bin/env bash
2eb53c232Spaul luse#  SPDX-License-Identifier: BSD-3-Clause
3eb53c232Spaul luse#  Copyright (C) 2017 Intel Corporation
4eb53c232Spaul luse#  All rights reserved.
5eb53c232Spaul luse#
69dd998cdSBen Walker
79dd998cdSBen Walkerset -e
89dd998cdSBen Walker
914bbde7bSPawel Wodkowskitrap 'echo -e "\n\nConfiguration failed\n\n" >&2' ERR
1014bbde7bSPawel Wodkowski
11e62a3c65SSeth Howellrootdir=$(readlink -f $(dirname $0))
1265ed6034SMichal Bergersource "$rootdir/scripts/common.sh"
13e62a3c65SSeth Howell
145ccabc8fSMichal Bergerfunction usage() {
159dd998cdSBen Walker	echo "'configure' configures SPDK to compile on supported platforms."
169dd998cdSBen Walker	echo ""
179dd998cdSBen Walker	echo "Usage: ./configure [OPTION]..."
189dd998cdSBen Walker	echo ""
199dd998cdSBen Walker	echo "Defaults for the options are specified in brackets."
209dd998cdSBen Walker	echo ""
219dd998cdSBen Walker	echo "General:"
229dd998cdSBen Walker	echo " -h, --help                Display this help and exit"
232e7fe8e8SDaniel Verkamp	echo ""
242e7fe8e8SDaniel Verkamp	echo " --prefix=path             Configure installation prefix (default: /usr/local)"
250e6ddfd6SBen Walker	echo " --target-arch=arch        Target build architecture. Must be a valid GNU arch. Default: native"
262e7fe8e8SDaniel Verkamp	echo ""
273def834cSAmelia Blachuciak	echo " --cross-prefix=prefix     Prefix for cross compilation (default: none)"
283def834cSAmelia Blachuciak	echo "                           example: aarch64-linux-gnu"
29e8863cb7SMichal Berger	echo " --libdir=path             Configure installation path for the libraries (default: \$prefix/lib)"
303def834cSAmelia Blachuciak	echo ""
319dd998cdSBen Walker	echo " --enable-debug            Configure for debug builds"
329dd998cdSBen Walker	echo " --enable-werror           Treat compiler warnings as errors"
339dd998cdSBen Walker	echo " --enable-asan             Enable address sanitizer"
349dd998cdSBen Walker	echo " --enable-ubsan            Enable undefined behavior sanitizer"
359dd998cdSBen Walker	echo " --enable-coverage         Enable code coverage tracking"
366d6d1161SDaniel Verkamp	echo " --enable-lto              Enable link-time optimization"
37995d60f4SBen Walker	echo " --enable-pgo-capture      Enable generation of profile guided optimization data"
38995d60f4SBen Walker	echo " --enable-pgo-use          Use previously captured profile guided optimization data"
3991e42257SJim Harris	echo " --enable-cet              Enable Intel Control-flow Enforcement Technology (CET)"
409fcb1cb0STomasz Zawadzki	echo " --disable-tests           Disable building of functional tests"
419fcb1cb0STomasz Zawadzki	echo " --disable-unit-tests      Disable building of unit tests"
429b2c6452SJacek Kalwas	echo " --disable-examples        Disable building of examples"
43119158cdSRajarshi Chowdhury	echo " --disable-apps            Disable building of apps"
449dd998cdSBen Walker	echo ""
459dd998cdSBen Walker	echo "Specifying Dependencies:"
469dd998cdSBen Walker	echo "--with-DEPENDENCY[=path]   Use the given dependency. Optionally, provide the"
479dd998cdSBen Walker	echo "                           path."
489dd998cdSBen Walker	echo "--without-DEPENDENCY       Do not link to the given dependency. This may"
499dd998cdSBen Walker	echo "                           disable features and components."
509dd998cdSBen Walker	echo ""
519dd998cdSBen Walker	echo "Valid dependencies are listed below."
522bc71094SMichal Berger	echo " --with-dpdk[=DIR]         Build against a custom dpdk version. By default, the dpdk"
532bc71094SMichal Berger	echo " --without-dpdk            submodule in spdk tree will be used."
549dd998cdSBen Walker	echo "                           example: /usr/share/dpdk/x86_64-default-linuxapp-gcc"
552bc71094SMichal Berger	echo " --with-env=DIR            Use an alternate environment implementation instead of DPDK."
5606cc8045SBen Walker	echo "                           Implies --without-dpdk."
572bc71094SMichal Berger	echo " --with-idxd               Build the IDXD library and accel framework plug-in module."
582bc71094SMichal Berger	echo " --without-idxd            Disabled while experimental. Only built for x86 when enabled."
592bc71094SMichal Berger	echo " --with-crypto             Build vbdev crypto module."
602bc71094SMichal Berger	echo " --without-crypto          No path required."
612bc71094SMichal Berger	echo " --with-fio[=DIR]          Build fio_plugin."
622bc71094SMichal Berger	echo " --without-fio             default: /usr/src/fio"
636f338d4bSKrishna Kanth Reddy	echo " --with-xnvme              Build xNVMe bdev module."
646f338d4bSKrishna Kanth Reddy	echo " --without-xnvme           No path required."
652bc71094SMichal Berger	echo " --with-vhost              Build vhost target. Enabled by default."
662bc71094SMichal Berger	echo " --without-vhost           No path required."
672bc71094SMichal Berger	echo " --with-virtio             Build vhost initiator and virtio-pci bdev modules."
682bc71094SMichal Berger	echo " --without-virtio          No path required."
69e50ade31SChangpeng Liu	echo " --with-vfio-user[=DIR]    Build custom vfio-user transport for NVMf target and vfio-user target."
70e50ade31SChangpeng Liu	echo "                           vfio-user initiator is always built-in in Linux."
712f731c63SGangCao	echo "                           example: /usr/src/libvfio-user"
722f731c63SGangCao	echo " --without-vfio-user       No path required."
73ebf077cbSyidong0635	echo " --with-pmdk[=DIR]         Build persistent memory bdev.
74ebf077cbSyidong0635					 example: /usr/share/pmdk"
75ebf077cbSyidong0635	echo " --without-pmdk		 No path required."
7619e2dc38Spaul luse	echo " --with-vbdev-compress     Build vbdev compression module and dependencies."
7719e2dc38Spaul luse	echo " --without-vbdev-compress  No path required."
782bc71094SMichal Berger	echo " --with-rbd                Build Ceph RBD bdev module."
792bc71094SMichal Berger	echo " --without-rbd             No path required."
802bc71094SMichal Berger	echo " --with-rdma[=DIR]         Build RDMA transport for NVMf target and initiator."
812bc71094SMichal Berger	echo " --without-rdma            Accepts optional RDMA provider name. Can be \"verbs\" or \"mlx5_dv\"."
82daee62a0SAlexey Marchuk	echo "                           If no provider specified, \"verbs\" provider is used by default."
832bc71094SMichal Berger	echo " --with-fc[=DIR]           Build FC transport for NVMf target."
842bc71094SMichal Berger	echo " --without-fc              If an argument is provided, it is considered a directory containing"
85ed56a3d4SAnil Veerabhadrappa	echo "                           libufc.a and fc_lld.h. Otherwise the regular system paths will"
86ed56a3d4SAnil Veerabhadrappa	echo "                           be searched."
87044bb175SDenis Barakthanov	echo " --with-daos[=DIR]         Build DAOS bdev module."
882e283fcbS0xe0f	echo " --without-daos            No path required."
892bc71094SMichal Berger	echo " --with-shared             Build spdk shared libraries."
902bc71094SMichal Berger	echo " --without-shared          No path required."
912bc71094SMichal Berger	echo " --with-iscsi-initiator    Build with iscsi bdev module."
922bc71094SMichal Berger	echo " --without-iscsi-initiator No path required."
932bc71094SMichal Berger	echo " --with-vtune=DIR          Required to profile I/O under Intel VTune Amplifier XE."
942bc71094SMichal Berger	echo " --without-vtune           example: /opt/intel/vtune_amplifier_xe_version"
952bc71094SMichal Berger	echo " --with-ocf[=DIR]          Build OCF library and bdev module."
962bc71094SMichal Berger	echo " --without-ocf             If argument is directory, interpret it as root of OCF repo"
97d1fee489SVitaliy Mysak	echo "                           If argument is file, interpret it as compiled OCF lib"
9898d60de6SPiotr Pelplinski	echo "                           If no argument is specified, OCF git submodule is used by default"
99d1fee489SVitaliy Mysak	echo "                           example: /usr/src/ocf/"
1002bc71094SMichal Berger	echo " --with-uring[=DIR]        Build I/O uring bdev or socket module."
1012bc71094SMichal Berger	echo " --without-uring           If an argument is provided, it is considered a directory containing"
102161c88a0SDarek Stojaczyk	echo "                           liburing.a and io_uring.h. Otherwise the regular system paths will"
103161c88a0SDarek Stojaczyk	echo "                           be searched."
104958d196cSIndraneel M	echo " --without-uring-zns       Build I/O uring module without ZNS (zoned namespaces) support."
10534192459SBoris Glimcher	echo " --with-openssl[=DIR]      Build OPENSSL with custom path. Otherwise the regular system paths will"
10634192459SBoris Glimcher	echo "                           be searched."
1072bc71094SMichal Berger	echo " --with-fuse               Build FUSE components for mounting a blobfs filesystem."
1082bc71094SMichal Berger	echo " --without-fuse            No path required."
1092bc71094SMichal Berger	echo " --with-nvme-cuse          Build NVMe driver with support for CUSE-based character devices."
1102bc71094SMichal Berger	echo " --without-nvme-cuse       No path required."
11183a4b155SArtur Paszkiewicz	echo " --with-raid5f             Build with bdev_raid module RAID5f support."
11283a4b155SArtur Paszkiewicz	echo " --without-raid5f          No path required."
1132bc71094SMichal Berger	echo " --with-wpdk=DIR           Build using WPDK to provide support for Windows (experimental)."
1142bc71094SMichal Berger	echo " --without-wpdk            The argument must be a directory containing lib and include."
1152bc71094SMichal Berger	echo " --with-usdt               Build with userspace DTrace probes enabled."
1162bc71094SMichal Berger	echo " --without-usdt            No path required."
117050565e5SJim Harris	echo " --with-fuzzer             Build with LLVM fuzzing enabled."
118050565e5SJim Harris	echo "                           Path to clang_rt.fuzzer_no_main library required."
119050565e5SJim Harris	echo "                           Requires setting CC and CXX to clang."
120050565e5SJim Harris	echo "                           (Typically /usr/lib/llvm-VER/lib/clang/VER/lib/linux/libclang_rt.fuzzer_no_main-ARCH.a)"
121509241ceSKonrad Sztyber	echo " --with-sma                Generate Storage Management Agent's protobuf interface"
122509241ceSKonrad Sztyber	echo " --without-sma             No path required."
1239dd998cdSBen Walker	echo ""
12408ec96ebSDaniel Verkamp	echo "Environment variables:"
12508ec96ebSDaniel Verkamp	echo ""
12673439e6fSBen Walker	echo "CC                         C compiler"
12708ec96ebSDaniel Verkamp	echo "CFLAGS                     C compiler flags"
12873439e6fSBen Walker	echo "CXX                        C++ compiler"
12908ec96ebSDaniel Verkamp	echo "CXXFLAGS                   C++ compiler flags"
13073439e6fSBen Walker	echo "LD                         Linker"
13108ec96ebSDaniel Verkamp	echo "LDFLAGS                    Linker flags"
13208ec96ebSDaniel Verkamp	echo "DESTDIR                    Destination for 'make install'"
13308ec96ebSDaniel Verkamp	echo ""
1349dd998cdSBen Walker}
1359dd998cdSBen Walker
136577df16aSPawel Wodkowski# Load default values
137ff238359SJosh Soref# Convert config to sourceable configuration file
138e62a3c65SSeth Howellsed -r 's/CONFIG_([[:alnum:]_]+)=(.*)/CONFIG[\1]=\2/g' $rootdir/CONFIG > $rootdir/CONFIG.sh
139577df16aSPawel Wodkowskideclare -A CONFIG
140e62a3c65SSeth Howellsource $rootdir/CONFIG.sh
141e62a3c65SSeth Howellrm $rootdir/CONFIG.sh
142577df16aSPawel Wodkowski
14311a5716dSMichal Berger# Try to expand literal ~ that might have been passed as an option via --long-opt=~/dir.
14411a5716dSMichal Bergerset -- "${@//\~/~}"
14511a5716dSMichal Berger
1464d2e26d8STomasz Zawadzkifor i in "$@"; do
1474d2e26d8STomasz Zawadzki	case "$i" in
1484d2e26d8STomasz Zawadzki		--cross-prefix=*)
1494d2e26d8STomasz Zawadzki			CONFIG[CROSS_PREFIX]="${i#*=}"
1504d2e26d8STomasz Zawadzki			;;
1514d2e26d8STomasz Zawadzki		--enable-lto)
1524d2e26d8STomasz Zawadzki			CONFIG[LTO]=y
1534d2e26d8STomasz Zawadzki			;;
1544d2e26d8STomasz Zawadzki		--disable-lto)
1554d2e26d8STomasz Zawadzki			CONFIG[LTO]=n
1564d2e26d8STomasz Zawadzki			;;
1574d2e26d8STomasz Zawadzki	esac
1584d2e26d8STomasz Zawadzkidone
1594d2e26d8STomasz Zawadzki
160873c8748STomasz Kulasek# Detect the compiler toolchain
161873c8748STomasz Kulasek$rootdir/scripts/detect_cc.sh --cc="$CC" --cxx="$CXX" --lto="${CONFIG[LTO]}" --ld="$LD" --cross-prefix="${CONFIG[CROSS_PREFIX]}" > $rootdir/mk/cc.mk
162873c8748STomasz Kulasek
163bb0f78a2SMichal BergerCC=$(grep "DEFAULT_CC=" "$rootdir/mk/cc.mk" | sed s/DEFAULT_CC=//)
164bb0f78a2SMichal BergerCC_TYPE=$(grep "CC_TYPE=" "$rootdir/mk/cc.mk" | cut -d "=" -f 2)
165873c8748STomasz Kulasek
166873c8748STomasz Kulasekarch=$($CC -dumpmachine)
1675a764955SMichal Bergersys_name=$(uname -s)
168873c8748STomasz Kulasek
1699854c138SNick Connollyif [[ $arch == *mingw* ]] || [[ $arch == *windows* ]]; then
1709854c138SNick Connolly	sys_name=Windows
1719854c138SNick Connollyfi
1729854c138SNick Connolly
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
1801723a800SGangCaofunction check_dir() {
1811723a800SGangCao	arg="$1"
1821723a800SGangCao	dir="${arg#*=}"
1831723a800SGangCao	if [ ! -d "$dir" ]; then
1841723a800SGangCao		echo "$arg: directory not found"
1851723a800SGangCao		exit 1
1861723a800SGangCao	fi
1871723a800SGangCao}
1881723a800SGangCao
1897b04eb72SYuriy Umanets# On x86_64 'clang -dumpmachine' produces x86_64-pc-linux-gnu
1907b04eb72SYuriy Umanets# whereas the dpdk might be built with gcc and its libs lie in
1917b04eb72SYuriy Umanets# x86_64-linux-gnu. Let's find the right libdir for dpdkd libs.
1927b04eb72SYuriy Umanetsfunction find_dpdk_arch_libdir() {
1937b04eb72SYuriy Umanets	local dpdk_dir=$1
1947b04eb72SYuriy Umanets
1957b04eb72SYuriy Umanets	# Checking first what we have with $arch, then clang
1967b04eb72SYuriy Umanets	# variant of arch.
1977b04eb72SYuriy Umanets	arches=("$arch" "$(echo $arch | sed 's/-pc//g')")
1987b04eb72SYuriy Umanets	for a in "${arches[@]}"; do
1997b04eb72SYuriy Umanets		local libdir="$dpdk_dir/lib/$a"
2007b04eb72SYuriy Umanets		if [[ -d $libdir ]]; then
2017b04eb72SYuriy Umanets			echo $libdir
2027b04eb72SYuriy Umanets			return
2037b04eb72SYuriy Umanets		fi
2047b04eb72SYuriy Umanets	done
2057b04eb72SYuriy Umanets
2067b04eb72SYuriy Umanets	# Fallback to the libdir without arch component
2077b04eb72SYuriy Umanets	echo "$dpdk_dir/lib"
2087b04eb72SYuriy Umanets}
2097b04eb72SYuriy Umanets
210f1980244SYuriy Umanetsfunction check_IPSec_mb() {
211f1980244SYuriy Umanets	local mode=$1
212f1980244SYuriy Umanets	local dpdk_libdir=$2
213f1980244SYuriy Umanets	local dpdk_incdir=$3
214f1980244SYuriy Umanets	local have_ipsec_mb=n
215f1980244SYuriy Umanets
216f1980244SYuriy Umanets	if [[ $mode = "pkg-config" ]]; then
217f1980244SYuriy Umanets		local dpdk_libs
218f1980244SYuriy Umanets
219f1980244SYuriy Umanets		# Request libdpdk pkg-config settings to figure out if the IPSec_MB is used
220f1980244SYuriy Umanets		# as a dependency.
221f1980244SYuriy Umanets		# Due to some reason pkg-config shows -lIPSec_MB only with --static option
222f13ec525SKarol Latecki		dpdk_libs=$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --libs --static libdpdk)
223f1980244SYuriy Umanets		if echo "$dpdk_libs" | grep "\-lIPSec_MB" > /dev/null 2>&1; then
224f1980244SYuriy Umanets			have_ipsec_mb=y
225f1980244SYuriy Umanets		fi
226f1980244SYuriy Umanets	elif [[ $mode = "build-config" ]]; then
227f1980244SYuriy Umanets		# Use dpdk build config header to check if the IPSec_MB was used.
228f1980244SYuriy Umanets		if grep -F "define RTE_CRYPTO_IPSEC_MB 1" "$dpdk_incdir/rte_build_config.h" > /dev/null 2>&1; then
229f1980244SYuriy Umanets			have_ipsec_mb=y
230f1980244SYuriy Umanets		fi
231f1980244SYuriy Umanets	else
232f1980244SYuriy Umanets		echo "ERROR: Invalid IPSec_MB checking mode $mode."
233f1980244SYuriy Umanets		echo "ERROR: Only \"pkg-config\" and \"build-config\" available."
234f1980244SYuriy Umanets		exit 1
235f1980244SYuriy Umanets	fi
236f1980244SYuriy Umanets	if [[ $have_ipsec_mb = "n" ]]; then
237f1980244SYuriy Umanets		CONFIG[IPSEC_MB]=n
238f1980244SYuriy Umanets		return
239f1980244SYuriy Umanets	fi
240f1980244SYuriy Umanets
241f1980244SYuriy Umanets	# Since we don't know the library path where the IPSec_MB is located
242f1980244SYuriy Umanets	# let's find it out with the ldd utility. This can be a standard location
243f1980244SYuriy Umanets	# or a custom build.
244f1980244SYuriy Umanets	local librte_crypto_ipsec_mb="$dpdk_libdir/librte_crypto_ipsec_mb.so"
245f1980244SYuriy Umanets	if [[ -f "$librte_crypto_ipsec_mb" ]]; then
246f1980244SYuriy Umanets		local ipsec_mb_libdir
247f1980244SYuriy Umanets
248f1980244SYuriy Umanets		ipsec_mb_libdir=$(ldd "$librte_crypto_ipsec_mb" | grep "libIPSec_MB.so" \
249f1980244SYuriy Umanets			| sed -e 's/\s*libIPSec_MB.so.*=>\s//' -e 's/\/libIPSec_MB.so.*$//')
250f1980244SYuriy Umanets		if [[ -d $ipsec_mb_libdir ]]; then
251f1980244SYuriy Umanets			CONFIG[IPSEC_MB]=y
252f1980244SYuriy Umanets			CONFIG[IPSEC_MB_DIR]="$ipsec_mb_libdir"
253f1980244SYuriy Umanets		elif [[ $ipsec_mb_libdir = "not found" ]]; then
254f1980244SYuriy Umanets			# ldconfig cache is broken, old build with refs to non-existing libs, etc.
255f1980244SYuriy Umanets			echo "ERROR: Invalid IPSec_MB installation. Library is not found and/or ldconfig cache is broken!"
256f1980244SYuriy Umanets			exit 1
257f1980244SYuriy Umanets		else
258f1980244SYuriy Umanets			# Failed to check for IPSec_MB lib path. Let's just assume it is lives
259f1980244SYuriy Umanets			# in one of the standard locations (/usr/lib, etc.).
260f1980244SYuriy Umanets			CONFIG[IPSEC_MB]=y
261f1980244SYuriy Umanets		fi
262f1980244SYuriy Umanets	else
263f1980244SYuriy Umanets		# pkg-config says there is IPSec_mb and dpdk lib does not have it. Let's just
264f1980244SYuriy Umanets		# assume it is installed in the system in one of the standard locations.
265f1980244SYuriy Umanets		CONFIG[IPSEC_MB]=y
266f1980244SYuriy Umanets	fi
267f1980244SYuriy Umanets}
268f1980244SYuriy Umanets
2699dd998cdSBen Walkerfor i in "$@"; do
2709dd998cdSBen Walker	case "$i" in
2719dd998cdSBen Walker		-h | --help)
2729dd998cdSBen Walker			usage
2739dd998cdSBen Walker			exit 0
2749dd998cdSBen Walker			;;
2754d2e26d8STomasz Zawadzki		--cross-prefix=*) ;&
2764d2e26d8STomasz Zawadzki		--enable-lto) ;&
2774d2e26d8STomasz Zawadzki		--disable-lto)
2784d2e26d8STomasz Zawadzki			# Options handled before detecting CC.
2794d2e26d8STomasz Zawadzki			;;
2802e7fe8e8SDaniel Verkamp		--prefix=*)
281577df16aSPawel Wodkowski			CONFIG[PREFIX]="${i#*=}"
2822e7fe8e8SDaniel Verkamp			;;
2830e6ddfd6SBen Walker		--target-arch=*)
2840e6ddfd6SBen Walker			CONFIG[ARCH]="${i#*=}"
2850e6ddfd6SBen Walker			;;
286e8863cb7SMichal Berger		--libdir=*)
287e8863cb7SMichal Berger			CONFIG[LIBDIR]="${i#*=}"
288e8863cb7SMichal Berger			;;
2899dd998cdSBen Walker		--enable-debug)
290577df16aSPawel Wodkowski			CONFIG[DEBUG]=y
2919dd998cdSBen Walker			;;
2929dd998cdSBen Walker		--disable-debug)
293577df16aSPawel Wodkowski			CONFIG[DEBUG]=n
2949dd998cdSBen Walker			;;
2959dd998cdSBen Walker		--enable-asan)
296577df16aSPawel Wodkowski			CONFIG[ASAN]=y
2979dd998cdSBen Walker			;;
2989dd998cdSBen Walker		--disable-asan)
299577df16aSPawel Wodkowski			CONFIG[ASAN]=n
3009dd998cdSBen Walker			;;
3019dd998cdSBen Walker		--enable-ubsan)
302577df16aSPawel Wodkowski			CONFIG[UBSAN]=y
3039dd998cdSBen Walker			;;
3049dd998cdSBen Walker		--disable-ubsan)
305577df16aSPawel Wodkowski			CONFIG[UBSAN]=n
3069dd998cdSBen Walker			;;
307830912e2SBen Walker		--enable-tsan)
308577df16aSPawel Wodkowski			CONFIG[TSAN]=y
309830912e2SBen Walker			;;
310830912e2SBen Walker		--disable-tsan)
311577df16aSPawel Wodkowski			CONFIG[TSAN]=n
312830912e2SBen Walker			;;
3139dd998cdSBen Walker		--enable-coverage)
314577df16aSPawel Wodkowski			CONFIG[COVERAGE]=y
3159dd998cdSBen Walker			;;
3169dd998cdSBen Walker		--disable-coverage)
317577df16aSPawel Wodkowski			CONFIG[COVERAGE]=n
3189dd998cdSBen Walker			;;
319995d60f4SBen Walker		--enable-pgo-capture)
320995d60f4SBen Walker			CONFIG[PGO_CAPTURE]=y
321995d60f4SBen Walker			;;
322995d60f4SBen Walker		--disable-pgo-capture)
323995d60f4SBen Walker			CONFIG[PGO_CAPTURE]=n
324995d60f4SBen Walker			;;
325995d60f4SBen Walker		--enable-pgo-use)
326995d60f4SBen Walker			CONFIG[PGO_USE]=y
327995d60f4SBen Walker			;;
328995d60f4SBen Walker		--disable-pgo-use)
329995d60f4SBen Walker			CONFIG[PGO_USE]=n
330995d60f4SBen Walker			;;
3319022a59eSDaniel Verkamp		--enable-tests)
332577df16aSPawel Wodkowski			CONFIG[TESTS]=y
3339022a59eSDaniel Verkamp			;;
3349022a59eSDaniel Verkamp		--disable-tests)
335577df16aSPawel Wodkowski			CONFIG[TESTS]=n
3369022a59eSDaniel Verkamp			;;
3379fcb1cb0STomasz Zawadzki		--enable-unit-tests)
3389fcb1cb0STomasz Zawadzki			CONFIG[UNIT_TESTS]=y
3399fcb1cb0STomasz Zawadzki			;;
3409fcb1cb0STomasz Zawadzki		--disable-unit-tests)
3419fcb1cb0STomasz Zawadzki			CONFIG[UNIT_TESTS]=n
3429fcb1cb0STomasz Zawadzki			;;
3439b2c6452SJacek Kalwas		--enable-examples)
3449b2c6452SJacek Kalwas			CONFIG[EXAMPLES]=y
3459b2c6452SJacek Kalwas			;;
3469b2c6452SJacek Kalwas		--disable-examples)
3479b2c6452SJacek Kalwas			CONFIG[EXAMPLES]=n
3489b2c6452SJacek Kalwas			;;
349119158cdSRajarshi Chowdhury		--enable-apps)
350119158cdSRajarshi Chowdhury			CONFIG[APPS]=y
351119158cdSRajarshi Chowdhury			;;
352119158cdSRajarshi Chowdhury		--disable-apps)
353119158cdSRajarshi Chowdhury			CONFIG[APPS]=N
354119158cdSRajarshi Chowdhury			;;
3559dd998cdSBen Walker		--enable-werror)
356577df16aSPawel Wodkowski			CONFIG[WERROR]=y
3579dd998cdSBen Walker			;;
3589dd998cdSBen Walker		--disable-werror)
359577df16aSPawel Wodkowski			CONFIG[WERROR]=n
3609dd998cdSBen Walker			;;
36191e42257SJim Harris		--enable-cet)
36291e42257SJim Harris			CONFIG[CET]=y
36391e42257SJim Harris			;;
36491e42257SJim Harris		--disable-cet)
36591e42257SJim Harris			CONFIG[CET]=n
36691e42257SJim Harris			;;
3677232c450SMichal Berger		--with-dpdk)
3687b04eb72SYuriy Umanets			# Can we use pkg-config?
3697b04eb72SYuriy Umanets			if command -v "pkg-config" > /dev/null 2>&1 && pkg-config --exists libdpdk; then
3707b04eb72SYuriy Umanets				dpdk_libdir=$(pkg-config --variable=libdir libdpdk)
3717b04eb72SYuriy Umanets				dpdk_libdir=$(readlink -f $dpdk_libdir)
3727b04eb72SYuriy Umanets				dpdk_incdir=$(pkg-config --variable=includedir libdpdk)
3737b04eb72SYuriy Umanets				echo "Using DPDK lib dir $dpdk_libdir"
3747b04eb72SYuriy Umanets				CONFIG[DPDK_LIB_DIR]=$dpdk_libdir
3757b04eb72SYuriy Umanets				CONFIG[DPDK_INC_DIR]=$dpdk_incdir
3767232c450SMichal Berger				CONFIG[DPDK_PKG_CONFIG]=y
3773e3fbf91SYuriy Umanets				if pkg-config --print-requires libdpdk | grep "libbsd" > /dev/null 2>&1; then
3783e3fbf91SYuriy Umanets					CONFIG[HAVE_LIBBSD]=y
3793e3fbf91SYuriy Umanets				fi
3807232c450SMichal Berger				CFLAGS="${CFLAGS:+$CFLAGS }$(pkg-config --cflags libdpdk)"
381f1980244SYuriy Umanets				check_IPSec_mb "pkg-config" "$dpdk_libdir" "$dpdk_incdir"
3827232c450SMichal Berger			else
3837232c450SMichal Berger				echo "libdpdk.pc not found, aborting"
3847232c450SMichal Berger				exit 1
3857232c450SMichal Berger			fi
3867232c450SMichal Berger			;;
38706cc8045SBen Walker		--with-dpdk=*)
38806cc8045SBen Walker			check_dir "$i"
3897b04eb72SYuriy Umanets			dpdk_dir=$(readlink -f ${i#*=})
3907b04eb72SYuriy Umanets			dpdk_libdir=$(find_dpdk_arch_libdir $dpdk_dir)
3917b04eb72SYuriy Umanets			dpdk_incdir="$dpdk_dir/include"
3927b04eb72SYuriy Umanets
3937b04eb72SYuriy Umanets			# Can we use pkg-config?
394f13ec525SKarol Latecki			if command -v "pkg-config" > /dev/null 2>&1 && PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --exists libdpdk; then
3957b04eb72SYuriy Umanets				echo "Using $dpdk_libdir/pkgconfig for additional libs..."
3961e6db5fbSTomasz Zawadzki				sysroot_dir=$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --variable=pc_sysrootdir libdpdk)
397e9438453SJacek Kalwas				dpdk_libdir=$(PKG_CONFIG_SYSROOT_DIR='' PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --variable=libdir libdpdk)
3981e6db5fbSTomasz Zawadzki				dpdk_libdir=$(readlink -f "${sysroot_dir}$dpdk_libdir")
3997b04eb72SYuriy Umanets				if ! echo $dpdk_libdir | grep $dpdk_dir > /dev/null 2>&1; then
4007b04eb72SYuriy Umanets					echo "ERROR: pkg-config reported DPDK libdir $dpdk_libdir is out of the directory specified with --with-dpdk="
4017b04eb72SYuriy Umanets					echo "ERROR: do you have another DPDK installed in the system?"
4027b04eb72SYuriy Umanets					exit 1
4037b04eb72SYuriy Umanets				fi
404f13ec525SKarol Latecki				dpdk_reqs=$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --print-requires libdpdk)
4053e3fbf91SYuriy Umanets				if echo $dpdk_reqs | grep "libbsd" > /dev/null 2>&1; then
4063e3fbf91SYuriy Umanets					CONFIG[HAVE_LIBBSD]=y
4073e3fbf91SYuriy Umanets				fi
408f13ec525SKarol Latecki				CFLAGS="${CFLAGS:+$CFLAGS }$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --cflags libdpdk)"
4091e6db5fbSTomasz Zawadzki				dpdk_incdir="${sysroot_dir}$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --variable=includedir libdpdk)"
410f1980244SYuriy Umanets				check_IPSec_mb "pkg-config" "$dpdk_libdir" "$dpdk_incdir"
4113e3fbf91SYuriy Umanets			else
4123e3fbf91SYuriy Umanets				echo "Using $dpdk_incdir/rte_build_config.h for additional libs..."
4133e3fbf91SYuriy Umanets
4143e3fbf91SYuriy Umanets				if grep -F "define RTE_USE_LIBBSD 1" $dpdk_incdir/rte_build_config.h > /dev/null 2>&1; then
4153e3fbf91SYuriy Umanets					CONFIG[HAVE_LIBBSD]=y
4163e3fbf91SYuriy Umanets				fi
417f1980244SYuriy Umanets				check_IPSec_mb "build-config" "$dpdk_libdir" "$dpdk_incdir"
4187b04eb72SYuriy Umanets			fi
4197b04eb72SYuriy Umanets			echo "DPDK libraries: $dpdk_libdir"
4207b04eb72SYuriy Umanets			echo "DPDK includes: $dpdk_incdir"
4217b04eb72SYuriy Umanets			CONFIG[DPDK_DIR]=$dpdk_dir
4227b04eb72SYuriy Umanets			CONFIG[DPDK_LIB_DIR]="$dpdk_libdir"
4237b04eb72SYuriy Umanets			CONFIG[DPDK_INC_DIR]="$dpdk_incdir"
4247b04eb72SYuriy Umanets			CONFIG[DPDK_PKG_CONFIG]=n
42506cc8045SBen Walker			;;
42606cc8045SBen Walker		--without-dpdk)
42706cc8045SBen Walker			CONFIG[DPDK_DIR]=
42806cc8045SBen Walker			;;
4299854c138SNick Connolly		--with-wpdk=*)
4309854c138SNick Connolly			check_dir "$i"
4319854c138SNick Connolly			CONFIG[WPDK_DIR]=$(readlink -f ${i#*=})
4329854c138SNick Connolly			;;
4332bc71094SMichal Berger		--without-wpdk)
4342bc71094SMichal Berger			CONFIG[WPDK_DIR]=
4352bc71094SMichal Berger			;;
4369dd998cdSBen Walker		--with-env=*)
437577df16aSPawel Wodkowski			CONFIG[ENV]="${i#*=}"
4389dd998cdSBen Walker			;;
4399dd998cdSBen Walker		--with-rbd)
440577df16aSPawel Wodkowski			CONFIG[RBD]=y
4419dd998cdSBen Walker			;;
4429dd998cdSBen Walker		--without-rbd)
443577df16aSPawel Wodkowski			CONFIG[RBD]=n
4449dd998cdSBen Walker			;;
445daee62a0SAlexey Marchuk		--with-rdma=*)
446daee62a0SAlexey Marchuk			CONFIG[RDMA]=y
447daee62a0SAlexey Marchuk			CONFIG[RDMA_PROV]=${i#*=}
448daee62a0SAlexey Marchuk			;;
4499dd998cdSBen Walker		--with-rdma)
450577df16aSPawel Wodkowski			CONFIG[RDMA]=y
451daee62a0SAlexey Marchuk			CONFIG[RDMA_PROV]="verbs"
4529dd998cdSBen Walker			;;
4539dd998cdSBen Walker		--without-rdma)
454577df16aSPawel Wodkowski			CONFIG[RDMA]=n
4559dd998cdSBen Walker			;;
456ed56a3d4SAnil Veerabhadrappa		--with-fc=*)
457ed56a3d4SAnil Veerabhadrappa			CONFIG[FC]=y
458ed56a3d4SAnil Veerabhadrappa			CONFIG[FC_PATH]=$(readlink -f ${i#*=})
459ed56a3d4SAnil Veerabhadrappa			;;
460ed56a3d4SAnil Veerabhadrappa		--with-fc)
461ed56a3d4SAnil Veerabhadrappa			CONFIG[FC]=y
462ed56a3d4SAnil Veerabhadrappa			CONFIG[FC_PATH]=
463ed56a3d4SAnil Veerabhadrappa			;;
464ed56a3d4SAnil Veerabhadrappa		--without-fc)
465ed56a3d4SAnil Veerabhadrappa			CONFIG[FC]=n
466ed56a3d4SAnil Veerabhadrappa			CONFIG[FC_PATH]=
467ed56a3d4SAnil Veerabhadrappa			;;
4682e283fcbS0xe0f		--with-daos)
4692e283fcbS0xe0f			CONFIG[DAOS]=y
470044bb175SDenis Barakthanov			CONFIG[DAOS_DIR]=""
471044bb175SDenis Barakthanov			;;
472044bb175SDenis Barakthanov		--with-daos=*)
473044bb175SDenis Barakthanov			CONFIG[DAOS]=y
474044bb175SDenis Barakthanov			check_dir "$i"
475044bb175SDenis Barakthanov			CONFIG[DAOS_DIR]=$(readlink -f ${i#*=})
4762e283fcbS0xe0f			;;
4772e283fcbS0xe0f		--without-daos)
4782e283fcbS0xe0f			CONFIG[DAOS]=n
4792e283fcbS0xe0f			;;
4800923734cSLance Hartmann		--with-shared)
481577df16aSPawel Wodkowski			CONFIG[SHARED]=y
4820923734cSLance Hartmann			;;
4830923734cSLance Hartmann		--without-shared)
484577df16aSPawel Wodkowski			CONFIG[SHARED]=n
4850923734cSLance Hartmann			;;
4862af15344SJim Harris		--with-iscsi-initiator)
487577df16aSPawel Wodkowski			CONFIG[ISCSI_INITIATOR]=y
4882af15344SJim Harris			;;
4892af15344SJim Harris		--without-iscsi-initiator)
490577df16aSPawel Wodkowski			CONFIG[ISCSI_INITIATOR]=n
4912af15344SJim Harris			;;
4926118b853SDaniel Verkamp		--with-crypto)
493577df16aSPawel Wodkowski			CONFIG[CRYPTO]=y
4946118b853SDaniel Verkamp			;;
4956118b853SDaniel Verkamp		--without-crypto)
496577df16aSPawel Wodkowski			CONFIG[CRYPTO]=n
4976118b853SDaniel Verkamp			;;
49835260f2bSDaniel Verkamp		--with-vhost)
499577df16aSPawel Wodkowski			CONFIG[VHOST]=y
50035260f2bSDaniel Verkamp			;;
50135260f2bSDaniel Verkamp		--without-vhost)
502577df16aSPawel Wodkowski			CONFIG[VHOST]=n
50335260f2bSDaniel Verkamp			;;
5047dee96ceSDariusz Stojaczyk		--with-virtio)
505577df16aSPawel Wodkowski			CONFIG[VIRTIO]=y
5067dee96ceSDariusz Stojaczyk			;;
5077dee96ceSDariusz Stojaczyk		--without-virtio)
508577df16aSPawel Wodkowski			CONFIG[VIRTIO]=n
5097dee96ceSDariusz Stojaczyk			;;
510b30d57cdSChangpeng Liu		--with-vfio-user)
511b30d57cdSChangpeng Liu			CONFIG[VFIO_USER]=y
512d0b2448bSChangpeng Liu			CONFIG[VFIO_USER_DIR]=""
513d0b2448bSChangpeng Liu			;;
514d0b2448bSChangpeng Liu		--with-vfio-user=*)
515d0b2448bSChangpeng Liu			CONFIG[VFIO_USER]=y
516d0b2448bSChangpeng Liu			check_dir "$i"
517d0b2448bSChangpeng Liu			CONFIG[VFIO_USER_DIR]=$(readlink -f ${i#*=})
518b30d57cdSChangpeng Liu			;;
519b30d57cdSChangpeng Liu		--without-vfio-user)
520b30d57cdSChangpeng Liu			CONFIG[VFIO_USER]=n
521b30d57cdSChangpeng Liu			;;
522218dcd84SJim Harris		--with-pmdk)
523577df16aSPawel Wodkowski			CONFIG[PMDK]=y
524577df16aSPawel Wodkowski			CONFIG[PMDK_DIR]=""
525fca11f15SPiotr Pelplinski			;;
526218dcd84SJim Harris		--with-pmdk=*)
527577df16aSPawel Wodkowski			CONFIG[PMDK]=y
5281723a800SGangCao			check_dir "$i"
529577df16aSPawel Wodkowski			CONFIG[PMDK_DIR]=$(readlink -f ${i#*=})
530fca11f15SPiotr Pelplinski			;;
531218dcd84SJim Harris		--without-pmdk)
532577df16aSPawel Wodkowski			CONFIG[PMDK]=n
533fca11f15SPiotr Pelplinski			;;
53419e2dc38Spaul luse		--with-vbdev-compress)
53519e2dc38Spaul luse			CONFIG[VBDEV_COMPRESS]=y
53697022803SJim Harris			;;
53719e2dc38Spaul luse		--without-vbdev-compress)
53819e2dc38Spaul luse			CONFIG[VBDEV_COMPRESS]=n
53997022803SJim Harris			;;
5406f338d4bSKrishna Kanth Reddy		--with-xnvme)
5416f338d4bSKrishna Kanth Reddy			CONFIG[XNVME]=y
5426f338d4bSKrishna Kanth Reddy			;;
5436f338d4bSKrishna Kanth Reddy		--without-xnvme)
5446f338d4bSKrishna Kanth Reddy			CONFIG[XNVME]=n
5456f338d4bSKrishna Kanth Reddy			;;
546c3329b52SMichal Berger		--with-fio) ;&
5479dd998cdSBen Walker		--with-fio=*)
548c3329b52SMichal Berger			if [[ ${i#*=} != "$i" ]]; then
54911a5716dSMichal Berger				CONFIG[FIO_SOURCE_DIR]=${i#*=}
550c3329b52SMichal Berger			fi
551c3329b52SMichal Berger			check_dir "--with-fio=${CONFIG[FIO_SOURCE_DIR]}"
55211a5716dSMichal Berger			CONFIG[FIO_SOURCE_DIR]=$(readlink -f "${CONFIG[FIO_SOURCE_DIR]}")
553577df16aSPawel Wodkowski			CONFIG[FIO_PLUGIN]=y
5549dd998cdSBen Walker			;;
5559dd998cdSBen Walker		--without-fio)
556577df16aSPawel Wodkowski			CONFIG[FIO_PLUGIN]=n
5579dd998cdSBen Walker			;;
5585712088aSRoman Sudarikov		--with-vtune=*)
5591723a800SGangCao			check_dir "$i"
560577df16aSPawel Wodkowski			CONFIG[VTUNE_DIR]="${i#*=}"
561577df16aSPawel Wodkowski			CONFIG[VTUNE]=y
5625712088aSRoman Sudarikov			;;
5635712088aSRoman Sudarikov		--without-vtune)
564577df16aSPawel Wodkowski			CONFIG[VTUNE_DIR]=
565577df16aSPawel Wodkowski			CONFIG[VTUNE]=n
5665712088aSRoman Sudarikov			;;
56798d60de6SPiotr Pelplinski		--with-ocf)
56898d60de6SPiotr Pelplinski			CONFIG[OCF]=y
569985d6468SKamil Godzwon			CONFIG[OCF_PATH]=$(readlink -f "$rootdir/ocf")
57098d60de6SPiotr Pelplinski			;;
571d1fee489SVitaliy Mysak		--with-ocf=*)
572d1fee489SVitaliy Mysak			CONFIG[OCF]=y
573d1fee489SVitaliy Mysak			CONFIG[OCF_PATH]=$(readlink -f ${i#*=})
574d1fee489SVitaliy Mysak			;;
575d1fee489SVitaliy Mysak		--without-ocf)
576d1fee489SVitaliy Mysak			CONFIG[OCF]=n
577d1fee489SVitaliy Mysak			CONFIG[OCF_PATH]=
578d1fee489SVitaliy Mysak			;;
5798165bf71SBen Walker		--with-uring=*)
5808165bf71SBen Walker			CONFIG[URING]=y
5818165bf71SBen Walker			CONFIG[URING_PATH]=$(readlink -f ${i#*=})
5828165bf71SBen Walker			;;
5838165bf71SBen Walker		--with-uring)
5848165bf71SBen Walker			CONFIG[URING]=y
585958d196cSIndraneel M			CONFIG[URING_ZNS]=y
5868165bf71SBen Walker			CONFIG[URING_PATH]=
5878165bf71SBen Walker			;;
5888165bf71SBen Walker		--without-uring)
5898165bf71SBen Walker			CONFIG[URING]=n
5908165bf71SBen Walker			CONFIG[URING_PATH]=
5918165bf71SBen Walker			;;
592958d196cSIndraneel M		--without-uring-zns)
593958d196cSIndraneel M			CONFIG[URING_ZNS]=n
5948b840195SIndraneel M			;;
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			;;
61183a4b155SArtur Paszkiewicz		--with-raid5f)
61283a4b155SArtur Paszkiewicz			CONFIG[RAID5F]=y
61373763d40SArtur Paszkiewicz			;;
61483a4b155SArtur Paszkiewicz		--without-raid5f)
61583a4b155SArtur Paszkiewicz			CONFIG[RAID5F]=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
668421368c0SGreg Inozemtsev	if ! echo -e '#include <json-c/json.h>' \
669421368c0SGreg 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
674421368c0SGreg Inozemtsev	if ! echo -e '#include <cmocka.h>' \
675421368c0SGreg 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
701577df16aSPawel Wodkowskiif [ -z "${CONFIG[ENV]}" ]; then
702577df16aSPawel Wodkowski	CONFIG[ENV]=$rootdir/lib/env_dpdk
703577df16aSPawel Wodkowski	echo "Using default SPDK env in ${CONFIG[ENV]}"
7047232c450SMichal Berger	if [[ -z "${CONFIG[DPDK_DIR]}" && "${CONFIG[DPDK_PKG_CONFIG]}" == n ]]; then
70538e26cf5STomasz Zawadzki		if [ ! -f "$rootdir"/dpdk/config/meson.build ]; then
706d199eb29SDaniel Verkamp			echo "DPDK not found; please specify --with-dpdk=<path> or run:"
707d199eb29SDaniel Verkamp			echo
708d199eb29SDaniel Verkamp			echo "  git submodule update --init"
709d199eb29SDaniel Verkamp			exit 1
710577df16aSPawel Wodkowski		else
711577df16aSPawel Wodkowski			CONFIG[DPDK_DIR]="${rootdir}/dpdk/build"
712f1980244SYuriy Umanets			# Default ipsec libs
71319518dfbSAleksey Marchuk			if [[ "${CONFIG[CRYPTO]}" = "y" ]] && [[ $arch = x86_64* ]]; then
714f1980244SYuriy Umanets				CONFIG[IPSEC_MB]=y
715f1980244SYuriy Umanets				CONFIG[IPSEC_MB_DIR]="${rootdir}/intel-ipsec-mb/lib"
716f1980244SYuriy Umanets			fi
717577df16aSPawel Wodkowski			echo "Using default DPDK in ${CONFIG[DPDK_DIR]}"
718d199eb29SDaniel Verkamp		fi
7199dd998cdSBen Walker	fi
7207d2a2f52SBen Walkerelse
7217232c450SMichal Berger	if [[ -n "${CONFIG[DPDK_DIR]}" || "${CONFIG[DPDK_PKG_CONFIG]}" == y ]]; then
72206cc8045SBen Walker		echo "--with-env and --with-dpdk are mutually exclusive."
72306cc8045SBen Walker		exit 1
72406cc8045SBen Walker	fi
72506cc8045SBen Walker
726577df16aSPawel Wodkowski	if [ "${CONFIG[VHOST]}" = "y" ]; then
7277d2a2f52SBen Walker		echo "Vhost is only supported when using the default DPDK environment. Disabling it."
7287d2a2f52SBen Walker	fi
7297d2a2f52SBen Walker	# Always disable vhost, but only print the error message if the user explicitly turned it on.
730577df16aSPawel Wodkowski	CONFIG[VHOST]="n"
731577df16aSPawel Wodkowski	if [ "${CONFIG[VIRTIO]}" = "y" ]; then
7327d2a2f52SBen Walker		echo "Virtio is only supported when using the default DPDK environment. Disabling it."
7337d2a2f52SBen Walker	fi
7347d2a2f52SBen Walker	# Always disable virtio, but only print the error message if the user explicitly turned it on.
735577df16aSPawel Wodkowski	CONFIG[VIRTIO]="n"
7369dd998cdSBen Walkerfi
7379dd998cdSBen Walker
7387232c450SMichal Bergerif [[ "${CONFIG[DPDK_PKG_CONFIG]}" == y ]]; then
7397232c450SMichal Berger	if [[ "${CONFIG[SHARED]}" == n ]]; then
7407232c450SMichal Berger		# dpdk-devel doesn't provide static libs
7417232c450SMichal Berger		echo "Build against packaged DPDK requested, enabling shared libraries"
7427232c450SMichal Berger		CONFIG[SHARED]=y
7437232c450SMichal Berger	fi
7447232c450SMichal Bergerfi
7457232c450SMichal Berger
7469854c138SNick Connollyif [[ $sys_name == "Windows" ]]; then
7479854c138SNick Connolly	if [ -z "${CONFIG[WPDK_DIR]}" ]; then
7489854c138SNick Connolly		if [ ! -f "$rootdir"/wpdk/Makefile ]; then
7499854c138SNick Connolly			echo "WPDK not found; please specify --with-wpdk=<path>. See https://wpdk.github.io."
7509854c138SNick Connolly			exit 1
7519854c138SNick Connolly		else
7529854c138SNick Connolly			CONFIG[WPDK_DIR]="${rootdir}/wpdk/build"
7539854c138SNick Connolly			echo "Using default WPDK in ${CONFIG[WPDK_DIR]}"
7549854c138SNick Connolly		fi
7559854c138SNick Connolly	fi
7569854c138SNick Connollyelse
7579854c138SNick Connolly	if [ -n "${CONFIG[WPDK_DIR]}" ]; then
7589854c138SNick Connolly		echo "ERROR: --with-wpdk is only supported for Windows"
7599854c138SNick Connolly		exit 1
7609854c138SNick Connolly	fi
7619854c138SNick Connollyfi
7629854c138SNick Connolly
763577df16aSPawel Wodkowskiif [ "${CONFIG[VTUNE]}" = "y" ]; then
764577df16aSPawel Wodkowski	if [ -z "${CONFIG[VTUNE_DIR]}" ]; then
7655712088aSRoman Sudarikov		echo "When VTune is enabled, you must specify the VTune directory using --with-vtune=path"
7665712088aSRoman Sudarikov		exit 1
7675712088aSRoman Sudarikov	fi
7685712088aSRoman Sudarikovfi
7695712088aSRoman Sudarikov
770bb0f78a2SMichal Bergerif [[ "${CONFIG[ASAN]}" = "y" && "${CONFIG[TSAN]}" = "y" ]]; then
771830912e2SBen Walker	echo "ERROR: ASAN and TSAN cannot be enabled at the same time."
772830912e2SBen Walker	exit 1
773830912e2SBen Walkerfi
774830912e2SBen Walker
775ac5b53a5SJim Harrisif [[ "${CONFIG[FIO_PLUGIN]}" = "y" && "${CONFIG[EXAMPLES]}" = "n" ]]; then
776ac5b53a5SJim Harris	echo "ERROR: --with-fio and --disable-examples are mutually exclusive."
777ac5b53a5SJim Harris	exit 1
778ac5b53a5SJim Harrisfi
779ac5b53a5SJim Harris
7805a764955SMichal Bergerif [[ $sys_name == "FreeBSD" ]]; then
7815091cadcSPaul Luse	# FreeBSD doesn't support all configurations
782577df16aSPawel Wodkowski	if [[ "${CONFIG[COVERAGE]}" == "y" ]]; then
7835091cadcSPaul Luse		echo "ERROR: CONFIG_COVERAGE not available on FreeBSD"
7845091cadcSPaul Luse		exit 1
7855091cadcSPaul Luse	fi
7865091cadcSPaul Lusefi
7875091cadcSPaul Luse
7882a0c2a2dSNick Connollyif [[ $sys_name != "Linux" ]]; then
78927b920a2SDarek Stojaczyk	if [[ "${CONFIG[VHOST]}" == "y" ]]; then
790873c8748STomasz Kulasek		echo "Vhost is only supported on Linux."
791873c8748STomasz Kulasek		exit 1
79227b920a2SDarek Stojaczyk	fi
79327b920a2SDarek Stojaczyk	if [[ "${CONFIG[VIRTIO]}" == "y" ]]; then
794873c8748STomasz Kulasek		echo "Virtio is only supported on Linux."
795873c8748STomasz Kulasek		exit 1
79627b920a2SDarek Stojaczyk	fi
79727b920a2SDarek Stojaczykfi
79827b920a2SDarek Stojaczyk
799577df16aSPawel Wodkowskiif [ "${CONFIG[RDMA]}" = "y" ]; then
800daee62a0SAlexey Marchuk	if [[ ! "${CONFIG[RDMA_PROV]}" == "verbs" ]] && [[ ! "${CONFIG[RDMA_PROV]}" == "mlx5_dv" ]]; then
801daee62a0SAlexey Marchuk		echo "Invalid RDMA provider specified, must be \"verbs\" or \"mlx5_dv\""
802daee62a0SAlexey Marchuk		exit 1
803daee62a0SAlexey Marchuk	fi
804daee62a0SAlexey Marchuk
805eed0c6beSDarek Stojaczyk	if ! echo -e '#include <infiniband/verbs.h>\n#include <rdma/rdma_verbs.h>\n' \
806eed0c6beSDarek Stojaczyk		'int main(void) { return 0; }\n' \
807bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -libverbs -lrdmacm - 2> /dev/null; then
808bb0f78a2SMichal Berger		echo "--with-rdma requires libverbs and librdmacm."
809bb0f78a2SMichal Berger		echo "Please install then re-run this script."
810eed0c6beSDarek Stojaczyk		exit 1
811eed0c6beSDarek Stojaczyk	fi
812eed0c6beSDarek Stojaczyk
813eed0c6beSDarek Stojaczyk	if echo -e '#include <infiniband/verbs.h>\n' \
814eed0c6beSDarek Stojaczyk		'int main(void) { return !!IBV_WR_SEND_WITH_INV; }\n' \
815bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -c - 2> /dev/null; then
816577df16aSPawel Wodkowski		CONFIG[RDMA_SEND_WITH_INVAL]="y"
8177671073bSSeth Howell	else
818577df16aSPawel Wodkowski		CONFIG[RDMA_SEND_WITH_INVAL]="n"
81917a819f8SJim Harris		echo "
8207671073bSSeth Howell*******************************************************************************
8217671073bSSeth HowellWARNING: The Infiniband Verbs opcode Send With Invalidate is either not
8227671073bSSeth Howellsupported or is not functional with the current version of libibverbs installed
8237671073bSSeth Howellon this system. Please upgrade to at least version 1.1.
8247671073bSSeth Howell
8257671073bSSeth HowellBeginning with Linux kernel 4.14, the kernel NVMe-oF initiator leverages Send
8267671073bSSeth HowellWith Invalidate RDMA operations to improve performance. Failing to use the
8277671073bSSeth HowellSend With Invalidate operation on the NVMe-oF target side results in full
8287671073bSSeth Howellfunctionality, but greatly reduced performance. The SPDK NVMe-oF target will
8297671073bSSeth Howellbe unable to leverage that operation using the currently installed version
8307671073bSSeth Howellof libibverbs, so Linux kernel NVMe-oF initiators based on kernels greater
8317671073bSSeth Howellthan or equal to 4.14 will see significantly reduced performance.
83217a819f8SJim Harris*******************************************************************************"
8337671073bSSeth Howell	fi
83494966468SAlexey Marchuk
83594966468SAlexey Marchuk	if echo -e '#include <rdma/rdma_cma.h>\n' \
83694966468SAlexey Marchuk		'int main(void) { return !!RDMA_OPTION_ID_ACK_TIMEOUT; }\n' \
837bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -c - 2> /dev/null; then
83894966468SAlexey Marchuk		CONFIG[RDMA_SET_ACK_TIMEOUT]="y"
83994966468SAlexey Marchuk	else
84094966468SAlexey Marchuk		CONFIG[RDMA_SET_ACK_TIMEOUT]="n"
84194966468SAlexey Marchuk		echo "RDMA_OPTION_ID_ACK_TIMEOUT is not supported"
84294966468SAlexey Marchuk	fi
84394966468SAlexey Marchuk
844daee62a0SAlexey Marchuk	if [ "${CONFIG[RDMA_PROV]}" == "mlx5_dv" ]; then
845daee62a0SAlexey Marchuk		if ! echo -e '#include <spdk/stdinc.h>\n' \
846daee62a0SAlexey Marchuk			'#include <infiniband/mlx5dv.h>\n' \
847daee62a0SAlexey Marchuk			'#include <rdma/rdma_cma.h>\n' \
848daee62a0SAlexey Marchuk			'int main(void) { return rdma_establish(NULL) || ' \
849daee62a0SAlexey Marchuk			'!!IBV_QP_INIT_ATTR_SEND_OPS_FLAGS || !!MLX5_OPCODE_RDMA_WRITE; }\n' \
850bb0f78a2SMichal Berger			| "${BUILD_CMD[@]}" -lmlx5 -I${rootdir}/include -c - 2> /dev/null; then
851daee62a0SAlexey Marchuk			echo "mlx5_dv provider is not supported"
852daee62a0SAlexey Marchuk			exit 1
853daee62a0SAlexey Marchuk		fi
854daee62a0SAlexey Marchuk	fi
855daee62a0SAlexey Marchuk
856bb0f78a2SMichal Berger	echo "Using '${CONFIG[RDMA_PROV]}' RDMA provider"
8577671073bSSeth Howellfi
8587671073bSSeth Howell
859ed56a3d4SAnil Veerabhadrappaif [[ "${CONFIG[FC]}" = "y" ]]; then
860ed56a3d4SAnil Veerabhadrappa	if [[ -n "${CONFIG[FC_PATH]}" ]]; then
861*c9b4654bSTomasz Zawadzki		check_dir "${CONFIG[FC_PATH]}"
862ed56a3d4SAnil Veerabhadrappa	fi
863ed56a3d4SAnil Veerabhadrappafi
864ed56a3d4SAnil Veerabhadrappa
865ce711726SDarek Stojaczykif [[ "${CONFIG[PMDK]}" = "y" ]]; then
866ce711726SDarek Stojaczyk	if ! echo -e '#include <libpmemblk.h>\nint main(void) { return 0; }\n' \
867bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -lpmemblk - 2> /dev/null; then
868bb0f78a2SMichal Berger		echo "--with-pmdk requires libpmemblk."
869bb0f78a2SMichal Berger		echo "Please install then re-run this script."
870ce711726SDarek Stojaczyk		exit 1
871ce711726SDarek Stojaczyk	fi
872ce711726SDarek Stojaczykfi
873ce711726SDarek Stojaczyk
8742a6ddeb8SYuriy Umanetsfunction dpdk_version() {
8752a6ddeb8SYuriy Umanets	# Check DPDK version to determine if mlx5_pci driver is supported
8762a6ddeb8SYuriy Umanets	local dpdk_ver="none"
8772a6ddeb8SYuriy Umanets	if [[ "${CONFIG[DPDK_DIR]}" == "$rootdir/dpdk/build" ]]; then
8782a6ddeb8SYuriy Umanets		# DPDK_DIR points at our submodule so ./build may not exist yet. Use
8792a6ddeb8SYuriy Umanets		# absolute path to lookup the version.
8802a6ddeb8SYuriy Umanets		dpdk_ver=$(< "$rootdir/dpdk/VERSION")
8812a6ddeb8SYuriy Umanets	elif [[ -f "${CONFIG[DPDK_DIR]}"/../VERSION ]]; then
8822a6ddeb8SYuriy Umanets		dpdk_ver=$(< "${CONFIG[DPDK_DIR]}"/../VERSION)
8832a6ddeb8SYuriy Umanets	fi
8842a6ddeb8SYuriy Umanets	echo $dpdk_ver
8852a6ddeb8SYuriy Umanets}
8862a6ddeb8SYuriy Umanets
8872a6ddeb8SYuriy Umanetsfunction mlx5_build() {
8882a6ddeb8SYuriy Umanets	# Check if libmlx5 exists to enable mlx5_pci compress/crypto PMD
8892a6ddeb8SYuriy Umanets	if ! echo -e '#include <spdk/stdinc.h>\n' \
8902a6ddeb8SYuriy Umanets		'#include <infiniband/mlx5dv.h>\n' \
8912a6ddeb8SYuriy Umanets		'#include <infiniband/verbs.h>\n' \
8922a6ddeb8SYuriy Umanets		'int main(void) { return 0; }\n' \
8932a6ddeb8SYuriy Umanets		| "${BUILD_CMD[@]}" -lmlx5 -libverbs -I${rootdir}/include -c - 2> /dev/null; then
8942a6ddeb8SYuriy Umanets		return 1
8952a6ddeb8SYuriy Umanets	fi
8962a6ddeb8SYuriy Umanets	return 0
8972a6ddeb8SYuriy Umanets}
8982a6ddeb8SYuriy Umanets
89919e2dc38Spaul luseif [[ "${CONFIG[VBDEV_COMPRESS]}" = "y" ]]; then
900c4a3b312SDarek Stojaczyk	if ! echo -e '#include <libpmem.h>\nint main(void) { return 0; }\n' \
901bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -lpmem - 2> /dev/null; then
90219e2dc38Spaul luse		echo "--with-vbdev-compress requires libpmem."
903bb0f78a2SMichal Berger		echo "Please install then re-run this script."
90497022803SJim Harris		exit 1
90597022803SJim Harris	fi
9062a6ddeb8SYuriy Umanets	# Try to enable mlx5 compress
90719e2dc38Spaul luse	CONFIG[VBDEV_COMPRESS_MLX5]="y"
9082a6ddeb8SYuriy Umanets
909e71ae467SAlexey Marchuk	# Check if libmlx5 exists to enable mlx5_pci compress PMD
9102a6ddeb8SYuriy Umanets	if ! mlx5_build; then
911e71ae467SAlexey Marchuk		echo "libmlx5 is not found, so disabling DPDK mlx5_pci compress PMD"
91219e2dc38Spaul luse		CONFIG[VBDEV_COMPRESS_MLX5]="n"
9132a6ddeb8SYuriy Umanets	else
914e71ae467SAlexey Marchuk		if [[ "${CONFIG[DPDK_PKG_CONFIG]}" = "y" ]]; then
915e71ae467SAlexey Marchuk			# Check if librte_compress_mlx5 exists in DPDK package
916e71ae467SAlexey Marchuk			if [ ! -f "${CONFIG[DPDK_LIB_DIR]}"/librte_compress_mlx5.so ]; then
917e71ae467SAlexey Marchuk				echo "librte_compress_mlx5 is not found, so disabling DPDK mlx5_pci compress PMD"
91819e2dc38Spaul luse				CONFIG[VBDEV_COMPRESS_MLX5]="n"
919e71ae467SAlexey Marchuk			fi
920e71ae467SAlexey Marchuk		else
921e71ae467SAlexey Marchuk			# Check DPDK version to determine if mlx5_pci driver is supported
9222a6ddeb8SYuriy Umanets			dpdk_ver=$(dpdk_version)
9232a6ddeb8SYuriy Umanets			if [[ $dpdk_ver = "none" ]]; then
924c2de56b0SMichal Berger				echo "Cannot get DPDK version, so disabling DPDK mlx5_pci compress PMD"
92519e2dc38Spaul luse				CONFIG[VBDEV_COMPRESS_MLX5]="n"
9262a6ddeb8SYuriy Umanets			elif [[ -n $dpdk_ver ]] && lt "$dpdk_ver" 21.02.0; then
9272a6ddeb8SYuriy Umanets				# mlx5_pci for compress is supported by DPDK >- 21.02.0
928c2de56b0SMichal Berger				echo "DPDK version ${dpdk_ver} doesn't support mlx5_pci compress PMD"
92919e2dc38Spaul luse				CONFIG[VBDEV_COMPRESS_MLX5]="n"
9302a6ddeb8SYuriy Umanets			elif [[ -n ${CONFIG[DPDK_LIB_DIR]} ]] && [ ! -f "${CONFIG[DPDK_LIB_DIR]}"/librte_compress_mlx5.so ]; then
9312a6ddeb8SYuriy Umanets				# This is only checked when --with-dpdk or --with-dpdk=* is used
9322a6ddeb8SYuriy Umanets				echo "librte_compress_mlx5 is not found, so disabling DPDK mlx5_pci compress PMD"
93319e2dc38Spaul luse				CONFIG[VBDEV_COMPRESS_MLX5]="n"
9342a6ddeb8SYuriy Umanets			fi
9352a6ddeb8SYuriy Umanets		fi
9362a6ddeb8SYuriy Umanets	fi
9372a6ddeb8SYuriy Umanetsfi
9382a6ddeb8SYuriy Umanets
9392a6ddeb8SYuriy Umanetsif [[ "${CONFIG[CRYPTO]}" = "y" ]]; then
9402a6ddeb8SYuriy Umanets	# Try to enable mlx5 crypto
9412a6ddeb8SYuriy Umanets	CONFIG[CRYPTO_MLX5]="y"
9422a6ddeb8SYuriy Umanets
9432a6ddeb8SYuriy Umanets	# Check if libmlx5 exists to enable mlx5_pci compress PMD
9442a6ddeb8SYuriy Umanets	if ! mlx5_build; then
9452a6ddeb8SYuriy Umanets		echo "libmlx5 is not found, so disabling DPDK mlx5_pci crypto PMD"
9462a6ddeb8SYuriy Umanets		CONFIG[CRYPTO_MLX5]="n"
9472a6ddeb8SYuriy Umanets	else
9482a6ddeb8SYuriy Umanets		if [[ "${CONFIG[DPDK_PKG_CONFIG]}" = "y" ]]; then
9492a6ddeb8SYuriy Umanets			# Check if librte_crypto_mlx5 exists in DPDK package
9502a6ddeb8SYuriy Umanets			if [ ! -f "${CONFIG[DPDK_LIB_DIR]}"/librte_crypto_mlx5.so ]; then
9512a6ddeb8SYuriy Umanets				echo "librte_crypto_mlx5 is not found, so disabling DPDK mlx5_pci crypto PMD"
9522a6ddeb8SYuriy Umanets				CONFIG[CRYPTO_MLX5]="n"
9532a6ddeb8SYuriy Umanets			fi
9542a6ddeb8SYuriy Umanets		else
9552a6ddeb8SYuriy Umanets			# Check DPDK version to determine if mlx5_pci driver is supported
9562a6ddeb8SYuriy Umanets			dpdk_ver=$(dpdk_version)
9572a6ddeb8SYuriy Umanets			if [[ $dpdk_ver = "none" ]]; then
9582a6ddeb8SYuriy Umanets				echo "Cannot get DPDK version, so disabling DPDK mlx5_pci crypto PMD"
9592a6ddeb8SYuriy Umanets				CONFIG[CRYPTO_MLX5]="n"
9608a2fc789SYuriy Umanets			elif [[ -n $dpdk_ver ]] && lt "$dpdk_ver" 21.11.0; then
9618a2fc789SYuriy Umanets				# mlx5_pci for crypto is supported by DPDK >- 21.11.0
9622a6ddeb8SYuriy Umanets				echo "DPDK version ${dpdk_ver} doesn't support mlx5_pci crypto PMD"
9632a6ddeb8SYuriy Umanets				CONFIG[CRYPTO_MLX5]="n"
9642a6ddeb8SYuriy Umanets			elif [[ -n ${CONFIG[DPDK_LIB_DIR]} ]] && [ ! -f "${CONFIG[DPDK_LIB_DIR]}"/librte_crypto_mlx5.so ]; then
9652a6ddeb8SYuriy Umanets				# This is only checked when --with-dpdk or --with-dpdk=* is used
9662a6ddeb8SYuriy Umanets				echo "librte_crypto_mlx5 is not found, so disabling DPDK mlx5_pci crypto PMD"
9672a6ddeb8SYuriy Umanets				CONFIG[CRYPTO_MLX5]="n"
9682a6ddeb8SYuriy Umanets			fi
969e71ae467SAlexey Marchuk		fi
970e269bf4eSAlexey Marchuk	fi
97197022803SJim Harrisfi
97297022803SJim Harris
973805d9942STomasz Kulasekif [[ "${CONFIG[NVME_CUSE]}" = "y" ]]; then
974805d9942STomasz 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' \
975bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -lfuse3 -D_FILE_OFFSET_BITS=64 - 2> /dev/null; then
976bb0f78a2SMichal Berger		echo "--with-cuse requires libfuse3."
977bb0f78a2SMichal Berger		echo "Please install then re-run this script."
978805d9942STomasz Kulasek		exit 1
979805d9942STomasz Kulasek	fi
980805d9942STomasz Kulasekfi
981805d9942STomasz Kulasek
98255bd0d3aSDarek Stojaczykif [[ "${CONFIG[RBD]}" = "y" ]]; then
98355bd0d3aSDarek Stojaczyk	if ! echo -e '#include <rbd/librbd.h>\n#include <rados/librados.h>\n' \
98455bd0d3aSDarek Stojaczyk		'int main(void) { return 0; }\n' \
985bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -lrados -lrbd - 2> /dev/null; then
986bb0f78a2SMichal Berger		echo "--with-rbd requires librados and librbd."
987bb0f78a2SMichal Berger		echo "Please install then re-run this script."
98855bd0d3aSDarek Stojaczyk		exit 1
98955bd0d3aSDarek Stojaczyk	fi
99055bd0d3aSDarek Stojaczykfi
99155bd0d3aSDarek Stojaczyk
9925cb18040SDarek Stojaczykif [[ "${CONFIG[ISCSI_INITIATOR]}" = "y" ]]; then
9935cb18040SDarek Stojaczyk	# Fedora installs libiscsi to /usr/lib64/iscsi for some reason.
9945cb18040SDarek Stojaczyk	if ! echo -e '#include <iscsi/iscsi.h>\n#include <iscsi/scsi-lowlevel.h>\n' \
9955cb18040SDarek Stojaczyk		'#if LIBISCSI_API_VERSION < 20150621\n' \
9965cb18040SDarek Stojaczyk		'#error\n' \
9975cb18040SDarek Stojaczyk		'#endif\n' \
9985cb18040SDarek Stojaczyk		'int main(void) { return 0; }\n' \
999bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -L/usr/lib64/iscsi -liscsi - 2> /dev/null; then
1000bb0f78a2SMichal Berger		echo "--with-iscsi-initiator requires libiscsi with"
1001bb0f78a2SMichal Berger		echo "LIBISCSI_API_VERSION >= 20150621."
1002bb0f78a2SMichal Berger		echo "Please install then re-run this script."
10035cb18040SDarek Stojaczyk		exit 1
10045cb18040SDarek Stojaczyk	fi
10055cb18040SDarek Stojaczykfi
10065cb18040SDarek Stojaczyk
10072e283fcbS0xe0fif [[ "${CONFIG[DAOS]}" = "y" ]]; then
1008044bb175SDenis Barakthanov	daos_build_cmd=("${BUILD_CMD[@]}")
1009044bb175SDenis Barakthanov	if [[ -n "${CONFIG[DAOS_DIR]}" ]]; then
1010044bb175SDenis Barakthanov		daos_build_cmd+=(-I"${CONFIG[DAOS_DIR]}"/include -L"${CONFIG[DAOS_DIR]}"/lib64)
1011044bb175SDenis Barakthanov	fi
10122e283fcbS0xe0f	if ! echo -e '#include <daos.h>\n#include <daos_fs.h>\n' \
10132e283fcbS0xe0f		'int main(void) { return 0; }\n' \
1014044bb175SDenis Barakthanov		| "${daos_build_cmd[@]}" -lgurt -ldaos -ldaos_common -ldfs - 2> /dev/null; then
10152e283fcbS0xe0f		echo "--with-daos requires libdaos, libdaos_common, libdfs and libgurt"
10162e283fcbS0xe0f		echo "Please install then re-run this script."
10172e283fcbS0xe0f		exit 1
10182e283fcbS0xe0f	fi
10192e283fcbS0xe0ffi
10202e283fcbS0xe0f
10213674c1d3SDarek Stojaczykif [[ "${CONFIG[ASAN]}" = "y" ]]; then
10223674c1d3SDarek Stojaczyk	if ! echo -e 'int main(void) { return 0; }\n' \
1023bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -fsanitize=address - 2> /dev/null; then
1024bb0f78a2SMichal Berger		echo "--enable-asan requires libasan."
1025bb0f78a2SMichal Berger		echo "Please install then re-run this script."
10263674c1d3SDarek Stojaczyk		exit 1
10273674c1d3SDarek Stojaczyk	fi
10283674c1d3SDarek Stojaczykfi
10293674c1d3SDarek Stojaczyk
10303674c1d3SDarek Stojaczykif [[ "${CONFIG[UBSAN]}" = "y" ]]; then
10313674c1d3SDarek Stojaczyk	if ! echo -e 'int main(void) { return 0; }\n' \
1032bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -fsanitize=undefined - 2> /dev/null; then
1033bb0f78a2SMichal Berger		echo "--enable-ubsan requires libubsan."
1034bb0f78a2SMichal Berger		echo "Please install then re-run this script."
1035bb0f78a2SMichal Berger		echo "If installed, please check that the GCC version is at least 6.4"
1036bb0f78a2SMichal Berger		echo "and synchronize CC accordingly."
10373674c1d3SDarek Stojaczyk		exit 1
10383674c1d3SDarek Stojaczyk	fi
10393674c1d3SDarek Stojaczykfi
10403674c1d3SDarek Stojaczyk
10413674c1d3SDarek Stojaczykif [[ "${CONFIG[TSAN]}" = "y" ]]; then
10423674c1d3SDarek Stojaczyk	if ! echo -e 'int main(void) { return 0; }\n' \
1043bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -fsanitize=thread - 2> /dev/null; then
1044bb0f78a2SMichal Berger		echo "--enable-tsan requires libtsan."
1045bb0f78a2SMichal Berger		echo "Please install then re-run this script."
10463674c1d3SDarek Stojaczyk		exit 1
10473674c1d3SDarek Stojaczyk	fi
10483674c1d3SDarek Stojaczykfi
10493674c1d3SDarek Stojaczyk
105043a3984cSJim Harrisif echo -e '#include <stdlib.h>\nint main(void) { arc4random(); return 0; }\n' \
105143a3984cSJim Harris	| "${BUILD_CMD[@]}" - 2> /dev/null; then
105243a3984cSJim Harris	CONFIG[HAVE_ARC4RANDOM]="y"
105343a3984cSJim Harrisfi
105443a3984cSJim Harris
1055d1fee489SVitaliy Mysakif [[ "${CONFIG[OCF]}" = "y" ]]; then
1056d1fee489SVitaliy Mysak	# If OCF_PATH is a file, assume it is a library and use it to compile with
1057d1fee489SVitaliy Mysak	if [ -f ${CONFIG[OCF_PATH]} ]; then
1058d1fee489SVitaliy Mysak		CONFIG[CUSTOMOCF]=y
1059d1fee489SVitaliy Mysak	else
1060d1fee489SVitaliy Mysak		CONFIG[CUSTOMOCF]=n
1061d1fee489SVitaliy Mysak	fi
1062d1fee489SVitaliy Mysakfi
1063d1fee489SVitaliy Mysak
1064995d60f4SBen Walkerif [[ "${CONFIG[PGO_CAPTURE]}" = "y" && "${CONFIG[PGO_USE]}" = "y" ]]; then
1065995d60f4SBen Walker	echo "ERROR: --enable-pgo-capture and --enable-pgo-use are mutually exclusive."
1066995d60f4SBen Walker	exit 1
1067954728e9SBen Walkerelif [[ "${CONFIG[PGO_USE]}" = "y" ]]; then
1068954728e9SBen Walker	if [[ "$CC_TYPE" = "clang" ]]; then
1069954728e9SBen Walker		# For clang we need to run an extra step on gathered profiling data.
1070954728e9SBen Walker		echo "Generating suitable profile data"
1071954728e9SBen Walker		llvm-profdata merge -output=build/pgo/default.profdata build/pgo
1072954728e9SBen Walker	fi
1073995d60f4SBen Walkerfi
1074995d60f4SBen Walker
10758165bf71SBen Walkerif [[ "${CONFIG[URING]}" = "y" ]]; then
10768165bf71SBen Walker	if [[ -n "${CONFIG[URING_PATH]}" ]]; then
1077*c9b4654bSTomasz Zawadzki		check_dir "${CONFIG[URING_PATH]}"
10784ccc9ea3SJim Harris	elif ! echo -e '#include <liburing.h>\nint main(void) { return 0; }\n' \
10794ccc9ea3SJim Harris		| "${BUILD_CMD[@]}" -luring - 2> /dev/null; then
10804ccc9ea3SJim Harris		echo "--with-uring requires liburing."
10814ccc9ea3SJim Harris		echo "Please build and install then re-run this script."
10824ccc9ea3SJim Harris		exit 1
10838165bf71SBen Walker	fi
1084958d196cSIndraneel M	# Support for Zoned devices is enabled by default for Uring bdev. Check appropriate support in kernel.
10858b840195SIndraneel M	if [[ "${CONFIG[URING_ZNS]}" = "y" ]]; then
10868b840195SIndraneel M		if ! echo -e '#include<linux/blkzoned.h>\nint main(void) { return BLK_ZONE_REP_CAPACITY; }\n' \
10878b840195SIndraneel M			| "${BUILD_CMD[@]}" -c - 2> /dev/null; then
1088958d196cSIndraneel M			echo "Disabling Zoned NS support in Uring! Requires blkzoned.h from kernel >= linux-5.9."
1089958d196cSIndraneel M			CONFIG[URING_ZNS]=n
1090958d196cSIndraneel M		fi
10918b840195SIndraneel M	fi
10928b840195SIndraneel Mfi
10938b840195SIndraneel M
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
1115dd2c08d2Spaul luseif [[ $arch == x86_64* ]] || [[ $arch == aarch64* ]]; then
1116dd2c08d2Spaul luse	CONFIG[ISAL]=y
1117dd2c08d2Spaul luse	# make sure the submodule is initialized
11189d2f6f86SJim Harris	if [ ! -f "$rootdir"/isa-l/autogen.sh ]; then
1119dd2c08d2Spaul luse		echo "ISA-L is required but was not found, please init the submodule with:"
11209d2f6f86SJim Harris		echo "  git submodule update --init"
1121dd2c08d2Spaul luse		echo "and then re-run this script."
11229d2f6f86SJim Harris		exit 1
11239d2f6f86SJim Harris	fi
1124dd2c08d2Spaul luse	# for x86 only, check the nasm version for ISA-L and IPSEC
1125dd2c08d2Spaul luse	if [[ $arch == x86_64* ]]; then
1126dd2c08d2Spaul luse		ver=$(nasm -v 2> /dev/null | awk '{print $3}' | awk -Fr '{print $1}')
1127dd2c08d2Spaul luse		if lt "$ver" 2.14; then
1128dd2c08d2Spaul luse			CONFIG[ISAL]=n
1129dd2c08d2Spaul luse			# IPSEC has nasm requirement and DPDK crypto relies on IPSEC
1130dd2c08d2Spaul luse			CONFIG[IPSEC_MB]=n
1131dd2c08d2Spaul luse			echo "WARNING: ISA-L & DPDK crypto cannot be used as nasm ver must be 2.14 or newer."
1132dd2c08d2Spaul luse		fi
1133dd2c08d2Spaul luse	fi
1134dd2c08d2Spaul luseelse
1135dd2c08d2Spaul luse	# for PPC
1136dd2c08d2Spaul luse	CONFIG[ISAL]=n
1137dd2c08d2Spaul luse	echo "WARNING: ISA-L cannot be used due to architecture incompatibility."
1138dd2c08d2Spaul lusefi
11399d2f6f86SJim Harris
1140dd2c08d2Spaul luse# now either configure ISA-L or disable unavailable features
1141dd2c08d2Spaul luseif [[ "${CONFIG[ISAL]}" = "y" ]]; then
11429d2f6f86SJim Harris	cd $rootdir/isa-l
11439d2f6f86SJim Harris	ISAL_LOG=$rootdir/isa-l/spdk-isal.log
11449d2f6f86SJim Harris	if [[ -n "${CONFIG[CROSS_PREFIX]}" ]]; then
11459d2f6f86SJim Harris		ISAL_OPTS=("--host=${CONFIG[CROSS_PREFIX]}")
11469d2f6f86SJim Harris	else
11479d2f6f86SJim Harris		ISAL_OPTS=()
11489d2f6f86SJim Harris	fi
11499d2f6f86SJim Harris	echo -n "Configuring ISA-L (logfile: $ISAL_LOG)..."
11509d2f6f86SJim Harris	./autogen.sh &> $ISAL_LOG
11519d2f6f86SJim Harris	./configure CFLAGS="-fPIC -g -O2" "${ISAL_OPTS[@]}" --enable-shared=no >> $ISAL_LOG 2>&1
11529d2f6f86SJim Harris	echo "done."
11539d2f6f86SJim Harris	cd $rootdir
1154dd2c08d2Spaul luseelse
1155dd2c08d2Spaul luse	echo "Without ISA-L, there is no software support for crypto or compression,"
1156dd2c08d2Spaul luse	echo "so these features will be disabled."
1157dd2c08d2Spaul luse	CONFIG[CRYPTO]=n
115819e2dc38Spaul luse	CONFIG[VBDEV_COMPRESS]=n
11599d2f6f86SJim Harrisfi
11609d2f6f86SJim Harris
1161509241ceSKonrad Sztyberif [[ "${CONFIG[SMA]}" = "y" ]]; then
1162509241ceSKonrad Sztyber	if ! python3 -c 'import grpc; import grpc_tools' 2> /dev/null; then
1163509241ceSKonrad Sztyber		echo "--with-sma requires grpcio and grpcio-tools python packages."
1164509241ceSKonrad Sztyber		echo "Please install then re-run this script."
1165509241ceSKonrad Sztyber		exit 1
1166509241ceSKonrad Sztyber	fi
1167509241ceSKonrad Sztyberfi
1168509241ceSKonrad Sztyber
1169fcc38949SRui Chang# For ARM Neoverse-N1 platform, debug build needs gcc version newer than 8.4
1170fcc38949SRui Changif [[ "${CONFIG[DEBUG]}" = "y" && $arch = aarch64* && "$CC_TYPE" = "gcc" ]]; then
1171fcc38949SRui Chang	GCC_VERSION=$($CC -dumpfullversion)
1172fcc38949SRui Chang	PART_NUM=$(grep -i -m 1 "CPU part" /proc/cpuinfo | awk '{print $4}')
1173fcc38949SRui Chang
1174fcc38949SRui Chang	if [[ "$(printf '%s\n' "8.4.0" "$GCC_VERSION" | sort -V | head -n1)" != "8.4.0" ]]; then
1175fcc38949SRui Chang		if [[ $PART_NUM = 0xd0c ]]; then
1176fcc38949SRui Chang			echo "WARNING: For ARM Neoverse-N1 platform, debug build needs GCC version newer than 8.4."
1177fcc38949SRui Chang			echo "         Will work around this by using armv8.2-a+crypto as target architecture for now."
1178fcc38949SRui Chang			CONFIG[ARCH]=armv8.2-a+crypto
1179e8f84531SSunil Shahu		elif [[ $PART_NUM = 0x0b2 ]]; then
1180e8f84531SSunil Shahu			echo "WARNING: For ARM octeontx2 platform, debug build needs GCC version newer than 8.4."
1181e8f84531SSunil Shahu			echo "         Will work around this by using armv8.2-a+crypto as target architecture for now."
1182e8f84531SSunil Shahu			CONFIG[ARCH]=armv8.2-a+crypto
1183fcc38949SRui Chang		fi
1184fcc38949SRui Chang	fi
1185fcc38949SRui Changfi
1186fcc38949SRui Chang
118748f70f48SPawel Wodkowski# We are now ready to generate final configuration. But first do sanity
118848f70f48SPawel Wodkowski# check to see if all keys in CONFIG array have its reflection in CONFIG file.
1189bb0f78a2SMichal Bergerif (($(grep -cE "^\s*CONFIG_[[:alnum:]_]+=" "$rootdir/CONFIG") != ${#CONFIG[@]})); then
119048f70f48SPawel Wodkowski	echo ""
119148f70f48SPawel Wodkowski	echo "BUG: Some configuration options are not present in CONFIG file. Please update this file."
119248f70f48SPawel Wodkowski	echo "Missing options in CONFIG (+) file and in current config (-): "
119348f70f48SPawel Wodkowski	diff -u --label "CONFIG file" --label "CONFIG[@]" \
1194f8d6541dSMichal Berger		<(sed -r -e '/^[[:space:]]*$/d; /^[[:space:]]*#.*/d; s/(CONFIG_[[:alnum:]_]+)=.*/\1/g' CONFIG | sort) \
1195bb0f78a2SMichal Berger		<(printf "CONFIG_%s\n" "${!CONFIG[@]}" | sort)
119648f70f48SPawel Wodkowski	exit 1
119748f70f48SPawel Wodkowskifi
119848f70f48SPawel Wodkowski
119985bc2bbeSPawel Wodkowskiecho -n "Creating mk/config.mk..."
1200e62a3c65SSeth Howellcp -f $rootdir/CONFIG $rootdir/mk/config.mk
120151ab849bSJim HarrisARGS=$(echo "$@" | sed 's/ /\\ /g')
120251ab849bSJim Harrissed -i.bak -r "s#__CONFIGURE_OPTIONS__#${ARGS}#g" $rootdir/mk/config.mk
1203bb0f78a2SMichal Bergerfor key in "${!CONFIG[@]}"; do
1204f8d6541dSMichal Berger	sed -i.bak -r "s#[[:space:]]*CONFIG_${key}=.*#CONFIG_${key}\?=${CONFIG[$key]}#g" $rootdir/mk/config.mk
1205577df16aSPawel Wodkowskidone
1206577df16aSPawel Wodkowski# On FreeBSD sed -i 'SUFFIX' - SUFFIX is mandatory. So no way but to delete the backed file.
1207e62a3c65SSeth Howellrm -f $rootdir/mk/config.mk.bak
1208baa6eac0SDarek Stojaczykecho "done."
12099dd998cdSBen Walker
121008ec96ebSDaniel Verkamp# Environment variables
1211baa6eac0SDarek Stojaczykecho -n "Creating mk/cc.flags.mk..."
1212e62a3c65SSeth Howellrm -f $rootdir/mk/cc.flags.mk
1213e62a3c65SSeth Howell[ -n "$CFLAGS" ] && echo "CFLAGS?=$CFLAGS" > $rootdir/mk/cc.flags.mk
1214e62a3c65SSeth Howell[ -n "$CXXFLAGS" ] && echo "CXXFLAGS?=$CXXFLAGS" >> $rootdir/mk/cc.flags.mk
1215e62a3c65SSeth Howell[ -n "$LDFLAGS" ] && echo "LDFLAGS?=$LDFLAGS" >> $rootdir/mk/cc.flags.mk
1216e62a3c65SSeth Howell[ -n "$DESTDIR" ] && echo "DESTDIR?=$DESTDIR" >> $rootdir/mk/cc.flags.mk
12170b56a5b4SJim Harrisecho "done."
121885bc2bbeSPawel Wodkowski
1219db3ebfe6SMichal Berger# Create .sh with build config for easy sourcing|lookup during the tests.
1220db3ebfe6SMichal Bergerfor conf in "${!CONFIG[@]}"; do
1221db3ebfe6SMichal Berger	echo "CONFIG_$conf=${CONFIG[$conf]}"
1222db3ebfe6SMichal Bergerdone > "$rootdir/test/common/build_config.sh"
1223db3ebfe6SMichal Berger
12245a764955SMichal Bergerif [[ $sys_name == "FreeBSD" ]]; then
1225870ce250SPaul Luse	echo "Type 'gmake' to build."
1226870ce250SPaul Luseelse
12270b56a5b4SJim Harris	echo "Type 'make' to build."
1228870ce250SPaul Lusefi
12299dd998cdSBen Walker
12309dd998cdSBen Walkerexit 0
1231