xref: /spdk/configure (revision 081f8add594e2d188f285968efdeb3a02a91b32d)
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.
52796687dSParameswaran Krishnamurthy#  Copyright (c) 2022 Dell Inc, or its subsidiaries.
6eb53c232Spaul luse#
79dd998cdSBen Walker
89dd998cdSBen Walkerset -e
99dd998cdSBen Walker
1014bbde7bSPawel Wodkowskitrap 'echo -e "\n\nConfiguration failed\n\n" >&2' ERR
1114bbde7bSPawel Wodkowski
12e62a3c65SSeth Howellrootdir=$(readlink -f $(dirname $0))
1365ed6034SMichal Bergersource "$rootdir/scripts/common.sh"
14e62a3c65SSeth Howell
155ccabc8fSMichal Bergerfunction usage() {
169dd998cdSBen Walker	echo "'configure' configures SPDK to compile on supported platforms."
179dd998cdSBen Walker	echo ""
189dd998cdSBen Walker	echo "Usage: ./configure [OPTION]..."
199dd998cdSBen Walker	echo ""
209dd998cdSBen Walker	echo "Defaults for the options are specified in brackets."
219dd998cdSBen Walker	echo ""
229dd998cdSBen Walker	echo "General:"
239dd998cdSBen Walker	echo " -h, --help                Display this help and exit"
242e7fe8e8SDaniel Verkamp	echo ""
252e7fe8e8SDaniel Verkamp	echo " --prefix=path             Configure installation prefix (default: /usr/local)"
260e6ddfd6SBen Walker	echo " --target-arch=arch        Target build architecture. Must be a valid GNU arch. Default: native"
272e7fe8e8SDaniel Verkamp	echo ""
283def834cSAmelia Blachuciak	echo " --cross-prefix=prefix     Prefix for cross compilation (default: none)"
293def834cSAmelia Blachuciak	echo "                           example: aarch64-linux-gnu"
30e8863cb7SMichal Berger	echo " --libdir=path             Configure installation path for the libraries (default: \$prefix/lib)"
3173293d73SMarcin Spiewak	echo " --max-lcores=VAL          DPDK configuration. VAL defines maximum number of lcores supported"
3273293d73SMarcin Spiewak	echo "                           by EAL, or enables autodetection if set to 'detect'. When 'detect'"
3373293d73SMarcin Spiewak	echo "                           is specified, DPDK will detect number of cores in the system during"
3473293d73SMarcin Spiewak	echo "                           compilation, and will set maximum number of lcores to this value"
35*081f8addSJim Harris	echo " --max-numa-nodes=VAL      VAL defines maximum number of NUMA nodes supported for iobuf"
36*081f8addSJim Harris	echo "                           buffer pools."
379dd998cdSBen Walker	echo " --enable-debug            Configure for debug builds"
389dd998cdSBen Walker	echo " --enable-werror           Treat compiler warnings as errors"
399dd998cdSBen Walker	echo " --enable-asan             Enable address sanitizer"
409dd998cdSBen Walker	echo " --enable-ubsan            Enable undefined behavior sanitizer"
419dd998cdSBen Walker	echo " --enable-coverage         Enable code coverage tracking"
426d6d1161SDaniel Verkamp	echo " --enable-lto              Enable link-time optimization"
43db5f3612SBen Walker	echo " --enable-pgo-capture[=PATH]      Enable generation of profile guided optimization data"
44db5f3612SBen Walker	echo " --enable-pgo-use[=PATH]   Use previously captured profile guided optimization data"
4591e42257SJim Harris	echo " --enable-cet              Enable Intel Control-flow Enforcement Technology (CET)"
469fcb1cb0STomasz Zawadzki	echo " --disable-tests           Disable building of functional tests"
479fcb1cb0STomasz Zawadzki	echo " --disable-unit-tests      Disable building of unit tests"
489b2c6452SJacek Kalwas	echo " --disable-examples        Disable building of examples"
49119158cdSRajarshi Chowdhury	echo " --disable-apps            Disable building of apps"
509dd998cdSBen Walker	echo ""
519dd998cdSBen Walker	echo "Specifying Dependencies:"
529dd998cdSBen Walker	echo "--with-DEPENDENCY[=path]   Use the given dependency. Optionally, provide the"
539dd998cdSBen Walker	echo "                           path."
549dd998cdSBen Walker	echo "--without-DEPENDENCY       Do not link to the given dependency. This may"
559dd998cdSBen Walker	echo "                           disable features and components."
569dd998cdSBen Walker	echo ""
579dd998cdSBen Walker	echo "Valid dependencies are listed below."
582bc71094SMichal Berger	echo " --with-dpdk[=DIR]         Build against a custom dpdk version. By default, the dpdk"
592bc71094SMichal Berger	echo " --without-dpdk            submodule in spdk tree will be used."
609dd998cdSBen Walker	echo "                           example: /usr/share/dpdk/x86_64-default-linuxapp-gcc"
612bc71094SMichal Berger	echo " --with-env=DIR            Use an alternate environment implementation instead of DPDK."
6206cc8045SBen Walker	echo "                           Implies --without-dpdk."
632bc71094SMichal Berger	echo " --with-idxd               Build the IDXD library and accel framework plug-in module."
642bc71094SMichal Berger	echo " --without-idxd            Disabled while experimental. Only built for x86 when enabled."
65784b9d48SAlexey Marchuk	echo " --with-crypto             Build isa-l-crypto and vbdev crypto module. No path required."
66784b9d48SAlexey Marchuk	echo " --without-crypto          Disable isa-l-crypto and vbdev crypto module."
672bc71094SMichal Berger	echo " --with-fio[=DIR]          Build fio_plugin."
682bc71094SMichal Berger	echo " --without-fio             default: /usr/src/fio"
696f338d4bSKrishna Kanth Reddy	echo " --with-xnvme              Build xNVMe bdev module."
706f338d4bSKrishna Kanth Reddy	echo " --without-xnvme           No path required."
712bc71094SMichal Berger	echo " --with-vhost              Build vhost target. Enabled by default."
722bc71094SMichal Berger	echo " --without-vhost           No path required."
732bc71094SMichal Berger	echo " --with-virtio             Build vhost initiator and virtio-pci bdev modules."
742bc71094SMichal Berger	echo " --without-virtio          No path required."
75e50ade31SChangpeng Liu	echo " --with-vfio-user[=DIR]    Build custom vfio-user transport for NVMf target and vfio-user target."
76e50ade31SChangpeng Liu	echo "                           vfio-user initiator is always built-in in Linux."
772f731c63SGangCao	echo "                           example: /usr/src/libvfio-user"
782f731c63SGangCao	echo " --without-vfio-user       No path required."
7919e2dc38Spaul luse	echo " --with-vbdev-compress     Build vbdev compression module and dependencies."
8019e2dc38Spaul luse	echo " --without-vbdev-compress  No path required."
81976f8b09Spaul luse	echo " --with-dpdk-compressdev   Build accel DPDK compression module and dependencies."
82976f8b09Spaul luse	echo " --without-dpdk-compressdev No path required."
832bc71094SMichal Berger	echo " --with-rbd                Build Ceph RBD bdev module."
842bc71094SMichal Berger	echo " --without-rbd             No path required."
85ed2b53f3SYifan Bian	echo " --with-ublk               Build ublk library."
86ed2b53f3SYifan Bian	echo " --without-ublk            No path required."
87ef6f8577SJim Harris	echo " --with-rdma[=PROVIDER]    Build RDMA transport for NVMf target and initiator."
882bc71094SMichal Berger	echo " --without-rdma            Accepts optional RDMA provider name. Can be \"verbs\" or \"mlx5_dv\"."
89daee62a0SAlexey Marchuk	echo "                           If no provider specified, \"verbs\" provider is used by default."
902bc71094SMichal Berger	echo " --with-fc[=DIR]           Build FC transport for NVMf target."
912bc71094SMichal Berger	echo " --without-fc              If an argument is provided, it is considered a directory containing"
92ed56a3d4SAnil Veerabhadrappa	echo "                           libufc.a and fc_lld.h. Otherwise the regular system paths will"
93ed56a3d4SAnil Veerabhadrappa	echo "                           be searched."
94044bb175SDenis Barakthanov	echo " --with-daos[=DIR]         Build DAOS bdev module."
952e283fcbS0xe0f	echo " --without-daos            No path required."
962bc71094SMichal Berger	echo " --with-shared             Build spdk shared libraries."
972bc71094SMichal Berger	echo " --without-shared          No path required."
982bc71094SMichal Berger	echo " --with-iscsi-initiator    Build with iscsi bdev module."
992bc71094SMichal Berger	echo " --without-iscsi-initiator No path required."
1006a2ba2d8SMichal Berger	echo " --with-vtune=DIR          Required to profile I/O under Intel VTune Profiler."
1016a2ba2d8SMichal Berger	echo "                           example: /opt/intel/oneapi/vtune/version"
1026a2ba2d8SMichal Berger	echo " --without-vtune           Support for Intel VTune Profiler will not be provided."
103b4d441fdSAmir Haroush	echo " --with-ocf[=DIR]          Build OCF library and bdev module."
1042bc71094SMichal Berger	echo " --without-ocf             If argument is directory, interpret it as root of OCF repo"
105d1fee489SVitaliy Mysak	echo "                           If argument is file, interpret it as compiled OCF lib"
10698d60de6SPiotr Pelplinski	echo "                           If no argument is specified, OCF git submodule is used by default"
107d1fee489SVitaliy Mysak	echo "                           example: /usr/src/ocf/"
1082bc71094SMichal Berger	echo " --with-uring[=DIR]        Build I/O uring bdev or socket module."
1092bc71094SMichal Berger	echo " --without-uring           If an argument is provided, it is considered a directory containing"
110161c88a0SDarek Stojaczyk	echo "                           liburing.a and io_uring.h. Otherwise the regular system paths will"
111161c88a0SDarek Stojaczyk	echo "                           be searched."
11213603217SZhangfei Gao	echo " --with-dpdk-uadk          Build uadk DPDK module. No path required."
11313603217SZhangfei Gao	echo " --without-dpdk-uadk       Disable uadk DPDK module."
114958d196cSIndraneel M	echo " --without-uring-zns       Build I/O uring module without ZNS (zoned namespaces) support."
11534192459SBoris Glimcher	echo " --with-openssl[=DIR]      Build OPENSSL with custom path. Otherwise the regular system paths will"
11634192459SBoris Glimcher	echo "                           be searched."
1172bc71094SMichal Berger	echo " --with-fuse               Build FUSE components for mounting a blobfs filesystem."
1182bc71094SMichal Berger	echo " --without-fuse            No path required."
1192bc71094SMichal Berger	echo " --with-nvme-cuse          Build NVMe driver with support for CUSE-based character devices."
1202bc71094SMichal Berger	echo " --without-nvme-cuse       No path required."
12183a4b155SArtur Paszkiewicz	echo " --with-raid5f             Build with bdev_raid module RAID5f support."
12283a4b155SArtur Paszkiewicz	echo " --without-raid5f          No path required."
1232bc71094SMichal Berger	echo " --with-wpdk=DIR           Build using WPDK to provide support for Windows (experimental)."
1242bc71094SMichal Berger	echo " --without-wpdk            The argument must be a directory containing lib and include."
1252bc71094SMichal Berger	echo " --with-usdt               Build with userspace DTrace probes enabled."
1262bc71094SMichal Berger	echo " --without-usdt            No path required."
127050565e5SJim Harris	echo " --with-fuzzer             Build with LLVM fuzzing enabled."
128050565e5SJim Harris	echo "                           Path to clang_rt.fuzzer_no_main library required."
129050565e5SJim Harris	echo "                           Requires setting CC and CXX to clang."
130050565e5SJim Harris	echo "                           (Typically /usr/lib/llvm-VER/lib/clang/VER/lib/linux/libclang_rt.fuzzer_no_main-ARCH.a)"
131509241ceSKonrad Sztyber	echo " --with-sma                Generate Storage Management Agent's protobuf interface"
132509241ceSKonrad Sztyber	echo " --without-sma             No path required."
1332796687dSParameswaran Krishnamurthy	echo " --with-avahi              Build with Avahi mDNS discovery client service enabled in bdev-nvme module."
1342796687dSParameswaran Krishnamurthy	echo " --without-avahi           No path required."
1351e46e023SMaciej Mis	echo " --with-golang             Build with components written in Go"
1361e46e023SMaciej Mis	echo " --without-golang          No path required."
137e21c39aaSAnton Nayshtut	echo " --with-aio-fsdev          Build aio FSDEV component."
138e21c39aaSAnton Nayshtut	echo " --without-aio-fsdev       No path required."
1399dd998cdSBen Walker	echo ""
14008ec96ebSDaniel Verkamp	echo "Environment variables:"
14108ec96ebSDaniel Verkamp	echo ""
14273439e6fSBen Walker	echo "CC                         C compiler"
14308ec96ebSDaniel Verkamp	echo "CFLAGS                     C compiler flags"
14473439e6fSBen Walker	echo "CXX                        C++ compiler"
14508ec96ebSDaniel Verkamp	echo "CXXFLAGS                   C++ compiler flags"
14673439e6fSBen Walker	echo "LD                         Linker"
14708ec96ebSDaniel Verkamp	echo "LDFLAGS                    Linker flags"
14808ec96ebSDaniel Verkamp	echo "DESTDIR                    Destination for 'make install'"
14908ec96ebSDaniel Verkamp	echo ""
1509dd998cdSBen Walker}
1519dd998cdSBen Walker
152577df16aSPawel Wodkowski# Load default values
153ff238359SJosh Soref# Convert config to sourceable configuration file
154e62a3c65SSeth Howellsed -r 's/CONFIG_([[:alnum:]_]+)=(.*)/CONFIG[\1]=\2/g' $rootdir/CONFIG > $rootdir/CONFIG.sh
155577df16aSPawel Wodkowskideclare -A CONFIG
156e62a3c65SSeth Howellsource $rootdir/CONFIG.sh
157e62a3c65SSeth Howellrm $rootdir/CONFIG.sh
158577df16aSPawel Wodkowski
15911a5716dSMichal Berger# Try to expand literal ~ that might have been passed as an option via --long-opt=~/dir.
16011a5716dSMichal Bergerset -- "${@//\~/~}"
16111a5716dSMichal Berger
1624d2e26d8STomasz Zawadzkifor i in "$@"; do
1634d2e26d8STomasz Zawadzki	case "$i" in
1644d2e26d8STomasz Zawadzki		--cross-prefix=*)
1654d2e26d8STomasz Zawadzki			CONFIG[CROSS_PREFIX]="${i#*=}"
1664d2e26d8STomasz Zawadzki			;;
1674d2e26d8STomasz Zawadzki		--enable-lto)
1684d2e26d8STomasz Zawadzki			CONFIG[LTO]=y
1694d2e26d8STomasz Zawadzki			;;
1704d2e26d8STomasz Zawadzki		--disable-lto)
1714d2e26d8STomasz Zawadzki			CONFIG[LTO]=n
1724d2e26d8STomasz Zawadzki			;;
1734d2e26d8STomasz Zawadzki	esac
1744d2e26d8STomasz Zawadzkidone
1754d2e26d8STomasz Zawadzki
176873c8748STomasz Kulasek# Detect the compiler toolchain
177873c8748STomasz Kulasek$rootdir/scripts/detect_cc.sh --cc="$CC" --cxx="$CXX" --lto="${CONFIG[LTO]}" --ld="$LD" --cross-prefix="${CONFIG[CROSS_PREFIX]}" > $rootdir/mk/cc.mk
178873c8748STomasz Kulasek
179a32086acSMichal Bergermapfile -t cc < <(grep "=" "$rootdir/mk/cc.mk")
180a32086acSMichal Bergersource <(printf '%q\n' "${cc[@]}")
1817a186735SMichal BergerCC=$DEFAULT_CC
182873c8748STomasz Kulasek
183873c8748STomasz Kulasekarch=$($CC -dumpmachine)
1845a764955SMichal Bergersys_name=$(uname -s)
185873c8748STomasz Kulasek
1869854c138SNick Connollyif [[ $arch == *mingw* ]] || [[ $arch == *windows* ]]; then
1879854c138SNick Connolly	sys_name=Windows
1889854c138SNick Connollyfi
1899854c138SNick Connolly
1902a0c2a2dSNick Connollyif [[ $sys_name != "Linux" ]]; then
191873c8748STomasz Kulasek	# Vhost, rte_vhost library and virtio are only supported on Linux.
192873c8748STomasz Kulasek	CONFIG[VHOST]="n"
193873c8748STomasz Kulasek	CONFIG[VIRTIO]="n"
19468b467b7SJim Harris	CONFIG[NVME_CUSE]="n"
19568b467b7SJim Harris	echo "Notice: Vhost, rte_vhost library, virtio, and fuse"
19668b467b7SJim Harris	echo "are only supported on Linux. Turning off default feature."
197873c8748STomasz Kulasekfi
198873c8748STomasz Kulasek
1991723a800SGangCaofunction check_dir() {
2001723a800SGangCao	arg="$1"
2011723a800SGangCao	dir="${arg#*=}"
2021723a800SGangCao	if [ ! -d "$dir" ]; then
2031723a800SGangCao		echo "$arg: directory not found"
2041723a800SGangCao		exit 1
2051723a800SGangCao	fi
2061723a800SGangCao}
2071723a800SGangCao
2087b04eb72SYuriy Umanets# On x86_64 'clang -dumpmachine' produces x86_64-pc-linux-gnu
2097b04eb72SYuriy Umanets# whereas the dpdk might be built with gcc and its libs lie in
210acd2cc94STomasz Zawadzki# x86_64-linux-gnu. Let's find the right libdir for dpdk libs.
2117b04eb72SYuriy Umanetsfunction find_dpdk_arch_libdir() {
212acd2cc94STomasz Zawadzki	local dpdk_libdir="$1/lib"
213acd2cc94STomasz Zawadzki
214acd2cc94STomasz Zawadzki	# Use libdir with 'lib' or 'lib64'
215acd2cc94STomasz Zawadzki	if [[ ! -d "$dpdk_libdir" ]]; then
216acd2cc94STomasz Zawadzki		dpdk_libdir+="64"
217acd2cc94STomasz Zawadzki	fi
2187b04eb72SYuriy Umanets
2197b04eb72SYuriy Umanets	# Checking first what we have with $arch, then clang
2207b04eb72SYuriy Umanets	# variant of arch.
2217b04eb72SYuriy Umanets	arches=("$arch" "$(echo $arch | sed 's/-pc//g')")
2227b04eb72SYuriy Umanets	for a in "${arches[@]}"; do
223acd2cc94STomasz Zawadzki		local libdir_arch="$dpdk_libdir/$a"
224acd2cc94STomasz Zawadzki		if [[ -d "$libdir_arch" ]]; then
225acd2cc94STomasz Zawadzki			echo "$libdir_arch"
2267b04eb72SYuriy Umanets			return
2277b04eb72SYuriy Umanets		fi
2287b04eb72SYuriy Umanets	done
2297b04eb72SYuriy Umanets
2307b04eb72SYuriy Umanets	# Fallback to the libdir without arch component
231acd2cc94STomasz Zawadzki	echo "$dpdk_libdir"
2327b04eb72SYuriy Umanets}
2337b04eb72SYuriy Umanets
234f1980244SYuriy Umanetsfunction check_IPSec_mb() {
235f1980244SYuriy Umanets	local mode=$1
236f1980244SYuriy Umanets	local dpdk_libdir=$2
237f1980244SYuriy Umanets	local dpdk_incdir=$3
238f1980244SYuriy Umanets	local have_ipsec_mb=n
239f1980244SYuriy Umanets
240f1980244SYuriy Umanets	if [[ $mode = "pkg-config" ]]; then
241f1980244SYuriy Umanets		local dpdk_libs
242f1980244SYuriy Umanets
243f1980244SYuriy Umanets		# Request libdpdk pkg-config settings to figure out if the IPSec_MB is used
244f1980244SYuriy Umanets		# as a dependency.
245f1980244SYuriy Umanets		# Due to some reason pkg-config shows -lIPSec_MB only with --static option
246f13ec525SKarol Latecki		dpdk_libs=$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --libs --static libdpdk)
247f1980244SYuriy Umanets		if echo "$dpdk_libs" | grep "\-lIPSec_MB" > /dev/null 2>&1; then
248f1980244SYuriy Umanets			have_ipsec_mb=y
249f1980244SYuriy Umanets		fi
250f1980244SYuriy Umanets	elif [[ $mode = "build-config" ]]; then
251f1980244SYuriy Umanets		# Use dpdk build config header to check if the IPSec_MB was used.
252f1980244SYuriy Umanets		if grep -F "define RTE_CRYPTO_IPSEC_MB 1" "$dpdk_incdir/rte_build_config.h" > /dev/null 2>&1; then
253f1980244SYuriy Umanets			have_ipsec_mb=y
254f1980244SYuriy Umanets		fi
255f1980244SYuriy Umanets	else
256f1980244SYuriy Umanets		echo "ERROR: Invalid IPSec_MB checking mode $mode."
257f1980244SYuriy Umanets		echo "ERROR: Only \"pkg-config\" and \"build-config\" available."
258f1980244SYuriy Umanets		exit 1
259f1980244SYuriy Umanets	fi
260f1980244SYuriy Umanets	if [[ $have_ipsec_mb = "n" ]]; then
261f1980244SYuriy Umanets		CONFIG[IPSEC_MB]=n
262f1980244SYuriy Umanets		return
263f1980244SYuriy Umanets	fi
264f1980244SYuriy Umanets
265f1980244SYuriy Umanets	# Since we don't know the library path where the IPSec_MB is located
266f1980244SYuriy Umanets	# let's find it out with the ldd utility. This can be a standard location
267f1980244SYuriy Umanets	# or a custom build.
268f1980244SYuriy Umanets	local librte_crypto_ipsec_mb="$dpdk_libdir/librte_crypto_ipsec_mb.so"
269f1980244SYuriy Umanets	if [[ -f "$librte_crypto_ipsec_mb" ]]; then
270f1980244SYuriy Umanets		local ipsec_mb_libdir
271f1980244SYuriy Umanets
272f1980244SYuriy Umanets		ipsec_mb_libdir=$(ldd "$librte_crypto_ipsec_mb" | grep "libIPSec_MB.so" \
273f1980244SYuriy Umanets			| sed -e 's/\s*libIPSec_MB.so.*=>\s//' -e 's/\/libIPSec_MB.so.*$//')
274f1980244SYuriy Umanets		if [[ -d $ipsec_mb_libdir ]]; then
275f1980244SYuriy Umanets			CONFIG[IPSEC_MB]=y
276f1980244SYuriy Umanets			CONFIG[IPSEC_MB_DIR]="$ipsec_mb_libdir"
277f1980244SYuriy Umanets		elif [[ $ipsec_mb_libdir = "not found" ]]; then
278f1980244SYuriy Umanets			# ldconfig cache is broken, old build with refs to non-existing libs, etc.
279f1980244SYuriy Umanets			echo "ERROR: Invalid IPSec_MB installation. Library is not found and/or ldconfig cache is broken!"
280f1980244SYuriy Umanets			exit 1
281f1980244SYuriy Umanets		else
282f1980244SYuriy Umanets			# Failed to check for IPSec_MB lib path. Let's just assume it is lives
283f1980244SYuriy Umanets			# in one of the standard locations (/usr/lib, etc.).
284f1980244SYuriy Umanets			CONFIG[IPSEC_MB]=y
285f1980244SYuriy Umanets		fi
286f1980244SYuriy Umanets	else
287f1980244SYuriy Umanets		# pkg-config says there is IPSec_mb and dpdk lib does not have it. Let's just
288f1980244SYuriy Umanets		# assume it is installed in the system in one of the standard locations.
289f1980244SYuriy Umanets		CONFIG[IPSEC_MB]=y
290f1980244SYuriy Umanets	fi
291f1980244SYuriy Umanets}
292f1980244SYuriy Umanets
2939dd998cdSBen Walkerfor i in "$@"; do
2949dd998cdSBen Walker	case "$i" in
2959dd998cdSBen Walker		-h | --help)
2969dd998cdSBen Walker			usage
2979dd998cdSBen Walker			exit 0
2989dd998cdSBen Walker			;;
2994d2e26d8STomasz Zawadzki		--cross-prefix=*) ;&
3004d2e26d8STomasz Zawadzki		--enable-lto) ;&
3014d2e26d8STomasz Zawadzki		--disable-lto)
3024d2e26d8STomasz Zawadzki			# Options handled before detecting CC.
3034d2e26d8STomasz Zawadzki			;;
3042e7fe8e8SDaniel Verkamp		--prefix=*)
305577df16aSPawel Wodkowski			CONFIG[PREFIX]="${i#*=}"
3062e7fe8e8SDaniel Verkamp			;;
3070e6ddfd6SBen Walker		--target-arch=*)
3080e6ddfd6SBen Walker			CONFIG[ARCH]="${i#*=}"
3090e6ddfd6SBen Walker			;;
310e8863cb7SMichal Berger		--libdir=*)
311e8863cb7SMichal Berger			CONFIG[LIBDIR]="${i#*=}"
312e8863cb7SMichal Berger			;;
3139dd998cdSBen Walker		--enable-debug)
314577df16aSPawel Wodkowski			CONFIG[DEBUG]=y
3159dd998cdSBen Walker			;;
3169dd998cdSBen Walker		--disable-debug)
317577df16aSPawel Wodkowski			CONFIG[DEBUG]=n
3189dd998cdSBen Walker			;;
3199dd998cdSBen Walker		--enable-asan)
320577df16aSPawel Wodkowski			CONFIG[ASAN]=y
3219dd998cdSBen Walker			;;
3229dd998cdSBen Walker		--disable-asan)
323577df16aSPawel Wodkowski			CONFIG[ASAN]=n
3249dd998cdSBen Walker			;;
3259dd998cdSBen Walker		--enable-ubsan)
326577df16aSPawel Wodkowski			CONFIG[UBSAN]=y
3279dd998cdSBen Walker			;;
3289dd998cdSBen Walker		--disable-ubsan)
329577df16aSPawel Wodkowski			CONFIG[UBSAN]=n
3309dd998cdSBen Walker			;;
331830912e2SBen Walker		--enable-tsan)
332577df16aSPawel Wodkowski			CONFIG[TSAN]=y
333830912e2SBen Walker			;;
334830912e2SBen Walker		--disable-tsan)
335577df16aSPawel Wodkowski			CONFIG[TSAN]=n
336830912e2SBen Walker			;;
3379dd998cdSBen Walker		--enable-coverage)
338577df16aSPawel Wodkowski			CONFIG[COVERAGE]=y
3399dd998cdSBen Walker			;;
3409dd998cdSBen Walker		--disable-coverage)
341577df16aSPawel Wodkowski			CONFIG[COVERAGE]=n
3429dd998cdSBen Walker			;;
343995d60f4SBen Walker		--enable-pgo-capture)
344995d60f4SBen Walker			CONFIG[PGO_CAPTURE]=y
345995d60f4SBen Walker			;;
346db5f3612SBen Walker		--enable-pgo-capture=*)
347db5f3612SBen Walker			CONFIG[PGO_CAPTURE]=y
348db5f3612SBen Walker			CONFIG[PGO_DIR]="${i#*=}"
349db5f3612SBen Walker			;;
350995d60f4SBen Walker		--disable-pgo-capture)
351995d60f4SBen Walker			CONFIG[PGO_CAPTURE]=n
352995d60f4SBen Walker			;;
353995d60f4SBen Walker		--enable-pgo-use)
354995d60f4SBen Walker			CONFIG[PGO_USE]=y
355995d60f4SBen Walker			;;
356db5f3612SBen Walker		--enable-pgo-use=*)
357db5f3612SBen Walker			CONFIG[PGO_USE]=y
358db5f3612SBen Walker			CONFIG[PGO_DIR]="${i#*=}"
359db5f3612SBen Walker			;;
360995d60f4SBen Walker		--disable-pgo-use)
361995d60f4SBen Walker			CONFIG[PGO_USE]=n
362995d60f4SBen Walker			;;
3639022a59eSDaniel Verkamp		--enable-tests)
364577df16aSPawel Wodkowski			CONFIG[TESTS]=y
3659022a59eSDaniel Verkamp			;;
3669022a59eSDaniel Verkamp		--disable-tests)
367577df16aSPawel Wodkowski			CONFIG[TESTS]=n
3689022a59eSDaniel Verkamp			;;
3699fcb1cb0STomasz Zawadzki		--enable-unit-tests)
3709fcb1cb0STomasz Zawadzki			CONFIG[UNIT_TESTS]=y
3719fcb1cb0STomasz Zawadzki			;;
3729fcb1cb0STomasz Zawadzki		--disable-unit-tests)
3739fcb1cb0STomasz Zawadzki			CONFIG[UNIT_TESTS]=n
3749fcb1cb0STomasz Zawadzki			;;
3759b2c6452SJacek Kalwas		--enable-examples)
3769b2c6452SJacek Kalwas			CONFIG[EXAMPLES]=y
3779b2c6452SJacek Kalwas			;;
3789b2c6452SJacek Kalwas		--disable-examples)
3799b2c6452SJacek Kalwas			CONFIG[EXAMPLES]=n
3809b2c6452SJacek Kalwas			;;
381119158cdSRajarshi Chowdhury		--enable-apps)
382119158cdSRajarshi Chowdhury			CONFIG[APPS]=y
383119158cdSRajarshi Chowdhury			;;
384119158cdSRajarshi Chowdhury		--disable-apps)
385119158cdSRajarshi Chowdhury			CONFIG[APPS]=N
386119158cdSRajarshi Chowdhury			;;
3879dd998cdSBen Walker		--enable-werror)
388577df16aSPawel Wodkowski			CONFIG[WERROR]=y
3899dd998cdSBen Walker			;;
3909dd998cdSBen Walker		--disable-werror)
391577df16aSPawel Wodkowski			CONFIG[WERROR]=n
3929dd998cdSBen Walker			;;
39391e42257SJim Harris		--enable-cet)
39491e42257SJim Harris			CONFIG[CET]=y
39591e42257SJim Harris			;;
39691e42257SJim Harris		--disable-cet)
39791e42257SJim Harris			CONFIG[CET]=n
39891e42257SJim Harris			;;
3997232c450SMichal Berger		--with-dpdk)
4007b04eb72SYuriy Umanets			# Can we use pkg-config?
4017b04eb72SYuriy Umanets			if command -v "pkg-config" > /dev/null 2>&1 && pkg-config --exists libdpdk; then
4027b04eb72SYuriy Umanets				dpdk_libdir=$(pkg-config --variable=libdir libdpdk)
4037b04eb72SYuriy Umanets				dpdk_libdir=$(readlink -f $dpdk_libdir)
4047b04eb72SYuriy Umanets				dpdk_incdir=$(pkg-config --variable=includedir libdpdk)
4057b04eb72SYuriy Umanets				echo "Using DPDK lib dir $dpdk_libdir"
4067b04eb72SYuriy Umanets				CONFIG[DPDK_LIB_DIR]=$dpdk_libdir
4077b04eb72SYuriy Umanets				CONFIG[DPDK_INC_DIR]=$dpdk_incdir
4087232c450SMichal Berger				CONFIG[DPDK_PKG_CONFIG]=y
4097232c450SMichal Berger				CFLAGS="${CFLAGS:+$CFLAGS }$(pkg-config --cflags libdpdk)"
410f1980244SYuriy Umanets				check_IPSec_mb "pkg-config" "$dpdk_libdir" "$dpdk_incdir"
4117232c450SMichal Berger			else
4127232c450SMichal Berger				echo "libdpdk.pc not found, aborting"
4137232c450SMichal Berger				exit 1
4147232c450SMichal Berger			fi
4157232c450SMichal Berger			;;
41606cc8045SBen Walker		--with-dpdk=*)
41706cc8045SBen Walker			check_dir "$i"
4187b04eb72SYuriy Umanets			dpdk_dir=$(readlink -f ${i#*=})
4197b04eb72SYuriy Umanets			dpdk_libdir=$(find_dpdk_arch_libdir $dpdk_dir)
4207b04eb72SYuriy Umanets			dpdk_incdir="$dpdk_dir/include"
4217b04eb72SYuriy Umanets
4227b04eb72SYuriy Umanets			# Can we use pkg-config?
423f13ec525SKarol Latecki			if command -v "pkg-config" > /dev/null 2>&1 && PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --exists libdpdk; then
4247b04eb72SYuriy Umanets				echo "Using $dpdk_libdir/pkgconfig for additional libs..."
4251e6db5fbSTomasz Zawadzki				sysroot_dir=$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --variable=pc_sysrootdir libdpdk)
426e9438453SJacek Kalwas				dpdk_libdir=$(PKG_CONFIG_SYSROOT_DIR='' PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --variable=libdir libdpdk)
4271e6db5fbSTomasz Zawadzki				dpdk_libdir=$(readlink -f "${sysroot_dir}$dpdk_libdir")
4287b04eb72SYuriy Umanets				if ! echo $dpdk_libdir | grep $dpdk_dir > /dev/null 2>&1; then
4297b04eb72SYuriy Umanets					echo "ERROR: pkg-config reported DPDK libdir $dpdk_libdir is out of the directory specified with --with-dpdk="
4307b04eb72SYuriy Umanets					echo "ERROR: do you have another DPDK installed in the system?"
4317b04eb72SYuriy Umanets					exit 1
4327b04eb72SYuriy Umanets				fi
433f13ec525SKarol Latecki				CFLAGS="${CFLAGS:+$CFLAGS }$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --cflags libdpdk)"
4341e6db5fbSTomasz Zawadzki				dpdk_incdir="${sysroot_dir}$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --variable=includedir libdpdk)"
435f1980244SYuriy Umanets				check_IPSec_mb "pkg-config" "$dpdk_libdir" "$dpdk_incdir"
4363e3fbf91SYuriy Umanets			else
4373e3fbf91SYuriy Umanets				echo "Using $dpdk_incdir/rte_build_config.h for additional libs..."
4383e3fbf91SYuriy Umanets
439f1980244SYuriy Umanets				check_IPSec_mb "build-config" "$dpdk_libdir" "$dpdk_incdir"
4407b04eb72SYuriy Umanets			fi
4417b04eb72SYuriy Umanets			echo "DPDK libraries: $dpdk_libdir"
4427b04eb72SYuriy Umanets			echo "DPDK includes: $dpdk_incdir"
4437b04eb72SYuriy Umanets			CONFIG[DPDK_DIR]=$dpdk_dir
4447b04eb72SYuriy Umanets			CONFIG[DPDK_LIB_DIR]="$dpdk_libdir"
4457b04eb72SYuriy Umanets			CONFIG[DPDK_INC_DIR]="$dpdk_incdir"
4467b04eb72SYuriy Umanets			CONFIG[DPDK_PKG_CONFIG]=n
44706cc8045SBen Walker			;;
44806cc8045SBen Walker		--without-dpdk)
44906cc8045SBen Walker			CONFIG[DPDK_DIR]=
45006cc8045SBen Walker			;;
4519854c138SNick Connolly		--with-wpdk=*)
4529854c138SNick Connolly			check_dir "$i"
4539854c138SNick Connolly			CONFIG[WPDK_DIR]=$(readlink -f ${i#*=})
4549854c138SNick Connolly			;;
4552bc71094SMichal Berger		--without-wpdk)
4562bc71094SMichal Berger			CONFIG[WPDK_DIR]=
4572bc71094SMichal Berger			;;
4589dd998cdSBen Walker		--with-env=*)
459577df16aSPawel Wodkowski			CONFIG[ENV]="${i#*=}"
4609dd998cdSBen Walker			;;
461ed2b53f3SYifan Bian		--with-ublk)
462ed2b53f3SYifan Bian			CONFIG[UBLK]=y
463ed2b53f3SYifan Bian			;;
464ed2b53f3SYifan Bian		--without-ublk)
465ed2b53f3SYifan Bian			CONFIG[UBLK]=n
466ed2b53f3SYifan Bian			;;
4679dd998cdSBen Walker		--with-rbd)
468577df16aSPawel Wodkowski			CONFIG[RBD]=y
4699dd998cdSBen Walker			;;
4709dd998cdSBen Walker		--without-rbd)
471577df16aSPawel Wodkowski			CONFIG[RBD]=n
4729dd998cdSBen Walker			;;
473daee62a0SAlexey Marchuk		--with-rdma=*)
474daee62a0SAlexey Marchuk			CONFIG[RDMA]=y
475daee62a0SAlexey Marchuk			CONFIG[RDMA_PROV]=${i#*=}
476daee62a0SAlexey Marchuk			;;
4779dd998cdSBen Walker		--with-rdma)
478577df16aSPawel Wodkowski			CONFIG[RDMA]=y
479daee62a0SAlexey Marchuk			CONFIG[RDMA_PROV]="verbs"
4809dd998cdSBen Walker			;;
4819dd998cdSBen Walker		--without-rdma)
482577df16aSPawel Wodkowski			CONFIG[RDMA]=n
4839dd998cdSBen Walker			;;
484ed56a3d4SAnil Veerabhadrappa		--with-fc=*)
485ed56a3d4SAnil Veerabhadrappa			CONFIG[FC]=y
486ed56a3d4SAnil Veerabhadrappa			CONFIG[FC_PATH]=$(readlink -f ${i#*=})
487ed56a3d4SAnil Veerabhadrappa			;;
488ed56a3d4SAnil Veerabhadrappa		--with-fc)
489ed56a3d4SAnil Veerabhadrappa			CONFIG[FC]=y
490ed56a3d4SAnil Veerabhadrappa			CONFIG[FC_PATH]=
491ed56a3d4SAnil Veerabhadrappa			;;
492ed56a3d4SAnil Veerabhadrappa		--without-fc)
493ed56a3d4SAnil Veerabhadrappa			CONFIG[FC]=n
494ed56a3d4SAnil Veerabhadrappa			CONFIG[FC_PATH]=
495ed56a3d4SAnil Veerabhadrappa			;;
4962e283fcbS0xe0f		--with-daos)
4972e283fcbS0xe0f			CONFIG[DAOS]=y
498044bb175SDenis Barakthanov			CONFIG[DAOS_DIR]=""
499044bb175SDenis Barakthanov			;;
500044bb175SDenis Barakthanov		--with-daos=*)
501044bb175SDenis Barakthanov			CONFIG[DAOS]=y
502044bb175SDenis Barakthanov			check_dir "$i"
503044bb175SDenis Barakthanov			CONFIG[DAOS_DIR]=$(readlink -f ${i#*=})
5042e283fcbS0xe0f			;;
5052e283fcbS0xe0f		--without-daos)
5062e283fcbS0xe0f			CONFIG[DAOS]=n
5072e283fcbS0xe0f			;;
5080923734cSLance Hartmann		--with-shared)
509577df16aSPawel Wodkowski			CONFIG[SHARED]=y
5100923734cSLance Hartmann			;;
5110923734cSLance Hartmann		--without-shared)
512577df16aSPawel Wodkowski			CONFIG[SHARED]=n
5130923734cSLance Hartmann			;;
5142af15344SJim Harris		--with-iscsi-initiator)
515577df16aSPawel Wodkowski			CONFIG[ISCSI_INITIATOR]=y
5162af15344SJim Harris			;;
5172af15344SJim Harris		--without-iscsi-initiator)
518577df16aSPawel Wodkowski			CONFIG[ISCSI_INITIATOR]=n
5192af15344SJim Harris			;;
5206118b853SDaniel Verkamp		--with-crypto)
521577df16aSPawel Wodkowski			CONFIG[CRYPTO]=y
5226118b853SDaniel Verkamp			;;
5236118b853SDaniel Verkamp		--without-crypto)
524577df16aSPawel Wodkowski			CONFIG[CRYPTO]=n
5256118b853SDaniel Verkamp			;;
52613603217SZhangfei Gao		--with-dpdk-uadk)
52713603217SZhangfei Gao			CONFIG[DPDK_UADK]=y
52813603217SZhangfei Gao			;;
52913603217SZhangfei Gao		--without-dpdk-uadk)
53013603217SZhangfei Gao			CONFIG[DPDK_UADK]=n
53113603217SZhangfei Gao			;;
53235260f2bSDaniel Verkamp		--with-vhost)
533577df16aSPawel Wodkowski			CONFIG[VHOST]=y
53435260f2bSDaniel Verkamp			;;
53535260f2bSDaniel Verkamp		--without-vhost)
536577df16aSPawel Wodkowski			CONFIG[VHOST]=n
53735260f2bSDaniel Verkamp			;;
5387dee96ceSDariusz Stojaczyk		--with-virtio)
539577df16aSPawel Wodkowski			CONFIG[VIRTIO]=y
5407dee96ceSDariusz Stojaczyk			;;
5417dee96ceSDariusz Stojaczyk		--without-virtio)
542577df16aSPawel Wodkowski			CONFIG[VIRTIO]=n
5437dee96ceSDariusz Stojaczyk			;;
544b30d57cdSChangpeng Liu		--with-vfio-user)
545b30d57cdSChangpeng Liu			CONFIG[VFIO_USER]=y
546d0b2448bSChangpeng Liu			CONFIG[VFIO_USER_DIR]=""
547d0b2448bSChangpeng Liu			;;
548d0b2448bSChangpeng Liu		--with-vfio-user=*)
549d0b2448bSChangpeng Liu			CONFIG[VFIO_USER]=y
550d0b2448bSChangpeng Liu			check_dir "$i"
551d0b2448bSChangpeng Liu			CONFIG[VFIO_USER_DIR]=$(readlink -f ${i#*=})
552b30d57cdSChangpeng Liu			;;
553b30d57cdSChangpeng Liu		--without-vfio-user)
554b30d57cdSChangpeng Liu			CONFIG[VFIO_USER]=n
555b30d57cdSChangpeng Liu			;;
55619e2dc38Spaul luse		--with-vbdev-compress)
55719e2dc38Spaul luse			CONFIG[VBDEV_COMPRESS]=y
55897022803SJim Harris			;;
55919e2dc38Spaul luse		--without-vbdev-compress)
56019e2dc38Spaul luse			CONFIG[VBDEV_COMPRESS]=n
56197022803SJim Harris			;;
562976f8b09Spaul luse		--with-dpdk-compressdev)
563976f8b09Spaul luse			CONFIG[DPDK_COMPRESSDEV]=y
564976f8b09Spaul luse			;;
565976f8b09Spaul luse		--without-dpdk-compressdev)
566976f8b09Spaul luse			CONFIG[DPDK_COMPRESSDEV]=n
567976f8b09Spaul luse			;;
5686f338d4bSKrishna Kanth Reddy		--with-xnvme)
5696f338d4bSKrishna Kanth Reddy			CONFIG[XNVME]=y
5706f338d4bSKrishna Kanth Reddy			;;
5716f338d4bSKrishna Kanth Reddy		--without-xnvme)
5726f338d4bSKrishna Kanth Reddy			CONFIG[XNVME]=n
5736f338d4bSKrishna Kanth Reddy			;;
574c3329b52SMichal Berger		--with-fio) ;&
5759dd998cdSBen Walker		--with-fio=*)
576c3329b52SMichal Berger			if [[ ${i#*=} != "$i" ]]; then
57711a5716dSMichal Berger				CONFIG[FIO_SOURCE_DIR]=${i#*=}
578c3329b52SMichal Berger			fi
579c3329b52SMichal Berger			check_dir "--with-fio=${CONFIG[FIO_SOURCE_DIR]}"
58011a5716dSMichal Berger			CONFIG[FIO_SOURCE_DIR]=$(readlink -f "${CONFIG[FIO_SOURCE_DIR]}")
581577df16aSPawel Wodkowski			CONFIG[FIO_PLUGIN]=y
5829dd998cdSBen Walker			;;
5839dd998cdSBen Walker		--without-fio)
584577df16aSPawel Wodkowski			CONFIG[FIO_PLUGIN]=n
5859dd998cdSBen Walker			;;
5865712088aSRoman Sudarikov		--with-vtune=*)
5871723a800SGangCao			check_dir "$i"
588577df16aSPawel Wodkowski			CONFIG[VTUNE_DIR]="${i#*=}"
589577df16aSPawel Wodkowski			CONFIG[VTUNE]=y
5905712088aSRoman Sudarikov			;;
5915712088aSRoman Sudarikov		--without-vtune)
592577df16aSPawel Wodkowski			CONFIG[VTUNE_DIR]=
593577df16aSPawel Wodkowski			CONFIG[VTUNE]=n
5945712088aSRoman Sudarikov			;;
59598d60de6SPiotr Pelplinski		--with-ocf)
59698d60de6SPiotr Pelplinski			CONFIG[OCF]=y
597985d6468SKamil Godzwon			CONFIG[OCF_PATH]=$(readlink -f "$rootdir/ocf")
59898d60de6SPiotr Pelplinski			;;
599d1fee489SVitaliy Mysak		--with-ocf=*)
600d1fee489SVitaliy Mysak			CONFIG[OCF]=y
601d1fee489SVitaliy Mysak			CONFIG[OCF_PATH]=$(readlink -f ${i#*=})
602d1fee489SVitaliy Mysak			;;
603d1fee489SVitaliy Mysak		--without-ocf)
604d1fee489SVitaliy Mysak			CONFIG[OCF]=n
605d1fee489SVitaliy Mysak			CONFIG[OCF_PATH]=
606d1fee489SVitaliy Mysak			;;
6078165bf71SBen Walker		--with-uring=*)
6088165bf71SBen Walker			CONFIG[URING]=y
6098165bf71SBen Walker			CONFIG[URING_PATH]=$(readlink -f ${i#*=})
6108165bf71SBen Walker			;;
6118165bf71SBen Walker		--with-uring)
6128165bf71SBen Walker			CONFIG[URING]=y
613958d196cSIndraneel M			CONFIG[URING_ZNS]=y
6148165bf71SBen Walker			CONFIG[URING_PATH]=
6158165bf71SBen Walker			;;
6168165bf71SBen Walker		--without-uring)
6178165bf71SBen Walker			CONFIG[URING]=n
6188165bf71SBen Walker			CONFIG[URING_PATH]=
6198165bf71SBen Walker			;;
620958d196cSIndraneel M		--without-uring-zns)
621958d196cSIndraneel M			CONFIG[URING_ZNS]=n
6228b840195SIndraneel M			;;
62334192459SBoris Glimcher		--with-openssl=*)
62434192459SBoris Glimcher			check_dir "$i"
62534192459SBoris Glimcher			CONFIG[OPENSSL_PATH]=$(readlink -f ${i#*=})
62634192459SBoris Glimcher			;;
6277fa15e28SXiaodong Liu		--with-fuse)
6287fa15e28SXiaodong Liu			CONFIG[FUSE]=y
6297fa15e28SXiaodong Liu			;;
6307fa15e28SXiaodong Liu		--without-fuse)
6317fa15e28SXiaodong Liu			CONFIG[FUSE]=n
6327fa15e28SXiaodong Liu			;;
633805d9942STomasz Kulasek		--with-nvme-cuse)
634805d9942STomasz Kulasek			CONFIG[NVME_CUSE]=y
635805d9942STomasz Kulasek			;;
636805d9942STomasz Kulasek		--without-nvme-cuse)
637805d9942STomasz Kulasek			CONFIG[NVME_CUSE]=n
638805d9942STomasz Kulasek			;;
63983a4b155SArtur Paszkiewicz		--with-raid5f)
64083a4b155SArtur Paszkiewicz			CONFIG[RAID5F]=y
64173763d40SArtur Paszkiewicz			;;
64283a4b155SArtur Paszkiewicz		--without-raid5f)
64383a4b155SArtur Paszkiewicz			CONFIG[RAID5F]=n
64473763d40SArtur Paszkiewicz			;;
645e58e9fbdSpaul luse		--with-idxd)
646e58e9fbdSpaul luse			CONFIG[IDXD]=y
6472ed914f8SZiye Yang			CONFIG[IDXD_KERNEL]=n
648e58e9fbdSpaul luse			;;
649e58e9fbdSpaul luse		--without-idxd)
650e58e9fbdSpaul luse			CONFIG[IDXD]=n
651e58e9fbdSpaul luse			;;
6525a1c74bfSJim Harris		--with-usdt)
6535a1c74bfSJim Harris			CONFIG[USDT]=y
6545a1c74bfSJim Harris			;;
6555a1c74bfSJim Harris		--without-usdt)
6565a1c74bfSJim Harris			CONFIG[USDT]=n
6575a1c74bfSJim Harris			;;
658050565e5SJim Harris		--with-fuzzer)
659050565e5SJim Harris			echo "Must specify fuzzer library path with --with-fuzzer"
660050565e5SJim Harris			usage
661050565e5SJim Harris			exit 1
662050565e5SJim Harris			;;
663050565e5SJim Harris		--with-fuzzer=*)
664050565e5SJim Harris			CONFIG[FUZZER]=y
665050565e5SJim Harris			CONFIG[FUZZER_LIB]=$(readlink -f ${i#*=})
666050565e5SJim Harris			;;
667050565e5SJim Harris		--without-fuzzer)
668050565e5SJim Harris			CONFIG[FUZZER]=n
669050565e5SJim Harris			CONFIG[FUZZER_LIB]=
670050565e5SJim Harris			;;
671509241ceSKonrad Sztyber		--with-sma)
672509241ceSKonrad Sztyber			CONFIG[SMA]=y
673509241ceSKonrad Sztyber			;;
674509241ceSKonrad Sztyber		--without-sma)
675509241ceSKonrad Sztyber			CONFIG[SMA]=n
676509241ceSKonrad Sztyber			;;
6772796687dSParameswaran Krishnamurthy		--with-avahi)
6782796687dSParameswaran Krishnamurthy			CONFIG[AVAHI]=y
6792796687dSParameswaran Krishnamurthy			;;
6802796687dSParameswaran Krishnamurthy		--without-avahi)
6812796687dSParameswaran Krishnamurthy			CONFIG[AVAHI]=n
6822796687dSParameswaran Krishnamurthy			;;
6831e46e023SMaciej Mis		--with-golang)
6841e46e023SMaciej Mis			CONFIG[GOLANG]=y
6851e46e023SMaciej Mis			;;
6861e46e023SMaciej Mis		--without-golang)
6871e46e023SMaciej Mis			CONFIG[GOLANG]=n
6881e46e023SMaciej Mis			;;
6898247bd40SMarcin Spiewak		--max-lcores='')
6908247bd40SMarcin Spiewak			echo "Must specify max number of lcores for --max-lcores"
6918247bd40SMarcin Spiewak			usage
6928247bd40SMarcin Spiewak			exit 1
6938247bd40SMarcin Spiewak			;;
6948247bd40SMarcin Spiewak		--max-lcores=*)
6958247bd40SMarcin Spiewak			CONFIG[MAX_LCORES]="${i#*=}"
69673293d73SMarcin Spiewak			CONFIG["MAX_LCORES"]=${CONFIG["MAX_LCORES"],,}
6978247bd40SMarcin Spiewak			;;
698*081f8addSJim Harris		--max-numa-nodes='')
699*081f8addSJim Harris			echo "Must specify max number of nodes for --max-numa-nodes"
700*081f8addSJim Harris			usage
701*081f8addSJim Harris			exit 1
702*081f8addSJim Harris			;;
703*081f8addSJim Harris		--max-numa-nodes=*)
704*081f8addSJim Harris			CONFIG[MAX_NUMA_NODES]="${i#*=}"
705*081f8addSJim Harris			CONFIG["MAX_NUMA_NODES"]=${CONFIG["MAX_NUMA_NODES"],,}
706*081f8addSJim Harris			;;
707e21c39aaSAnton Nayshtut		--with-aio-fsdev)
708e21c39aaSAnton Nayshtut			CONFIG[AIO_FSDEV]=y
709e21c39aaSAnton Nayshtut			AIO_FSDEV_REQUIRED=y
710e21c39aaSAnton Nayshtut			;;
711e21c39aaSAnton Nayshtut		--without-aio-fsdev)
712e21c39aaSAnton Nayshtut			CONFIG[AIO_FSDEV]=n
713e21c39aaSAnton Nayshtut			;;
7149dd998cdSBen Walker		--)
7159dd998cdSBen Walker			break
7169dd998cdSBen Walker			;;
7179dd998cdSBen Walker		*)
7189dd998cdSBen Walker			echo "Unrecognized option $i"
7199dd998cdSBen Walker			usage
7209dd998cdSBen Walker			exit 1
7215ccabc8fSMichal Berger			;;
7229dd998cdSBen Walker	esac
7239dd998cdSBen Walkerdone
7249dd998cdSBen Walker
725131c9aadSAlexey Marchukif [[ $arch == x86_64* ]]; then
72610e1c615SFélix Piédallu	BUILD_CMD=($CC -o /dev/null -x c $CPPFLAGS $CFLAGS $LDFLAGS "-march=native")
727131c9aadSAlexey Marchukelse
72810e1c615SFélix Piédallu	BUILD_CMD=($CC -o /dev/null -x c $CPPFLAGS $CFLAGS $LDFLAGS)
729131c9aadSAlexey Marchukfi
7306c23a6f4SMichal BergerBUILD_CMD+=(-I/usr/local/include -L/usr/local/lib)
731d0f57d15SMichal BergerBUILD_CMD+=("-fuse-ld=$LD_TYPE")
732fc8dece0SKonrad Sztyberif [[ -n "${CONFIG[OPENSSL_PATH]}" ]]; then
733fc8dece0SKonrad Sztyber	BUILD_CMD+=("-I${CONFIG[OPENSSL_PATH]}/include" "-L${CONFIG[OPENSSL_PATH]}")
734fc8dece0SKonrad Sztyberfi
73573439e6fSBen Walker
736b30d57cdSChangpeng Liuif [[ "${CONFIG[VFIO_USER]}" = "y" ]]; then
737421368c0SGreg Inozemtsev	if ! echo -e '#include <json-c/json.h>' \
738421368c0SGreg Inozemtsev		| "${BUILD_CMD[@]}" -E - 2> /dev/null; then
7393b673b84SChangpeng Liu		echo "ERROR: --with-vfio-user requires json-c-devel"
7403b673b84SChangpeng Liu		echo "Please install then re-run this script"
7413b673b84SChangpeng Liu		exit 1
7423b673b84SChangpeng Liu	fi
743421368c0SGreg Inozemtsev	if ! echo -e '#include <cmocka.h>' \
744421368c0SGreg Inozemtsev		| "${BUILD_CMD[@]}" -E - 2> /dev/null; then
7453b673b84SChangpeng Liu		echo "ERROR: --with-vfio-user requires libcmocka-devel"
7463b673b84SChangpeng Liu		echo "Please install then re-run this script"
7473b673b84SChangpeng Liu		exit 1
748b30d57cdSChangpeng Liu	fi
749b30d57cdSChangpeng Liufi
750b30d57cdSChangpeng Liu
751e58e9fbdSpaul luse# IDXD uses Intel specific instructions.
752e58e9fbdSpaul luseif [[ "${CONFIG[IDXD]}" = "y" ]]; then
7532755fbdfSpaul luse	if [ $(uname -s) == "FreeBSD" ]; then
7542755fbdfSpaul luse		intel="hw.model: Intel"
7552755fbdfSpaul luse		cpu_vendor=$(sysctl -a | grep hw.model | cut -c 1-15)
7562755fbdfSpaul luse	else
757e58e9fbdSpaul luse		intel="GenuineIntel"
758e58e9fbdSpaul luse		cpu_vendor=$(grep -i 'vendor' /proc/cpuinfo --max-count=1)
7592755fbdfSpaul luse	fi
760e58e9fbdSpaul luse	if [[ "$cpu_vendor" != *"$intel"* ]]; then
76150222f81SYin Congmin		echo "WARNING: IDXD cannot be used due to CPU incompatibility."
762e58e9fbdSpaul luse	fi
7632ed914f8SZiye Yang	if [ -e /usr/include/accel-config/libaccel_config.h ]; then
7642ed914f8SZiye Yang		CONFIG[IDXD_KERNEL]=y
7652ed914f8SZiye Yang	fi
7662ed914f8SZiye Yang
767e58e9fbdSpaul lusefi
768e58e9fbdSpaul luse
769577df16aSPawel Wodkowskiif [ -z "${CONFIG[ENV]}" ]; then
770577df16aSPawel Wodkowski	CONFIG[ENV]=$rootdir/lib/env_dpdk
771577df16aSPawel Wodkowski	echo "Using default SPDK env in ${CONFIG[ENV]}"
7727232c450SMichal Berger	if [[ -z "${CONFIG[DPDK_DIR]}" && "${CONFIG[DPDK_PKG_CONFIG]}" == n ]]; then
77338e26cf5STomasz Zawadzki		if [ ! -f "$rootdir"/dpdk/config/meson.build ]; then
774d199eb29SDaniel Verkamp			echo "DPDK not found; please specify --with-dpdk=<path> or run:"
775d199eb29SDaniel Verkamp			echo
776d199eb29SDaniel Verkamp			echo "  git submodule update --init"
777d199eb29SDaniel Verkamp			exit 1
778577df16aSPawel Wodkowski		else
779577df16aSPawel Wodkowski			CONFIG[DPDK_DIR]="${rootdir}/dpdk/build"
780f1980244SYuriy Umanets			# Default ipsec libs
78119518dfbSAleksey Marchuk			if [[ "${CONFIG[CRYPTO]}" = "y" ]] && [[ $arch = x86_64* ]]; then
782f1980244SYuriy Umanets				CONFIG[IPSEC_MB]=y
783f1980244SYuriy Umanets				CONFIG[IPSEC_MB_DIR]="${rootdir}/intel-ipsec-mb/lib"
784f1980244SYuriy Umanets			fi
785577df16aSPawel Wodkowski			echo "Using default DPDK in ${CONFIG[DPDK_DIR]}"
786d199eb29SDaniel Verkamp		fi
7879dd998cdSBen Walker	fi
7887d2a2f52SBen Walkerelse
7897232c450SMichal Berger	if [[ -n "${CONFIG[DPDK_DIR]}" || "${CONFIG[DPDK_PKG_CONFIG]}" == y ]]; then
79006cc8045SBen Walker		echo "--with-env and --with-dpdk are mutually exclusive."
79106cc8045SBen Walker		exit 1
79206cc8045SBen Walker	fi
79306cc8045SBen Walker
794577df16aSPawel Wodkowski	if [ "${CONFIG[VHOST]}" = "y" ]; then
7957d2a2f52SBen Walker		echo "Vhost is only supported when using the default DPDK environment. Disabling it."
7967d2a2f52SBen Walker	fi
7977d2a2f52SBen Walker	# Always disable vhost, but only print the error message if the user explicitly turned it on.
798577df16aSPawel Wodkowski	CONFIG[VHOST]="n"
799577df16aSPawel Wodkowski	if [ "${CONFIG[VIRTIO]}" = "y" ]; then
8007d2a2f52SBen Walker		echo "Virtio is only supported when using the default DPDK environment. Disabling it."
8017d2a2f52SBen Walker	fi
8027d2a2f52SBen Walker	# Always disable virtio, but only print the error message if the user explicitly turned it on.
803577df16aSPawel Wodkowski	CONFIG[VIRTIO]="n"
8049dd998cdSBen Walkerfi
8059dd998cdSBen Walker
8067232c450SMichal Bergerif [[ "${CONFIG[DPDK_PKG_CONFIG]}" == y ]]; then
8077232c450SMichal Berger	if [[ "${CONFIG[SHARED]}" == n ]]; then
8087232c450SMichal Berger		# dpdk-devel doesn't provide static libs
8097232c450SMichal Berger		echo "Build against packaged DPDK requested, enabling shared libraries"
8107232c450SMichal Berger		CONFIG[SHARED]=y
8117232c450SMichal Berger	fi
8127232c450SMichal Bergerfi
8137232c450SMichal Berger
8149854c138SNick Connollyif [[ $sys_name == "Windows" ]]; then
8159854c138SNick Connolly	if [ -z "${CONFIG[WPDK_DIR]}" ]; then
8169854c138SNick Connolly		if [ ! -f "$rootdir"/wpdk/Makefile ]; then
8179854c138SNick Connolly			echo "WPDK not found; please specify --with-wpdk=<path>. See https://wpdk.github.io."
8189854c138SNick Connolly			exit 1
8199854c138SNick Connolly		else
8209854c138SNick Connolly			CONFIG[WPDK_DIR]="${rootdir}/wpdk/build"
8219854c138SNick Connolly			echo "Using default WPDK in ${CONFIG[WPDK_DIR]}"
8229854c138SNick Connolly		fi
8239854c138SNick Connolly	fi
8249854c138SNick Connollyelse
8259854c138SNick Connolly	if [ -n "${CONFIG[WPDK_DIR]}" ]; then
8269854c138SNick Connolly		echo "ERROR: --with-wpdk is only supported for Windows"
8279854c138SNick Connolly		exit 1
8289854c138SNick Connolly	fi
8299854c138SNick Connollyfi
8309854c138SNick Connolly
831577df16aSPawel Wodkowskiif [ "${CONFIG[VTUNE]}" = "y" ]; then
832577df16aSPawel Wodkowski	if [ -z "${CONFIG[VTUNE_DIR]}" ]; then
8335712088aSRoman Sudarikov		echo "When VTune is enabled, you must specify the VTune directory using --with-vtune=path"
8345712088aSRoman Sudarikov		exit 1
8355712088aSRoman Sudarikov	fi
8365712088aSRoman Sudarikovfi
8375712088aSRoman Sudarikov
838bb0f78a2SMichal Bergerif [[ "${CONFIG[ASAN]}" = "y" && "${CONFIG[TSAN]}" = "y" ]]; then
839830912e2SBen Walker	echo "ERROR: ASAN and TSAN cannot be enabled at the same time."
840830912e2SBen Walker	exit 1
841830912e2SBen Walkerfi
842830912e2SBen Walker
843ac5b53a5SJim Harrisif [[ "${CONFIG[FIO_PLUGIN]}" = "y" && "${CONFIG[EXAMPLES]}" = "n" ]]; then
844ac5b53a5SJim Harris	echo "ERROR: --with-fio and --disable-examples are mutually exclusive."
845ac5b53a5SJim Harris	exit 1
846ac5b53a5SJim Harrisfi
847ac5b53a5SJim Harris
8485a764955SMichal Bergerif [[ $sys_name == "FreeBSD" ]]; then
8495091cadcSPaul Luse	# FreeBSD doesn't support all configurations
850bf30e09aSAnton Nayshtut	CONFIG[FSDEV]=n
8515091cadcSPaul Lusefi
8525091cadcSPaul Luse
85325ac67f1SJim Harrisif [[ $sys_name == "Linux" ]]; then
85425ac67f1SJim Harris	if pkg-config libbsd; then
85525ac67f1SJim Harris		CONFIG[HAVE_LIBBSD]=y
85625ac67f1SJim Harris	fi
85725ac67f1SJim Harrisfi
85825ac67f1SJim Harris
859544a8fe5SJim Harrisif pkg-config libarchive; then
860544a8fe5SJim Harris	CONFIG[HAVE_LIBARCHIVE]=y
861544a8fe5SJim Harrisfi
862544a8fe5SJim Harris
8632a0c2a2dSNick Connollyif [[ $sys_name != "Linux" ]]; then
86427b920a2SDarek Stojaczyk	if [[ "${CONFIG[VHOST]}" == "y" ]]; then
865873c8748STomasz Kulasek		echo "Vhost is only supported on Linux."
866873c8748STomasz Kulasek		exit 1
86727b920a2SDarek Stojaczyk	fi
86827b920a2SDarek Stojaczyk	if [[ "${CONFIG[VIRTIO]}" == "y" ]]; then
869873c8748STomasz Kulasek		echo "Virtio is only supported on Linux."
870873c8748STomasz Kulasek		exit 1
87127b920a2SDarek Stojaczyk	fi
87227b920a2SDarek Stojaczykfi
87327b920a2SDarek Stojaczyk
874577df16aSPawel Wodkowskiif [ "${CONFIG[RDMA]}" = "y" ]; then
875daee62a0SAlexey Marchuk	if [[ ! "${CONFIG[RDMA_PROV]}" == "verbs" ]] && [[ ! "${CONFIG[RDMA_PROV]}" == "mlx5_dv" ]]; then
876daee62a0SAlexey Marchuk		echo "Invalid RDMA provider specified, must be \"verbs\" or \"mlx5_dv\""
877daee62a0SAlexey Marchuk		exit 1
878daee62a0SAlexey Marchuk	fi
879daee62a0SAlexey Marchuk
880eed0c6beSDarek Stojaczyk	if ! echo -e '#include <infiniband/verbs.h>\n#include <rdma/rdma_verbs.h>\n' \
881eed0c6beSDarek Stojaczyk		'int main(void) { return 0; }\n' \
882bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -libverbs -lrdmacm - 2> /dev/null; then
883bb0f78a2SMichal Berger		echo "--with-rdma requires libverbs and librdmacm."
884bb0f78a2SMichal Berger		echo "Please install then re-run this script."
885eed0c6beSDarek Stojaczyk		exit 1
886eed0c6beSDarek Stojaczyk	fi
887eed0c6beSDarek Stojaczyk
888eed0c6beSDarek Stojaczyk	if echo -e '#include <infiniband/verbs.h>\n' \
889eed0c6beSDarek Stojaczyk		'int main(void) { return !!IBV_WR_SEND_WITH_INV; }\n' \
890bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -c - 2> /dev/null; then
891577df16aSPawel Wodkowski		CONFIG[RDMA_SEND_WITH_INVAL]="y"
8927671073bSSeth Howell	else
893577df16aSPawel Wodkowski		CONFIG[RDMA_SEND_WITH_INVAL]="n"
89417a819f8SJim Harris		echo "
8957671073bSSeth Howell*******************************************************************************
8967671073bSSeth HowellWARNING: The Infiniband Verbs opcode Send With Invalidate is either not
8977671073bSSeth Howellsupported or is not functional with the current version of libibverbs installed
8987671073bSSeth Howellon this system. Please upgrade to at least version 1.1.
8997671073bSSeth Howell
9007671073bSSeth HowellBeginning with Linux kernel 4.14, the kernel NVMe-oF initiator leverages Send
9017671073bSSeth HowellWith Invalidate RDMA operations to improve performance. Failing to use the
9027671073bSSeth HowellSend With Invalidate operation on the NVMe-oF target side results in full
9037671073bSSeth Howellfunctionality, but greatly reduced performance. The SPDK NVMe-oF target will
9047671073bSSeth Howellbe unable to leverage that operation using the currently installed version
9057671073bSSeth Howellof libibverbs, so Linux kernel NVMe-oF initiators based on kernels greater
9067671073bSSeth Howellthan or equal to 4.14 will see significantly reduced performance.
90717a819f8SJim Harris*******************************************************************************"
9087671073bSSeth Howell	fi
90994966468SAlexey Marchuk
91094966468SAlexey Marchuk	if echo -e '#include <rdma/rdma_cma.h>\n' \
91194966468SAlexey Marchuk		'int main(void) { return !!RDMA_OPTION_ID_ACK_TIMEOUT; }\n' \
912bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -c - 2> /dev/null; then
91394966468SAlexey Marchuk		CONFIG[RDMA_SET_ACK_TIMEOUT]="y"
91494966468SAlexey Marchuk	else
91594966468SAlexey Marchuk		CONFIG[RDMA_SET_ACK_TIMEOUT]="n"
91694966468SAlexey Marchuk		echo "RDMA_OPTION_ID_ACK_TIMEOUT is not supported"
91794966468SAlexey Marchuk	fi
91894966468SAlexey Marchuk
9197706450fSMichael Haeuptle	if echo -e '#include <rdma/rdma_cma.h>\n' \
9207706450fSMichael Haeuptle		'int main(void) { return !!RDMA_OPTION_ID_TOS; }\n' \
9217706450fSMichael Haeuptle		| "${BUILD_CMD[@]}" -c - 2> /dev/null; then
9227706450fSMichael Haeuptle		CONFIG[RDMA_SET_TOS]="y"
9237706450fSMichael Haeuptle	else
9247706450fSMichael Haeuptle		CONFIG[RDMA_SET_TOS]="n"
9257706450fSMichael Haeuptle		echo "RDMA_OPTION_ID_TOS is not supported"
9267706450fSMichael Haeuptle	fi
9277706450fSMichael Haeuptle
928daee62a0SAlexey Marchuk	if [ "${CONFIG[RDMA_PROV]}" == "mlx5_dv" ]; then
929a1dfa7ecSAlexey Marchuk		MLX5_DV_BUILD_BUILD_CMD="
930a1dfa7ecSAlexey Marchuk		#include <infiniband/mlx5dv.h>\n
931a1dfa7ecSAlexey Marchuk		#include <rdma/rdma_cma.h>\n
932a1dfa7ecSAlexey Marchuk		int main(void) { return rdma_establish(NULL) ||\n
933a1dfa7ecSAlexey Marchuk		!!IBV_QP_INIT_ATTR_SEND_OPS_FLAGS || !!MLX5_OPCODE_RDMA_WRITE"
934a1dfa7ecSAlexey Marchuk		if [ "${CONFIG[CRYPTO]}" = "y" ]; then
935a1dfa7ecSAlexey Marchuk			MLX5_DV_BUILD_BUILD_CMD+="|| !!MLX5DV_CRYPTO_ENGINES_CAP_AES_XTS_SINGLE_BLOCK"
936a1dfa7ecSAlexey Marchuk		fi
937a1dfa7ecSAlexey Marchuk		MLX5_DV_BUILD_BUILD_CMD+=";}"
938a1dfa7ecSAlexey Marchuk		if ! echo -e $MLX5_DV_BUILD_BUILD_CMD | "${BUILD_CMD[@]}" -lmlx5 -I${rootdir}/include -c -; then
939daee62a0SAlexey Marchuk			echo "mlx5_dv provider is not supported"
940daee62a0SAlexey Marchuk			exit 1
941daee62a0SAlexey Marchuk		fi
942daee62a0SAlexey Marchuk	fi
943daee62a0SAlexey Marchuk
944bb0f78a2SMichal Berger	echo "Using '${CONFIG[RDMA_PROV]}' RDMA provider"
9457671073bSSeth Howellfi
9467671073bSSeth Howell
947ed56a3d4SAnil Veerabhadrappaif [[ "${CONFIG[FC]}" = "y" ]]; then
948ed56a3d4SAnil Veerabhadrappa	if [[ -n "${CONFIG[FC_PATH]}" ]]; then
949c9b4654bSTomasz Zawadzki		check_dir "${CONFIG[FC_PATH]}"
950ed56a3d4SAnil Veerabhadrappa	fi
951ed56a3d4SAnil Veerabhadrappafi
952ed56a3d4SAnil Veerabhadrappa
9532a6ddeb8SYuriy Umanetsfunction dpdk_version() {
9542a6ddeb8SYuriy Umanets	# Check DPDK version to determine if mlx5_pci driver is supported
9552a6ddeb8SYuriy Umanets	local dpdk_ver="none"
9562a6ddeb8SYuriy Umanets	if [[ "${CONFIG[DPDK_DIR]}" == "$rootdir/dpdk/build" ]]; then
9572a6ddeb8SYuriy Umanets		# DPDK_DIR points at our submodule so ./build may not exist yet. Use
9582a6ddeb8SYuriy Umanets		# absolute path to lookup the version.
9592a6ddeb8SYuriy Umanets		dpdk_ver=$(< "$rootdir/dpdk/VERSION")
9602a6ddeb8SYuriy Umanets	elif [[ -f "${CONFIG[DPDK_DIR]}"/../VERSION ]]; then
9612a6ddeb8SYuriy Umanets		dpdk_ver=$(< "${CONFIG[DPDK_DIR]}"/../VERSION)
9622a6ddeb8SYuriy Umanets	fi
9632a6ddeb8SYuriy Umanets	echo $dpdk_ver
9642a6ddeb8SYuriy Umanets}
9652a6ddeb8SYuriy Umanets
9662a6ddeb8SYuriy Umanetsfunction mlx5_build() {
9672a6ddeb8SYuriy Umanets	# Check if libmlx5 exists to enable mlx5_pci compress/crypto PMD
9682a6ddeb8SYuriy Umanets	if ! echo -e '#include <spdk/stdinc.h>\n' \
9692a6ddeb8SYuriy Umanets		'#include <infiniband/mlx5dv.h>\n' \
9702a6ddeb8SYuriy Umanets		'#include <infiniband/verbs.h>\n' \
9712a6ddeb8SYuriy Umanets		'int main(void) { return 0; }\n' \
9722a6ddeb8SYuriy Umanets		| "${BUILD_CMD[@]}" -lmlx5 -libverbs -I${rootdir}/include -c - 2> /dev/null; then
9732a6ddeb8SYuriy Umanets		return 1
9742a6ddeb8SYuriy Umanets	fi
9752a6ddeb8SYuriy Umanets	return 0
9762a6ddeb8SYuriy Umanets}
9772a6ddeb8SYuriy Umanets
97819e2dc38Spaul luseif [[ "${CONFIG[VBDEV_COMPRESS]}" = "y" ]]; then
979c4a3b312SDarek Stojaczyk	if ! echo -e '#include <libpmem.h>\nint main(void) { return 0; }\n' \
980bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -lpmem - 2> /dev/null; then
98119e2dc38Spaul luse		echo "--with-vbdev-compress requires libpmem."
982bb0f78a2SMichal Berger		echo "Please install then re-run this script."
98397022803SJim Harris		exit 1
98497022803SJim Harris	fi
9852a6ddeb8SYuriy Umanets	# Try to enable mlx5 compress
98619e2dc38Spaul luse	CONFIG[VBDEV_COMPRESS_MLX5]="y"
9872a6ddeb8SYuriy Umanets
988e71ae467SAlexey Marchuk	# Check if libmlx5 exists to enable mlx5_pci compress PMD
9892a6ddeb8SYuriy Umanets	if ! mlx5_build; then
990e71ae467SAlexey Marchuk		echo "libmlx5 is not found, so disabling DPDK mlx5_pci compress PMD"
99119e2dc38Spaul luse		CONFIG[VBDEV_COMPRESS_MLX5]="n"
9922a6ddeb8SYuriy Umanets	else
993e71ae467SAlexey Marchuk		if [[ "${CONFIG[DPDK_PKG_CONFIG]}" = "y" ]]; then
994e71ae467SAlexey Marchuk			# Check if librte_compress_mlx5 exists in DPDK package
995e71ae467SAlexey Marchuk			if [ ! -f "${CONFIG[DPDK_LIB_DIR]}"/librte_compress_mlx5.so ]; then
996e71ae467SAlexey Marchuk				echo "librte_compress_mlx5 is not found, so disabling DPDK mlx5_pci compress PMD"
99719e2dc38Spaul luse				CONFIG[VBDEV_COMPRESS_MLX5]="n"
998e71ae467SAlexey Marchuk			fi
999e71ae467SAlexey Marchuk		else
1000e71ae467SAlexey Marchuk			# Check DPDK version to determine if mlx5_pci driver is supported
10012a6ddeb8SYuriy Umanets			dpdk_ver=$(dpdk_version)
10022a6ddeb8SYuriy Umanets			if [[ $dpdk_ver = "none" ]]; then
1003c2de56b0SMichal Berger				echo "Cannot get DPDK version, so disabling DPDK mlx5_pci compress PMD"
100419e2dc38Spaul luse				CONFIG[VBDEV_COMPRESS_MLX5]="n"
10052a6ddeb8SYuriy Umanets			elif [[ -n $dpdk_ver ]] && lt "$dpdk_ver" 21.02.0; then
10062a6ddeb8SYuriy Umanets				# mlx5_pci for compress is supported by DPDK >- 21.02.0
1007c2de56b0SMichal Berger				echo "DPDK version ${dpdk_ver} doesn't support mlx5_pci compress PMD"
100819e2dc38Spaul luse				CONFIG[VBDEV_COMPRESS_MLX5]="n"
10092a6ddeb8SYuriy Umanets			elif [[ -n ${CONFIG[DPDK_LIB_DIR]} ]] && [ ! -f "${CONFIG[DPDK_LIB_DIR]}"/librte_compress_mlx5.so ]; then
10102a6ddeb8SYuriy Umanets				# This is only checked when --with-dpdk or --with-dpdk=* is used
10112a6ddeb8SYuriy Umanets				echo "librte_compress_mlx5 is not found, so disabling DPDK mlx5_pci compress PMD"
101219e2dc38Spaul luse				CONFIG[VBDEV_COMPRESS_MLX5]="n"
10132a6ddeb8SYuriy Umanets			fi
10142a6ddeb8SYuriy Umanets		fi
10152a6ddeb8SYuriy Umanets	fi
10162a6ddeb8SYuriy Umanetsfi
10172a6ddeb8SYuriy Umanets
10182a6ddeb8SYuriy Umanetsif [[ "${CONFIG[CRYPTO]}" = "y" ]]; then
10192a6ddeb8SYuriy Umanets	# Try to enable mlx5 crypto
10202a6ddeb8SYuriy Umanets	CONFIG[CRYPTO_MLX5]="y"
10212a6ddeb8SYuriy Umanets
10222a6ddeb8SYuriy Umanets	# Check if libmlx5 exists to enable mlx5_pci compress PMD
10232a6ddeb8SYuriy Umanets	if ! mlx5_build; then
10242a6ddeb8SYuriy Umanets		echo "libmlx5 is not found, so disabling DPDK mlx5_pci crypto PMD"
10252a6ddeb8SYuriy Umanets		CONFIG[CRYPTO_MLX5]="n"
10262a6ddeb8SYuriy Umanets	else
10272a6ddeb8SYuriy Umanets		if [[ "${CONFIG[DPDK_PKG_CONFIG]}" = "y" ]]; then
10282a6ddeb8SYuriy Umanets			# Check if librte_crypto_mlx5 exists in DPDK package
10292a6ddeb8SYuriy Umanets			if [ ! -f "${CONFIG[DPDK_LIB_DIR]}"/librte_crypto_mlx5.so ]; then
10302a6ddeb8SYuriy Umanets				echo "librte_crypto_mlx5 is not found, so disabling DPDK mlx5_pci crypto PMD"
10312a6ddeb8SYuriy Umanets				CONFIG[CRYPTO_MLX5]="n"
10322a6ddeb8SYuriy Umanets			fi
10332a6ddeb8SYuriy Umanets		else
10342a6ddeb8SYuriy Umanets			# Check DPDK version to determine if mlx5_pci driver is supported
10352a6ddeb8SYuriy Umanets			dpdk_ver=$(dpdk_version)
10362a6ddeb8SYuriy Umanets			if [[ $dpdk_ver = "none" ]]; then
10372a6ddeb8SYuriy Umanets				echo "Cannot get DPDK version, so disabling DPDK mlx5_pci crypto PMD"
10382a6ddeb8SYuriy Umanets				CONFIG[CRYPTO_MLX5]="n"
10398a2fc789SYuriy Umanets			elif [[ -n $dpdk_ver ]] && lt "$dpdk_ver" 21.11.0; then
10408a2fc789SYuriy Umanets				# mlx5_pci for crypto is supported by DPDK >- 21.11.0
10412a6ddeb8SYuriy Umanets				echo "DPDK version ${dpdk_ver} doesn't support mlx5_pci crypto PMD"
10422a6ddeb8SYuriy Umanets				CONFIG[CRYPTO_MLX5]="n"
10432a6ddeb8SYuriy Umanets			elif [[ -n ${CONFIG[DPDK_LIB_DIR]} ]] && [ ! -f "${CONFIG[DPDK_LIB_DIR]}"/librte_crypto_mlx5.so ]; then
10442a6ddeb8SYuriy Umanets				# This is only checked when --with-dpdk or --with-dpdk=* is used
10452a6ddeb8SYuriy Umanets				echo "librte_crypto_mlx5 is not found, so disabling DPDK mlx5_pci crypto PMD"
10462a6ddeb8SYuriy Umanets				CONFIG[CRYPTO_MLX5]="n"
10472a6ddeb8SYuriy Umanets			fi
1048e71ae467SAlexey Marchuk		fi
1049e269bf4eSAlexey Marchuk	fi
105097022803SJim Harrisfi
105197022803SJim Harris
1052805d9942STomasz Kulasekif [[ "${CONFIG[NVME_CUSE]}" = "y" ]]; then
1053805d9942STomasz 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' \
1054bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -lfuse3 -D_FILE_OFFSET_BITS=64 - 2> /dev/null; then
105593211307SKarol Latecki		echo "--with-nvme-cuse requires libfuse3."
1056bb0f78a2SMichal Berger		echo "Please install then re-run this script."
1057805d9942STomasz Kulasek		exit 1
1058805d9942STomasz Kulasek	fi
1059805d9942STomasz Kulasekfi
1060805d9942STomasz Kulasek
106155bd0d3aSDarek Stojaczykif [[ "${CONFIG[RBD]}" = "y" ]]; then
106255bd0d3aSDarek Stojaczyk	if ! echo -e '#include <rbd/librbd.h>\n#include <rados/librados.h>\n' \
106355bd0d3aSDarek Stojaczyk		'int main(void) { return 0; }\n' \
1064bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -lrados -lrbd - 2> /dev/null; then
1065bb0f78a2SMichal Berger		echo "--with-rbd requires librados and librbd."
1066bb0f78a2SMichal Berger		echo "Please install then re-run this script."
106755bd0d3aSDarek Stojaczyk		exit 1
106855bd0d3aSDarek Stojaczyk	fi
106955bd0d3aSDarek Stojaczykfi
107055bd0d3aSDarek Stojaczyk
1071ed2b53f3SYifan Bianif [[ "${CONFIG[UBLK]}" = "y" ]]; then
1072ed2b53f3SYifan Bian	if ! echo -e '#include <linux/ublk_cmd.h>\n#include <liburing.h>\n' \
1073ed2b53f3SYifan Bian		'int main(void) { return 0; }\n' \
1074ed2b53f3SYifan Bian		| "${BUILD_CMD[@]}" -luring - 2> /dev/null; then
1075ed2b53f3SYifan Bian		echo "--with-ublk requires liburing and ublk_drv."
1076ed2b53f3SYifan Bian		echo "Please install then re-run this script."
1077ed2b53f3SYifan Bian		exit 1
1078ed2b53f3SYifan Bian	fi
1079ed2b53f3SYifan Bianfi
1080ed2b53f3SYifan Bian
108113603217SZhangfei Gaoif [[ "${CONFIG[DPDK_UADK]}" = "y" ]]; then
108213603217SZhangfei Gao	if ! pkg-config --exists libwd; then
108313603217SZhangfei Gao		echo "--with-dpdk-uadk requires uadk library."
108413603217SZhangfei Gao		echo "Please install then re-run this script."
108513603217SZhangfei Gao		exit 1
108613603217SZhangfei Gao	fi
108713603217SZhangfei Gaofi
108813603217SZhangfei Gao
10895cb18040SDarek Stojaczykif [[ "${CONFIG[ISCSI_INITIATOR]}" = "y" ]]; then
10905cb18040SDarek Stojaczyk	# Fedora installs libiscsi to /usr/lib64/iscsi for some reason.
10915cb18040SDarek Stojaczyk	if ! echo -e '#include <iscsi/iscsi.h>\n#include <iscsi/scsi-lowlevel.h>\n' \
10925cb18040SDarek Stojaczyk		'#if LIBISCSI_API_VERSION < 20150621\n' \
10935cb18040SDarek Stojaczyk		'#error\n' \
10945cb18040SDarek Stojaczyk		'#endif\n' \
10955cb18040SDarek Stojaczyk		'int main(void) { return 0; }\n' \
1096bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -L/usr/lib64/iscsi -liscsi - 2> /dev/null; then
1097bb0f78a2SMichal Berger		echo "--with-iscsi-initiator requires libiscsi with"
1098bb0f78a2SMichal Berger		echo "LIBISCSI_API_VERSION >= 20150621."
1099bb0f78a2SMichal Berger		echo "Please install then re-run this script."
11005cb18040SDarek Stojaczyk		exit 1
11015cb18040SDarek Stojaczyk	fi
11025cb18040SDarek Stojaczykfi
11035cb18040SDarek Stojaczyk
11042e283fcbS0xe0fif [[ "${CONFIG[DAOS]}" = "y" ]]; then
1105044bb175SDenis Barakthanov	daos_build_cmd=("${BUILD_CMD[@]}")
1106044bb175SDenis Barakthanov	if [[ -n "${CONFIG[DAOS_DIR]}" ]]; then
1107044bb175SDenis Barakthanov		daos_build_cmd+=(-I"${CONFIG[DAOS_DIR]}"/include -L"${CONFIG[DAOS_DIR]}"/lib64)
1108044bb175SDenis Barakthanov	fi
11092e283fcbS0xe0f	if ! echo -e '#include <daos.h>\n#include <daos_fs.h>\n' \
11102e283fcbS0xe0f		'int main(void) { return 0; }\n' \
1111044bb175SDenis Barakthanov		| "${daos_build_cmd[@]}" -lgurt -ldaos -ldaos_common -ldfs - 2> /dev/null; then
11122e283fcbS0xe0f		echo "--with-daos requires libdaos, libdaos_common, libdfs and libgurt"
11132e283fcbS0xe0f		echo "Please install then re-run this script."
11142e283fcbS0xe0f		exit 1
11152e283fcbS0xe0f	fi
11162e283fcbS0xe0ffi
11172e283fcbS0xe0f
11183674c1d3SDarek Stojaczykif [[ "${CONFIG[ASAN]}" = "y" ]]; then
11193674c1d3SDarek Stojaczyk	if ! echo -e 'int main(void) { return 0; }\n' \
1120bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -fsanitize=address - 2> /dev/null; then
1121bb0f78a2SMichal Berger		echo "--enable-asan requires libasan."
1122bb0f78a2SMichal Berger		echo "Please install then re-run this script."
11233674c1d3SDarek Stojaczyk		exit 1
11243674c1d3SDarek Stojaczyk	fi
11253674c1d3SDarek Stojaczykfi
11263674c1d3SDarek Stojaczyk
11273674c1d3SDarek Stojaczykif [[ "${CONFIG[UBSAN]}" = "y" ]]; then
11283674c1d3SDarek Stojaczyk	if ! echo -e 'int main(void) { return 0; }\n' \
1129bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -fsanitize=undefined - 2> /dev/null; then
1130bb0f78a2SMichal Berger		echo "--enable-ubsan requires libubsan."
1131bb0f78a2SMichal Berger		echo "Please install then re-run this script."
1132bb0f78a2SMichal Berger		echo "If installed, please check that the GCC version is at least 6.4"
1133bb0f78a2SMichal Berger		echo "and synchronize CC accordingly."
11343674c1d3SDarek Stojaczyk		exit 1
11353674c1d3SDarek Stojaczyk	fi
11363674c1d3SDarek Stojaczykfi
11373674c1d3SDarek Stojaczyk
11383674c1d3SDarek Stojaczykif [[ "${CONFIG[TSAN]}" = "y" ]]; then
11393674c1d3SDarek Stojaczyk	if ! echo -e 'int main(void) { return 0; }\n' \
1140bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -fsanitize=thread - 2> /dev/null; then
1141bb0f78a2SMichal Berger		echo "--enable-tsan requires libtsan."
1142bb0f78a2SMichal Berger		echo "Please install then re-run this script."
11433674c1d3SDarek Stojaczyk		exit 1
11443674c1d3SDarek Stojaczyk	fi
11453674c1d3SDarek Stojaczykfi
11463674c1d3SDarek Stojaczyk
114743a3984cSJim Harrisif echo -e '#include <stdlib.h>\nint main(void) { arc4random(); return 0; }\n' \
114843a3984cSJim Harris	| "${BUILD_CMD[@]}" - 2> /dev/null; then
114943a3984cSJim Harris	CONFIG[HAVE_ARC4RANDOM]="y"
115043a3984cSJim Harrisfi
115143a3984cSJim Harris
1152634ac768SKrzysztof Karasif echo -e '#include <uuid/uuid.h>\nint main(void) { uuid_generate_sha1(NULL, NULL, NULL, 0); return 0; }\n' \
1153634ac768SKrzysztof Karas	| "${BUILD_CMD[@]}" - -luuid 2> /dev/null; then
1154634ac768SKrzysztof Karas	CONFIG[HAVE_UUID_GENERATE_SHA1]="y"
1155634ac768SKrzysztof Karasfi
1156634ac768SKrzysztof Karas
115701452b1bSDuncan Bellamyif echo -e '#include <execinfo.h>' | "${BUILD_CMD[@]}" -c - 2> /dev/null; then
115801452b1bSDuncan Bellamy	CONFIG[HAVE_EXECINFO_H]=y
115901452b1bSDuncan Bellamyfi
116001452b1bSDuncan Bellamy
11616610b3e4SKonrad Sztyberif echo -e '#include <keyutils.h>\nint main(void) { request_key(0, 0, 0, -1); return 0; }' \
11626610b3e4SKonrad Sztyber	| "${BUILD_CMD[@]}" - -lkeyutils 2> /dev/null; then
11636610b3e4SKonrad Sztyber	CONFIG[HAVE_KEYUTILS]=y
11646610b3e4SKonrad Sztyberfi
11656610b3e4SKonrad Sztyber
1166fc8dece0SKonrad Sztyberif echo -e '#include <openssl/evp.h>\nint main(void) { EVP_MAC *m = EVP_MAC_fetch(0, 0, 0); return 0; }' \
1167fc8dece0SKonrad Sztyber	| "${BUILD_CMD[@]}" - -lcrypto 2> /dev/null; then
1168fc8dece0SKonrad Sztyber	CONFIG[HAVE_EVP_MAC]=y
1169fc8dece0SKonrad Sztyberfi
1170fc8dece0SKonrad Sztyber
117148b83bb7SYankun Liif echo -e '#include <lz4.h>\nint main(void) { return 0; }\n' \
117248b83bb7SYankun Li	| "${BUILD_CMD[@]}" -llz4 - 2> /dev/null; then
117348b83bb7SYankun Li	CONFIG[HAVE_LZ4]="y"
117448b83bb7SYankun Lifi
117548b83bb7SYankun Li
1176d1fee489SVitaliy Mysakif [[ "${CONFIG[OCF]}" = "y" ]]; then
1177d1fee489SVitaliy Mysak	# If OCF_PATH is a file, assume it is a library and use it to compile with
1178d1fee489SVitaliy Mysak	if [ -f ${CONFIG[OCF_PATH]} ]; then
1179d1fee489SVitaliy Mysak		CONFIG[CUSTOMOCF]=y
1180d1fee489SVitaliy Mysak	else
1181d1fee489SVitaliy Mysak		CONFIG[CUSTOMOCF]=n
1182d1fee489SVitaliy Mysak	fi
1183d1fee489SVitaliy Mysakfi
1184d1fee489SVitaliy Mysak
1185995d60f4SBen Walkerif [[ "${CONFIG[PGO_CAPTURE]}" = "y" && "${CONFIG[PGO_USE]}" = "y" ]]; then
1186995d60f4SBen Walker	echo "ERROR: --enable-pgo-capture and --enable-pgo-use are mutually exclusive."
1187995d60f4SBen Walker	exit 1
1188db5f3612SBen Walkerelif [[ "${CONFIG[PGO_CAPTURE]}" = "y" || "${CONFI[PGO_USE]}" = "y" ]]; then
1189db5f3612SBen Walker	if [[ -z "${CONFIG[PGO_DIR]}" ]]; then
1190db5f3612SBen Walker		CONFIG[PGO_DIR]=$(realpath $rootdir/build/pgo)
1191db5f3612SBen Walker	fi
1192db5f3612SBen Walkerfi
1193db5f3612SBen Walker
1194db5f3612SBen Walkerif [[ "${CONFIG[PGO_USE]}" = "y" ]]; then
1195954728e9SBen Walker	if [[ "$CC_TYPE" = "clang" ]]; then
1196954728e9SBen Walker		# For clang we need to run an extra step on gathered profiling data.
1197954728e9SBen Walker		echo "Generating suitable profile data"
1198db5f3612SBen Walker		llvm-profdata merge -output=${CONFIG[PGO_DIR]}/default.profdata ${CONFIG[PGO_DIR]}
1199954728e9SBen Walker	fi
1200995d60f4SBen Walkerfi
1201995d60f4SBen Walker
120287757389SSimon A. F. Lundif [[ "${CONFIG[URING]}" = "y" || "${CONFIG[XNVME]}" = "y" ]]; then
12038165bf71SBen Walker	if [[ -n "${CONFIG[URING_PATH]}" ]]; then
1204c9b4654bSTomasz Zawadzki		check_dir "${CONFIG[URING_PATH]}"
12054ccc9ea3SJim Harris	elif ! echo -e '#include <liburing.h>\nint main(void) { return 0; }\n' \
12064ccc9ea3SJim Harris		| "${BUILD_CMD[@]}" -luring - 2> /dev/null; then
12074ccc9ea3SJim Harris		echo "--with-uring requires liburing."
12084ccc9ea3SJim Harris		echo "Please build and install then re-run this script."
12094ccc9ea3SJim Harris		exit 1
12108165bf71SBen Walker	fi
1211958d196cSIndraneel M	# Support for Zoned devices is enabled by default for Uring bdev. Check appropriate support in kernel.
12128b840195SIndraneel M	if [[ "${CONFIG[URING_ZNS]}" = "y" ]]; then
12138b840195SIndraneel M		if ! echo -e '#include<linux/blkzoned.h>\nint main(void) { return BLK_ZONE_REP_CAPACITY; }\n' \
12148b840195SIndraneel M			| "${BUILD_CMD[@]}" -c - 2> /dev/null; then
1215958d196cSIndraneel M			echo "Disabling Zoned NS support in Uring! Requires blkzoned.h from kernel >= linux-5.9."
1216958d196cSIndraneel M			CONFIG[URING_ZNS]=n
1217958d196cSIndraneel M		fi
12188b840195SIndraneel M	fi
12198b840195SIndraneel Mfi
12208b840195SIndraneel M
12217fa15e28SXiaodong Liuif [[ "${CONFIG[FUSE]}" = "y" ]]; then
12227fa15e28SXiaodong Liu	if [[ ! -d /usr/include/fuse3 ]] && [[ ! -d /usr/local/include/fuse3 ]]; then
12237fa15e28SXiaodong Liu		echo "--with-fuse requires libfuse3."
12247fa15e28SXiaodong Liu		echo "Please install then re-run this script."
12257fa15e28SXiaodong Liu		exit 1
12267fa15e28SXiaodong Liu	fi
12277fa15e28SXiaodong Liufi
12287fa15e28SXiaodong Liu
122991e42257SJim Harrisif [ "${CONFIG[CET]}" = "y" ]; then
1230bb0f78a2SMichal Berger	if ! echo -e 'int main(void) { return 0; }\n' | "${BUILD_CMD[@]}" -fcf-protection - 2> /dev/null; then
1231bb0f78a2SMichal Berger		echo "--enable-cet requires compiler/linker that supports CET."
1232bb0f78a2SMichal Berger		echo "Please install then re-run this script."
123391e42257SJim Harris		exit 1
123491e42257SJim Harris	fi
123591e42257SJim Harrisfi
123691e42257SJim Harris
1237050565e5SJim Harrisif [[ "${CONFIG[FUZZER]}" = "y" && "$CC_TYPE" != "clang" ]]; then
1238050565e5SJim Harris	echo "--with-fuzzer requires setting CC and CXX to clang."
1239050565e5SJim Harris	exit 1
1240050565e5SJim Harrisfi
1241050565e5SJim Harris
1242dd2c08d2Spaul luseif [[ $arch == x86_64* ]] || [[ $arch == aarch64* ]]; then
1243dd2c08d2Spaul luse	CONFIG[ISAL]=y
1244dd2c08d2Spaul luse	# make sure the submodule is initialized
12459d2f6f86SJim Harris	if [ ! -f "$rootdir"/isa-l/autogen.sh ]; then
1246dd2c08d2Spaul luse		echo "ISA-L is required but was not found, please init the submodule with:"
12479d2f6f86SJim Harris		echo "  git submodule update --init"
1248dd2c08d2Spaul luse		echo "and then re-run this script."
12499d2f6f86SJim Harris		exit 1
12509d2f6f86SJim Harris	fi
1251dd2c08d2Spaul luse	# for x86 only, check the nasm version for ISA-L and IPSEC
1252dd2c08d2Spaul luse	if [[ $arch == x86_64* ]]; then
1253dd2c08d2Spaul luse		ver=$(nasm -v 2> /dev/null | awk '{print $3}' | awk -Fr '{print $1}')
1254dd2c08d2Spaul luse		if lt "$ver" 2.14; then
1255dd2c08d2Spaul luse			CONFIG[ISAL]=n
1256dd2c08d2Spaul luse			# IPSEC has nasm requirement and DPDK crypto relies on IPSEC
1257dd2c08d2Spaul luse			CONFIG[IPSEC_MB]=n
1258dd2c08d2Spaul luse			echo "WARNING: ISA-L & DPDK crypto cannot be used as nasm ver must be 2.14 or newer."
1259dd2c08d2Spaul luse		fi
1260dd2c08d2Spaul luse	fi
1261784b9d48SAlexey Marchuk	# check gas version on aarch64
1262784b9d48SAlexey Marchuk	if [[ $arch == aarch64* ]]; then
12632d41d8aeSMichal Berger		ver=$(as --version 2> /dev/null | awk '/GNU assembler/{print $NF}')
1264784b9d48SAlexey Marchuk		if lt "$ver" 2.24; then
1265784b9d48SAlexey Marchuk			# ISA-L, compression & crypto require gas version 2.24 or newer.
1266784b9d48SAlexey Marchuk			CONFIG[ISAL]=n
1267784b9d48SAlexey Marchuk			echo "Notice: ISA-L, compression & crypto require GAS version 2.24 or newer. Turning off default ISA-L and crypto features."
1268784b9d48SAlexey Marchuk		elif lt "$ver" 2.34; then
1269784b9d48SAlexey Marchuk			#For gas v2.24~v2.34, sve2 instructions are not supported. To workaround it, sve2 optimization should be disabled
1270784b9d48SAlexey Marchuk			ISAL_CRYPTO_OPTS+=("--disable-sve2")
1271784b9d48SAlexey Marchuk		fi
1272784b9d48SAlexey Marchuk	fi
1273dd2c08d2Spaul luseelse
1274dd2c08d2Spaul luse	# for PPC
1275dd2c08d2Spaul luse	CONFIG[ISAL]=n
1276dd2c08d2Spaul luse	echo "WARNING: ISA-L cannot be used due to architecture incompatibility."
1277dd2c08d2Spaul lusefi
12789d2f6f86SJim Harris
1279dd2c08d2Spaul luse# now either configure ISA-L or disable unavailable features
1280dd2c08d2Spaul luseif [[ "${CONFIG[ISAL]}" = "y" ]]; then
12819d2f6f86SJim Harris	cd $rootdir/isa-l
1282d965bc4dSKonrad Sztyber	ISAL_LOG=$rootdir/.spdk-isal.log
12839d2f6f86SJim Harris	if [[ -n "${CONFIG[CROSS_PREFIX]}" ]]; then
12849d2f6f86SJim Harris		ISAL_OPTS=("--host=${CONFIG[CROSS_PREFIX]}")
12859d2f6f86SJim Harris	else
12869d2f6f86SJim Harris		ISAL_OPTS=()
12879d2f6f86SJim Harris	fi
1288d3d3c0a8SMichal Berger	if [[ "${CONFIG[SHARED]}" = "y" ]]; then
12896c6c42fcSBen Walker		ISAL_OPTS+=("--enable-shared=yes")
12906c6c42fcSBen Walker	else
12916c6c42fcSBen Walker		ISAL_OPTS+=("--enable-shared=no")
12926c6c42fcSBen Walker	fi
1293b02581a8SBen Walker	ISAL_OPTS+=("--prefix=${CONFIG[PREFIX]}")
12949d2f6f86SJim Harris	echo -n "Configuring ISA-L (logfile: $ISAL_LOG)..."
12959d2f6f86SJim Harris	./autogen.sh &> $ISAL_LOG
1296d0f57d15SMichal Berger	./configure CFLAGS="-fPIC -g -O2 -fuse-ld=$LD_TYPE -Wno-unused-command-line-argument" "${ISAL_OPTS[@]}" --enable-shared=no >> $ISAL_LOG 2>&1
12979d2f6f86SJim Harris	echo "done."
12989d2f6f86SJim Harris	cd $rootdir
1299dd2c08d2Spaul luseelse
1300dd2c08d2Spaul luse	echo "Without ISA-L, there is no software support for crypto or compression,"
1301dd2c08d2Spaul luse	echo "so these features will be disabled."
1302dd2c08d2Spaul luse	CONFIG[CRYPTO]=n
130319e2dc38Spaul luse	CONFIG[VBDEV_COMPRESS]=n
1304976f8b09Spaul luse	CONFIG[DPDK_COMPRESSDEV]=n
13059d2f6f86SJim Harrisfi
13069d2f6f86SJim Harris
1307784b9d48SAlexey Marchuk# ISA-L-crypto complements ISA-L functionality, it is only enabled together with ISA-L
1308784b9d48SAlexey Marchukif [[ "${CONFIG[ISAL]}" = "y" ]]; then
1309784b9d48SAlexey Marchuk	if [ ! -f "$rootdir"/isa-l-crypto/autogen.sh ]; then
1310784b9d48SAlexey Marchuk		echo "ISA-L-crypto is required but was not found, please init the submodule with:"
1311784b9d48SAlexey Marchuk		echo "  git submodule update --init"
1312784b9d48SAlexey Marchuk		echo "and then re-run this script."
1313784b9d48SAlexey Marchuk		exit 1
1314784b9d48SAlexey Marchuk	fi
1315784b9d48SAlexey Marchuk
1316784b9d48SAlexey Marchuk	cd $rootdir/isa-l-crypto
1317d965bc4dSKonrad Sztyber	ISAL_CRYPTO_LOG=$rootdir/.spdk-isal-crypto.log
1318784b9d48SAlexey Marchuk	if [[ -n "${CONFIG[CROSS_PREFIX]}" ]]; then
1319784b9d48SAlexey Marchuk		ISAL_CRYPTO_OPTS+=("--host=${CONFIG[CROSS_PREFIX]}")
1320784b9d48SAlexey Marchuk	fi
1321d3d3c0a8SMichal Berger	if [[ "${CONFIG[SHARED]}" = "y" ]]; then
13226c6c42fcSBen Walker		ISAL_CRYPTO_OPTS+=("--enable-shared=yes")
13236c6c42fcSBen Walker	else
1324784b9d48SAlexey Marchuk		ISAL_CRYPTO_OPTS+=("--enable-shared=no")
13256c6c42fcSBen Walker	fi
1326b02581a8SBen Walker	ISAL_CRYPTO_OPTS+=("--prefix=${CONFIG[PREFIX]}")
1327784b9d48SAlexey Marchuk	echo -n "Configuring ISA-L-crypto (logfile: $ISAL_CRYPTO_LOG)..."
1328784b9d48SAlexey Marchuk	./autogen.sh &> $ISAL_CRYPTO_LOG
1329d0f57d15SMichal Berger	./configure CFLAGS="-fPIC -g -O2 -fuse-ld=$LD_TYPE -Wno-unused-command-line-argument" "${ISAL_CRYPTO_OPTS[@]}" >> $ISAL_CRYPTO_LOG 2>&1
1330784b9d48SAlexey Marchuk	echo "done."
1331784b9d48SAlexey Marchuk	cd $rootdir
1332784b9d48SAlexey Marchuk	CONFIG[ISAL_CRYPTO]=y
1333784b9d48SAlexey Marchukelse
1334784b9d48SAlexey Marchuk	CONFIG[ISAL_CRYPTO]=n
1335784b9d48SAlexey Marchukfi
1336784b9d48SAlexey Marchuk
1337509241ceSKonrad Sztyberif [[ "${CONFIG[SMA]}" = "y" ]]; then
1338509241ceSKonrad Sztyber	if ! python3 -c 'import grpc; import grpc_tools' 2> /dev/null; then
1339509241ceSKonrad Sztyber		echo "--with-sma requires grpcio and grpcio-tools python packages."
1340509241ceSKonrad Sztyber		echo "Please install then re-run this script."
1341509241ceSKonrad Sztyber		exit 1
1342509241ceSKonrad Sztyber	fi
1343509241ceSKonrad Sztyberfi
1344509241ceSKonrad Sztyber
13452796687dSParameswaran Krishnamurthyif [[ "${CONFIG[AVAHI]}" = "y" ]]; then
13462796687dSParameswaran Krishnamurthy	if ! echo -e '#include <avahi-client/client.h>\n#include <avahi-common/malloc.h>\n' \
13472796687dSParameswaran Krishnamurthy		'int main(void) { return 0; }\n' \
13482796687dSParameswaran Krishnamurthy		| "${BUILD_CMD[@]}" -lavahi-client -lavahi-common - 2> /dev/null; then
13492796687dSParameswaran Krishnamurthy		echo "--with-avahi requires libavahi-client and libavahi-common."
13502796687dSParameswaran Krishnamurthy		echo "Please install then re-run this script."
13512796687dSParameswaran Krishnamurthy		exit 1
13522796687dSParameswaran Krishnamurthy	fi
13532796687dSParameswaran Krishnamurthyfi
13542796687dSParameswaran Krishnamurthy
13551e46e023SMaciej Misif [[ "${CONFIG[GOLANG]}" = "y" ]]; then
13561e46e023SMaciej Mis	if ! go version 2> /dev/null; then
13571e46e023SMaciej Mis		echo "--with-golang requires Go installation."
13581e46e023SMaciej Mis		echo "Please install then re-run this script."
13591e46e023SMaciej Mis		exit 1
13601e46e023SMaciej Mis	fi
13611e46e023SMaciej Misfi
13621e46e023SMaciej Mis
13638247bd40SMarcin Spiewakif [[ -n ${CONFIG[MAX_LCORES]} ]]; then
136473293d73SMarcin Spiewak	if [[ ! ${CONFIG[MAX_LCORES]} =~ ^([1-9][0-9]*|detect)$ ]] || ((CONFIG[MAX_LCORES] > 1024)); then
136573293d73SMarcin Spiewak		echo "ERROR: Max number of lcores must be a decimal number in range [1..1024] or 'detect' (given: ${CONFIG[MAX_LCORES]})"
13668247bd40SMarcin Spiewak		exit 1
13678247bd40SMarcin Spiewak	fi
13688247bd40SMarcin Spiewakfi
13698247bd40SMarcin Spiewak
1370*081f8addSJim Harrisif [[ -n ${CONFIG[MAX_NUMA_NODES]} ]]; then
1371*081f8addSJim Harris	if [[ ! ${CONFIG[MAX_NUMA_NODES]} =~ ^([1-9][0-9]*)$ ]] || ((CONFIG[MAX_NUMA_NODES] > 16)); then
1372*081f8addSJim Harris		echo "ERROR: Max number of lcores must be a decimal number in range [1..16] (given: ${CONFIG[MAX_LCORES]})"
1373*081f8addSJim Harris		exit 1
1374*081f8addSJim Harris	fi
1375*081f8addSJim Harrisfi
1376*081f8addSJim Harris
1377e21c39aaSAnton Nayshtutif [[ "${CONFIG[FSDEV]}" = "n" ]]; then
1378e21c39aaSAnton Nayshtut	if [[ "$AIO_FSDEV_REQUIRED" = "y" ]]; then
1379e21c39aaSAnton Nayshtut		echo "ERROR: --with-aio-fsdev cannot be specified as fsdev is disabled."
1380e21c39aaSAnton Nayshtut		exit 1
1381e21c39aaSAnton Nayshtut	fi
1382e21c39aaSAnton Nayshtut
1383e21c39aaSAnton Nayshtut	# if AIO_FSDEV is not explicitly required by user, we just silently disable it
1384e21c39aaSAnton Nayshtut	CONFIG[AIO_FSDEV]=n
1385e21c39aaSAnton Nayshtutfi
1386e21c39aaSAnton Nayshtut
1387e21c39aaSAnton Nayshtutif [[ "${CONFIG[AIO_FSDEV]}" = "y" ]]; then
1388e21c39aaSAnton Nayshtut	if echo -e '#define _GNU_SOURCE\n#include <unistd.h>\n' \
1389e21c39aaSAnton Nayshtut		'int main(void) { return copy_file_range(0, 0, 0, 0, 0, 0); }\n' \
1390e21c39aaSAnton Nayshtut		| "${BUILD_CMD[@]}" - 2> /dev/null; then
1391e21c39aaSAnton Nayshtut		CONFIG[COPY_FILE_RANGE]=y
1392e21c39aaSAnton Nayshtut	else
1393e21c39aaSAnton Nayshtut		CONFIG[COPY_FILE_RANGE]=n
1394e21c39aaSAnton Nayshtut	fi
1395e21c39aaSAnton Nayshtut	if echo -e '#include <sys/stat.h>\n' \
1396e21c39aaSAnton Nayshtut		'int main(void) { struct stat s; s.st_atime = s.st_atime; return 0 ;}\n' \
1397e21c39aaSAnton Nayshtut		| "${BUILD_CMD[@]}" - 2> /dev/null; then
1398e21c39aaSAnton Nayshtut		CONFIG[HAVE_STRUCT_STAT_ST_ATIM]=y
1399e21c39aaSAnton Nayshtut		CONFIG[HAVE_STRUCT_STAT_ST_ATIMESPEC]=n
1400e21c39aaSAnton Nayshtut	elif echo -e '#include <sys/stat.h>\n' \
1401e21c39aaSAnton Nayshtut		'int main(void) { struct stat s; s.st_atimespec = s.st_atimespec; return 0; }\n' \
1402e21c39aaSAnton Nayshtut		| "${BUILD_CMD[@]}" - 2> /dev/null; then
1403e21c39aaSAnton Nayshtut		CONFIG[HAVE_STRUCT_STAT_ST_ATIM]=n
1404e21c39aaSAnton Nayshtut		CONFIG[HAVE_STRUCT_STAT_ST_ATIMESPEC]=y
1405e21c39aaSAnton Nayshtut	else
1406e21c39aaSAnton Nayshtut		CONFIG[HAVE_STRUCT_STAT_ST_ATIM]=n
1407e21c39aaSAnton Nayshtut		CONFIG[HAVE_STRUCT_STAT_ST_ATIMESPEC]=n
1408e21c39aaSAnton Nayshtut	fi
1409e21c39aaSAnton Nayshtutfi
1410e21c39aaSAnton Nayshtut
1411fcc38949SRui Chang# For ARM Neoverse-N1 platform, debug build needs gcc version newer than 8.4
1412fcc38949SRui Changif [[ "${CONFIG[DEBUG]}" = "y" && $arch = aarch64* && "$CC_TYPE" = "gcc" ]]; then
1413fcc38949SRui Chang	GCC_VERSION=$($CC -dumpfullversion)
1414fcc38949SRui Chang	PART_NUM=$(grep -i -m 1 "CPU part" /proc/cpuinfo | awk '{print $4}')
1415fcc38949SRui Chang
1416fcc38949SRui Chang	if [[ "$(printf '%s\n' "8.4.0" "$GCC_VERSION" | sort -V | head -n1)" != "8.4.0" ]]; then
1417fcc38949SRui Chang		if [[ $PART_NUM = 0xd0c ]]; then
1418fcc38949SRui Chang			echo "WARNING: For ARM Neoverse-N1 platform, debug build needs GCC version newer than 8.4."
1419fcc38949SRui Chang			echo "         Will work around this by using armv8.2-a+crypto as target architecture for now."
1420fcc38949SRui Chang			CONFIG[ARCH]=armv8.2-a+crypto
1421e8f84531SSunil Shahu		elif [[ $PART_NUM = 0x0b2 ]]; then
1422e8f84531SSunil Shahu			echo "WARNING: For ARM octeontx2 platform, debug build needs GCC version newer than 8.4."
1423e8f84531SSunil Shahu			echo "         Will work around this by using armv8.2-a+crypto as target architecture for now."
1424e8f84531SSunil Shahu			CONFIG[ARCH]=armv8.2-a+crypto
1425fcc38949SRui Chang		fi
1426fcc38949SRui Chang	fi
1427fcc38949SRui Changfi
1428fcc38949SRui Chang
142948f70f48SPawel Wodkowski# We are now ready to generate final configuration. But first do sanity
143048f70f48SPawel Wodkowski# check to see if all keys in CONFIG array have its reflection in CONFIG file.
1431bb0f78a2SMichal Bergerif (($(grep -cE "^\s*CONFIG_[[:alnum:]_]+=" "$rootdir/CONFIG") != ${#CONFIG[@]})); then
143248f70f48SPawel Wodkowski	echo ""
143348f70f48SPawel Wodkowski	echo "BUG: Some configuration options are not present in CONFIG file. Please update this file."
143448f70f48SPawel Wodkowski	echo "Missing options in CONFIG (+) file and in current config (-): "
143548f70f48SPawel Wodkowski	diff -u --label "CONFIG file" --label "CONFIG[@]" \
1436f8d6541dSMichal Berger		<(sed -r -e '/^[[:space:]]*$/d; /^[[:space:]]*#.*/d; s/(CONFIG_[[:alnum:]_]+)=.*/\1/g' CONFIG | sort) \
1437bb0f78a2SMichal Berger		<(printf "CONFIG_%s\n" "${!CONFIG[@]}" | sort)
143848f70f48SPawel Wodkowski	exit 1
143948f70f48SPawel Wodkowskifi
144048f70f48SPawel Wodkowski
144185bc2bbeSPawel Wodkowskiecho -n "Creating mk/config.mk..."
1442e62a3c65SSeth Howellcp -f $rootdir/CONFIG $rootdir/mk/config.mk
144351ab849bSJim HarrisARGS=$(echo "$@" | sed 's/ /\\ /g')
144451ab849bSJim Harrissed -i.bak -r "s#__CONFIGURE_OPTIONS__#${ARGS}#g" $rootdir/mk/config.mk
1445bb0f78a2SMichal Bergerfor key in "${!CONFIG[@]}"; do
1446f8d6541dSMichal Berger	sed -i.bak -r "s#[[:space:]]*CONFIG_${key}=.*#CONFIG_${key}\?=${CONFIG[$key]}#g" $rootdir/mk/config.mk
1447577df16aSPawel Wodkowskidone
1448577df16aSPawel Wodkowski# On FreeBSD sed -i 'SUFFIX' - SUFFIX is mandatory. So no way but to delete the backed file.
1449e62a3c65SSeth Howellrm -f $rootdir/mk/config.mk.bak
1450baa6eac0SDarek Stojaczykecho "done."
14519dd998cdSBen Walker
145208ec96ebSDaniel Verkamp# Environment variables
1453baa6eac0SDarek Stojaczykecho -n "Creating mk/cc.flags.mk..."
1454e62a3c65SSeth Howellrm -f $rootdir/mk/cc.flags.mk
1455e62a3c65SSeth Howell[ -n "$CFLAGS" ] && echo "CFLAGS?=$CFLAGS" > $rootdir/mk/cc.flags.mk
1456e62a3c65SSeth Howell[ -n "$CXXFLAGS" ] && echo "CXXFLAGS?=$CXXFLAGS" >> $rootdir/mk/cc.flags.mk
1457e62a3c65SSeth Howell[ -n "$LDFLAGS" ] && echo "LDFLAGS?=$LDFLAGS" >> $rootdir/mk/cc.flags.mk
1458e62a3c65SSeth Howell[ -n "$DESTDIR" ] && echo "DESTDIR?=$DESTDIR" >> $rootdir/mk/cc.flags.mk
14590b56a5b4SJim Harrisecho "done."
146085bc2bbeSPawel Wodkowski
1461db3ebfe6SMichal Berger# Create .sh with build config for easy sourcing|lookup during the tests.
1462db3ebfe6SMichal Bergerfor conf in "${!CONFIG[@]}"; do
1463db3ebfe6SMichal Berger	echo "CONFIG_$conf=${CONFIG[$conf]}"
1464db3ebfe6SMichal Bergerdone > "$rootdir/test/common/build_config.sh"
1465db3ebfe6SMichal Berger
14665a764955SMichal Bergerif [[ $sys_name == "FreeBSD" ]]; then
1467870ce250SPaul Luse	echo "Type 'gmake' to build."
1468870ce250SPaul Luseelse
14690b56a5b4SJim Harris	echo "Type 'make' to build."
1470870ce250SPaul Lusefi
14719dd998cdSBen Walker
14729dd998cdSBen Walkerexit 0
1473