xref: /spdk/configure (revision b4d441fd2219f3f7af2e629de9079c4ac0647bb6)
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"
359dd998cdSBen Walker	echo " --enable-debug            Configure for debug builds"
369dd998cdSBen Walker	echo " --enable-werror           Treat compiler warnings as errors"
379dd998cdSBen Walker	echo " --enable-asan             Enable address sanitizer"
389dd998cdSBen Walker	echo " --enable-ubsan            Enable undefined behavior sanitizer"
399dd998cdSBen Walker	echo " --enable-coverage         Enable code coverage tracking"
406d6d1161SDaniel Verkamp	echo " --enable-lto              Enable link-time optimization"
41995d60f4SBen Walker	echo " --enable-pgo-capture      Enable generation of profile guided optimization data"
42995d60f4SBen Walker	echo " --enable-pgo-use          Use previously captured profile guided optimization data"
4391e42257SJim Harris	echo " --enable-cet              Enable Intel Control-flow Enforcement Technology (CET)"
449fcb1cb0STomasz Zawadzki	echo " --disable-tests           Disable building of functional tests"
459fcb1cb0STomasz Zawadzki	echo " --disable-unit-tests      Disable building of unit tests"
469b2c6452SJacek Kalwas	echo " --disable-examples        Disable building of examples"
47119158cdSRajarshi Chowdhury	echo " --disable-apps            Disable building of apps"
489dd998cdSBen Walker	echo ""
499dd998cdSBen Walker	echo "Specifying Dependencies:"
509dd998cdSBen Walker	echo "--with-DEPENDENCY[=path]   Use the given dependency. Optionally, provide the"
519dd998cdSBen Walker	echo "                           path."
529dd998cdSBen Walker	echo "--without-DEPENDENCY       Do not link to the given dependency. This may"
539dd998cdSBen Walker	echo "                           disable features and components."
549dd998cdSBen Walker	echo ""
559dd998cdSBen Walker	echo "Valid dependencies are listed below."
562bc71094SMichal Berger	echo " --with-dpdk[=DIR]         Build against a custom dpdk version. By default, the dpdk"
572bc71094SMichal Berger	echo " --without-dpdk            submodule in spdk tree will be used."
589dd998cdSBen Walker	echo "                           example: /usr/share/dpdk/x86_64-default-linuxapp-gcc"
592bc71094SMichal Berger	echo " --with-env=DIR            Use an alternate environment implementation instead of DPDK."
6006cc8045SBen Walker	echo "                           Implies --without-dpdk."
612bc71094SMichal Berger	echo " --with-idxd               Build the IDXD library and accel framework plug-in module."
622bc71094SMichal Berger	echo " --without-idxd            Disabled while experimental. Only built for x86 when enabled."
63784b9d48SAlexey Marchuk	echo " --with-crypto             Build isa-l-crypto and vbdev crypto module. No path required."
64784b9d48SAlexey Marchuk	echo " --without-crypto          Disable isa-l-crypto and vbdev crypto module."
652bc71094SMichal Berger	echo " --with-fio[=DIR]          Build fio_plugin."
662bc71094SMichal Berger	echo " --without-fio             default: /usr/src/fio"
676f338d4bSKrishna Kanth Reddy	echo " --with-xnvme              Build xNVMe bdev module."
686f338d4bSKrishna Kanth Reddy	echo " --without-xnvme           No path required."
692bc71094SMichal Berger	echo " --with-vhost              Build vhost target. Enabled by default."
702bc71094SMichal Berger	echo " --without-vhost           No path required."
712bc71094SMichal Berger	echo " --with-virtio             Build vhost initiator and virtio-pci bdev modules."
722bc71094SMichal Berger	echo " --without-virtio          No path required."
73e50ade31SChangpeng Liu	echo " --with-vfio-user[=DIR]    Build custom vfio-user transport for NVMf target and vfio-user target."
74e50ade31SChangpeng Liu	echo "                           vfio-user initiator is always built-in in Linux."
752f731c63SGangCao	echo "                           example: /usr/src/libvfio-user"
762f731c63SGangCao	echo " --without-vfio-user       No path required."
7719e2dc38Spaul luse	echo " --with-vbdev-compress     Build vbdev compression module and dependencies."
7819e2dc38Spaul luse	echo " --without-vbdev-compress  No path required."
79976f8b09Spaul luse	echo " --with-dpdk-compressdev   Build accel DPDK compression module and dependencies."
80976f8b09Spaul luse	echo " --without-dpdk-compressdev No path required."
812bc71094SMichal Berger	echo " --with-rbd                Build Ceph RBD bdev module."
822bc71094SMichal Berger	echo " --without-rbd             No path required."
83ed2b53f3SYifan Bian	echo " --with-ublk               Build ublk library."
84ed2b53f3SYifan Bian	echo " --without-ublk            No path required."
852bc71094SMichal Berger	echo " --with-rdma[=DIR]         Build RDMA transport for NVMf target and initiator."
862bc71094SMichal Berger	echo " --without-rdma            Accepts optional RDMA provider name. Can be \"verbs\" or \"mlx5_dv\"."
87daee62a0SAlexey Marchuk	echo "                           If no provider specified, \"verbs\" provider is used by default."
882bc71094SMichal Berger	echo " --with-fc[=DIR]           Build FC transport for NVMf target."
892bc71094SMichal Berger	echo " --without-fc              If an argument is provided, it is considered a directory containing"
90ed56a3d4SAnil Veerabhadrappa	echo "                           libufc.a and fc_lld.h. Otherwise the regular system paths will"
91ed56a3d4SAnil Veerabhadrappa	echo "                           be searched."
92044bb175SDenis Barakthanov	echo " --with-daos[=DIR]         Build DAOS bdev module."
932e283fcbS0xe0f	echo " --without-daos            No path required."
942bc71094SMichal Berger	echo " --with-shared             Build spdk shared libraries."
952bc71094SMichal Berger	echo " --without-shared          No path required."
962bc71094SMichal Berger	echo " --with-iscsi-initiator    Build with iscsi bdev module."
972bc71094SMichal Berger	echo " --without-iscsi-initiator No path required."
986b97cccfSJim Harris	echo " --with-vtune=DIR          Required to profile I/O under Intel VTune Amplifier XE. (Deprecated)"
992bc71094SMichal Berger	echo " --without-vtune           example: /opt/intel/vtune_amplifier_xe_version"
100*b4d441fdSAmir Haroush	echo " --with-ocf[=DIR]          Build OCF library and bdev module."
1012bc71094SMichal Berger	echo " --without-ocf             If argument is directory, interpret it as root of OCF repo"
102d1fee489SVitaliy Mysak	echo "                           If argument is file, interpret it as compiled OCF lib"
10398d60de6SPiotr Pelplinski	echo "                           If no argument is specified, OCF git submodule is used by default"
104d1fee489SVitaliy Mysak	echo "                           example: /usr/src/ocf/"
1052bc71094SMichal Berger	echo " --with-uring[=DIR]        Build I/O uring bdev or socket module."
1062bc71094SMichal Berger	echo " --without-uring           If an argument is provided, it is considered a directory containing"
107161c88a0SDarek Stojaczyk	echo "                           liburing.a and io_uring.h. Otherwise the regular system paths will"
108161c88a0SDarek Stojaczyk	echo "                           be searched."
109958d196cSIndraneel M	echo " --without-uring-zns       Build I/O uring module without ZNS (zoned namespaces) support."
11034192459SBoris Glimcher	echo " --with-openssl[=DIR]      Build OPENSSL with custom path. Otherwise the regular system paths will"
11134192459SBoris Glimcher	echo "                           be searched."
1122bc71094SMichal Berger	echo " --with-fuse               Build FUSE components for mounting a blobfs filesystem."
1132bc71094SMichal Berger	echo " --without-fuse            No path required."
1142bc71094SMichal Berger	echo " --with-nvme-cuse          Build NVMe driver with support for CUSE-based character devices."
1152bc71094SMichal Berger	echo " --without-nvme-cuse       No path required."
11683a4b155SArtur Paszkiewicz	echo " --with-raid5f             Build with bdev_raid module RAID5f support."
11783a4b155SArtur Paszkiewicz	echo " --without-raid5f          No path required."
1182bc71094SMichal Berger	echo " --with-wpdk=DIR           Build using WPDK to provide support for Windows (experimental)."
1192bc71094SMichal Berger	echo " --without-wpdk            The argument must be a directory containing lib and include."
1202bc71094SMichal Berger	echo " --with-usdt               Build with userspace DTrace probes enabled."
1212bc71094SMichal Berger	echo " --without-usdt            No path required."
122050565e5SJim Harris	echo " --with-fuzzer             Build with LLVM fuzzing enabled."
123050565e5SJim Harris	echo "                           Path to clang_rt.fuzzer_no_main library required."
124050565e5SJim Harris	echo "                           Requires setting CC and CXX to clang."
125050565e5SJim Harris	echo "                           (Typically /usr/lib/llvm-VER/lib/clang/VER/lib/linux/libclang_rt.fuzzer_no_main-ARCH.a)"
126509241ceSKonrad Sztyber	echo " --with-sma                Generate Storage Management Agent's protobuf interface"
127509241ceSKonrad Sztyber	echo " --without-sma             No path required."
1282796687dSParameswaran Krishnamurthy	echo " --with-avahi              Build with Avahi mDNS discovery client service enabled in bdev-nvme module."
1292796687dSParameswaran Krishnamurthy	echo " --without-avahi           No path required."
1309dd998cdSBen Walker	echo ""
13108ec96ebSDaniel Verkamp	echo "Environment variables:"
13208ec96ebSDaniel Verkamp	echo ""
13373439e6fSBen Walker	echo "CC                         C compiler"
13408ec96ebSDaniel Verkamp	echo "CFLAGS                     C compiler flags"
13573439e6fSBen Walker	echo "CXX                        C++ compiler"
13608ec96ebSDaniel Verkamp	echo "CXXFLAGS                   C++ compiler flags"
13773439e6fSBen Walker	echo "LD                         Linker"
13808ec96ebSDaniel Verkamp	echo "LDFLAGS                    Linker flags"
13908ec96ebSDaniel Verkamp	echo "DESTDIR                    Destination for 'make install'"
14008ec96ebSDaniel Verkamp	echo ""
1419dd998cdSBen Walker}
1429dd998cdSBen Walker
143577df16aSPawel Wodkowski# Load default values
144ff238359SJosh Soref# Convert config to sourceable configuration file
145e62a3c65SSeth Howellsed -r 's/CONFIG_([[:alnum:]_]+)=(.*)/CONFIG[\1]=\2/g' $rootdir/CONFIG > $rootdir/CONFIG.sh
146577df16aSPawel Wodkowskideclare -A CONFIG
147e62a3c65SSeth Howellsource $rootdir/CONFIG.sh
148e62a3c65SSeth Howellrm $rootdir/CONFIG.sh
149577df16aSPawel Wodkowski
15011a5716dSMichal Berger# Try to expand literal ~ that might have been passed as an option via --long-opt=~/dir.
15111a5716dSMichal Bergerset -- "${@//\~/~}"
15211a5716dSMichal Berger
1534d2e26d8STomasz Zawadzkifor i in "$@"; do
1544d2e26d8STomasz Zawadzki	case "$i" in
1554d2e26d8STomasz Zawadzki		--cross-prefix=*)
1564d2e26d8STomasz Zawadzki			CONFIG[CROSS_PREFIX]="${i#*=}"
1574d2e26d8STomasz Zawadzki			;;
1584d2e26d8STomasz Zawadzki		--enable-lto)
1594d2e26d8STomasz Zawadzki			CONFIG[LTO]=y
1604d2e26d8STomasz Zawadzki			;;
1614d2e26d8STomasz Zawadzki		--disable-lto)
1624d2e26d8STomasz Zawadzki			CONFIG[LTO]=n
1634d2e26d8STomasz Zawadzki			;;
1644d2e26d8STomasz Zawadzki	esac
1654d2e26d8STomasz Zawadzkidone
1664d2e26d8STomasz Zawadzki
167873c8748STomasz Kulasek# Detect the compiler toolchain
168873c8748STomasz Kulasek$rootdir/scripts/detect_cc.sh --cc="$CC" --cxx="$CXX" --lto="${CONFIG[LTO]}" --ld="$LD" --cross-prefix="${CONFIG[CROSS_PREFIX]}" > $rootdir/mk/cc.mk
169873c8748STomasz Kulasek
170bb0f78a2SMichal BergerCC=$(grep "DEFAULT_CC=" "$rootdir/mk/cc.mk" | sed s/DEFAULT_CC=//)
171bb0f78a2SMichal BergerCC_TYPE=$(grep "CC_TYPE=" "$rootdir/mk/cc.mk" | cut -d "=" -f 2)
172873c8748STomasz Kulasek
173873c8748STomasz Kulasekarch=$($CC -dumpmachine)
1745a764955SMichal Bergersys_name=$(uname -s)
175873c8748STomasz Kulasek
1769854c138SNick Connollyif [[ $arch == *mingw* ]] || [[ $arch == *windows* ]]; then
1779854c138SNick Connolly	sys_name=Windows
1789854c138SNick Connollyfi
1799854c138SNick Connolly
1802a0c2a2dSNick Connollyif [[ $sys_name != "Linux" ]]; then
181873c8748STomasz Kulasek	# Vhost, rte_vhost library and virtio are only supported on Linux.
182873c8748STomasz Kulasek	CONFIG[VHOST]="n"
183873c8748STomasz Kulasek	CONFIG[VIRTIO]="n"
184873c8748STomasz Kulasek	echo "Notice: Vhost, rte_vhost library and virtio are only supported on Linux. Turning off default feature."
185873c8748STomasz Kulasekfi
186873c8748STomasz Kulasek
1871723a800SGangCaofunction check_dir() {
1881723a800SGangCao	arg="$1"
1891723a800SGangCao	dir="${arg#*=}"
1901723a800SGangCao	if [ ! -d "$dir" ]; then
1911723a800SGangCao		echo "$arg: directory not found"
1921723a800SGangCao		exit 1
1931723a800SGangCao	fi
1941723a800SGangCao}
1951723a800SGangCao
1967b04eb72SYuriy Umanets# On x86_64 'clang -dumpmachine' produces x86_64-pc-linux-gnu
1977b04eb72SYuriy Umanets# whereas the dpdk might be built with gcc and its libs lie in
198acd2cc94STomasz Zawadzki# x86_64-linux-gnu. Let's find the right libdir for dpdk libs.
1997b04eb72SYuriy Umanetsfunction find_dpdk_arch_libdir() {
200acd2cc94STomasz Zawadzki	local dpdk_libdir="$1/lib"
201acd2cc94STomasz Zawadzki
202acd2cc94STomasz Zawadzki	# Use libdir with 'lib' or 'lib64'
203acd2cc94STomasz Zawadzki	if [[ ! -d "$dpdk_libdir" ]]; then
204acd2cc94STomasz Zawadzki		dpdk_libdir+="64"
205acd2cc94STomasz Zawadzki	fi
2067b04eb72SYuriy Umanets
2077b04eb72SYuriy Umanets	# Checking first what we have with $arch, then clang
2087b04eb72SYuriy Umanets	# variant of arch.
2097b04eb72SYuriy Umanets	arches=("$arch" "$(echo $arch | sed 's/-pc//g')")
2107b04eb72SYuriy Umanets	for a in "${arches[@]}"; do
211acd2cc94STomasz Zawadzki		local libdir_arch="$dpdk_libdir/$a"
212acd2cc94STomasz Zawadzki		if [[ -d "$libdir_arch" ]]; then
213acd2cc94STomasz Zawadzki			echo "$libdir_arch"
2147b04eb72SYuriy Umanets			return
2157b04eb72SYuriy Umanets		fi
2167b04eb72SYuriy Umanets	done
2177b04eb72SYuriy Umanets
2187b04eb72SYuriy Umanets	# Fallback to the libdir without arch component
219acd2cc94STomasz Zawadzki	echo "$dpdk_libdir"
2207b04eb72SYuriy Umanets}
2217b04eb72SYuriy Umanets
222f1980244SYuriy Umanetsfunction check_IPSec_mb() {
223f1980244SYuriy Umanets	local mode=$1
224f1980244SYuriy Umanets	local dpdk_libdir=$2
225f1980244SYuriy Umanets	local dpdk_incdir=$3
226f1980244SYuriy Umanets	local have_ipsec_mb=n
227f1980244SYuriy Umanets
228f1980244SYuriy Umanets	if [[ $mode = "pkg-config" ]]; then
229f1980244SYuriy Umanets		local dpdk_libs
230f1980244SYuriy Umanets
231f1980244SYuriy Umanets		# Request libdpdk pkg-config settings to figure out if the IPSec_MB is used
232f1980244SYuriy Umanets		# as a dependency.
233f1980244SYuriy Umanets		# Due to some reason pkg-config shows -lIPSec_MB only with --static option
234f13ec525SKarol Latecki		dpdk_libs=$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --libs --static libdpdk)
235f1980244SYuriy Umanets		if echo "$dpdk_libs" | grep "\-lIPSec_MB" > /dev/null 2>&1; then
236f1980244SYuriy Umanets			have_ipsec_mb=y
237f1980244SYuriy Umanets		fi
238f1980244SYuriy Umanets	elif [[ $mode = "build-config" ]]; then
239f1980244SYuriy Umanets		# Use dpdk build config header to check if the IPSec_MB was used.
240f1980244SYuriy Umanets		if grep -F "define RTE_CRYPTO_IPSEC_MB 1" "$dpdk_incdir/rte_build_config.h" > /dev/null 2>&1; then
241f1980244SYuriy Umanets			have_ipsec_mb=y
242f1980244SYuriy Umanets		fi
243f1980244SYuriy Umanets	else
244f1980244SYuriy Umanets		echo "ERROR: Invalid IPSec_MB checking mode $mode."
245f1980244SYuriy Umanets		echo "ERROR: Only \"pkg-config\" and \"build-config\" available."
246f1980244SYuriy Umanets		exit 1
247f1980244SYuriy Umanets	fi
248f1980244SYuriy Umanets	if [[ $have_ipsec_mb = "n" ]]; then
249f1980244SYuriy Umanets		CONFIG[IPSEC_MB]=n
250f1980244SYuriy Umanets		return
251f1980244SYuriy Umanets	fi
252f1980244SYuriy Umanets
253f1980244SYuriy Umanets	# Since we don't know the library path where the IPSec_MB is located
254f1980244SYuriy Umanets	# let's find it out with the ldd utility. This can be a standard location
255f1980244SYuriy Umanets	# or a custom build.
256f1980244SYuriy Umanets	local librte_crypto_ipsec_mb="$dpdk_libdir/librte_crypto_ipsec_mb.so"
257f1980244SYuriy Umanets	if [[ -f "$librte_crypto_ipsec_mb" ]]; then
258f1980244SYuriy Umanets		local ipsec_mb_libdir
259f1980244SYuriy Umanets
260f1980244SYuriy Umanets		ipsec_mb_libdir=$(ldd "$librte_crypto_ipsec_mb" | grep "libIPSec_MB.so" \
261f1980244SYuriy Umanets			| sed -e 's/\s*libIPSec_MB.so.*=>\s//' -e 's/\/libIPSec_MB.so.*$//')
262f1980244SYuriy Umanets		if [[ -d $ipsec_mb_libdir ]]; then
263f1980244SYuriy Umanets			CONFIG[IPSEC_MB]=y
264f1980244SYuriy Umanets			CONFIG[IPSEC_MB_DIR]="$ipsec_mb_libdir"
265f1980244SYuriy Umanets		elif [[ $ipsec_mb_libdir = "not found" ]]; then
266f1980244SYuriy Umanets			# ldconfig cache is broken, old build with refs to non-existing libs, etc.
267f1980244SYuriy Umanets			echo "ERROR: Invalid IPSec_MB installation. Library is not found and/or ldconfig cache is broken!"
268f1980244SYuriy Umanets			exit 1
269f1980244SYuriy Umanets		else
270f1980244SYuriy Umanets			# Failed to check for IPSec_MB lib path. Let's just assume it is lives
271f1980244SYuriy Umanets			# in one of the standard locations (/usr/lib, etc.).
272f1980244SYuriy Umanets			CONFIG[IPSEC_MB]=y
273f1980244SYuriy Umanets		fi
274f1980244SYuriy Umanets	else
275f1980244SYuriy Umanets		# pkg-config says there is IPSec_mb and dpdk lib does not have it. Let's just
276f1980244SYuriy Umanets		# assume it is installed in the system in one of the standard locations.
277f1980244SYuriy Umanets		CONFIG[IPSEC_MB]=y
278f1980244SYuriy Umanets	fi
279f1980244SYuriy Umanets}
280f1980244SYuriy Umanets
2819dd998cdSBen Walkerfor i in "$@"; do
2829dd998cdSBen Walker	case "$i" in
2839dd998cdSBen Walker		-h | --help)
2849dd998cdSBen Walker			usage
2859dd998cdSBen Walker			exit 0
2869dd998cdSBen Walker			;;
2874d2e26d8STomasz Zawadzki		--cross-prefix=*) ;&
2884d2e26d8STomasz Zawadzki		--enable-lto) ;&
2894d2e26d8STomasz Zawadzki		--disable-lto)
2904d2e26d8STomasz Zawadzki			# Options handled before detecting CC.
2914d2e26d8STomasz Zawadzki			;;
2922e7fe8e8SDaniel Verkamp		--prefix=*)
293577df16aSPawel Wodkowski			CONFIG[PREFIX]="${i#*=}"
2942e7fe8e8SDaniel Verkamp			;;
2950e6ddfd6SBen Walker		--target-arch=*)
2960e6ddfd6SBen Walker			CONFIG[ARCH]="${i#*=}"
2970e6ddfd6SBen Walker			;;
298e8863cb7SMichal Berger		--libdir=*)
299e8863cb7SMichal Berger			CONFIG[LIBDIR]="${i#*=}"
300e8863cb7SMichal Berger			;;
3019dd998cdSBen Walker		--enable-debug)
302577df16aSPawel Wodkowski			CONFIG[DEBUG]=y
3039dd998cdSBen Walker			;;
3049dd998cdSBen Walker		--disable-debug)
305577df16aSPawel Wodkowski			CONFIG[DEBUG]=n
3069dd998cdSBen Walker			;;
3079dd998cdSBen Walker		--enable-asan)
308577df16aSPawel Wodkowski			CONFIG[ASAN]=y
3099dd998cdSBen Walker			;;
3109dd998cdSBen Walker		--disable-asan)
311577df16aSPawel Wodkowski			CONFIG[ASAN]=n
3129dd998cdSBen Walker			;;
3139dd998cdSBen Walker		--enable-ubsan)
314577df16aSPawel Wodkowski			CONFIG[UBSAN]=y
3159dd998cdSBen Walker			;;
3169dd998cdSBen Walker		--disable-ubsan)
317577df16aSPawel Wodkowski			CONFIG[UBSAN]=n
3189dd998cdSBen Walker			;;
319830912e2SBen Walker		--enable-tsan)
320577df16aSPawel Wodkowski			CONFIG[TSAN]=y
321830912e2SBen Walker			;;
322830912e2SBen Walker		--disable-tsan)
323577df16aSPawel Wodkowski			CONFIG[TSAN]=n
324830912e2SBen Walker			;;
3259dd998cdSBen Walker		--enable-coverage)
326577df16aSPawel Wodkowski			CONFIG[COVERAGE]=y
3279dd998cdSBen Walker			;;
3289dd998cdSBen Walker		--disable-coverage)
329577df16aSPawel Wodkowski			CONFIG[COVERAGE]=n
3309dd998cdSBen Walker			;;
331995d60f4SBen Walker		--enable-pgo-capture)
332995d60f4SBen Walker			CONFIG[PGO_CAPTURE]=y
333995d60f4SBen Walker			;;
334995d60f4SBen Walker		--disable-pgo-capture)
335995d60f4SBen Walker			CONFIG[PGO_CAPTURE]=n
336995d60f4SBen Walker			;;
337995d60f4SBen Walker		--enable-pgo-use)
338995d60f4SBen Walker			CONFIG[PGO_USE]=y
339995d60f4SBen Walker			;;
340995d60f4SBen Walker		--disable-pgo-use)
341995d60f4SBen Walker			CONFIG[PGO_USE]=n
342995d60f4SBen Walker			;;
3439022a59eSDaniel Verkamp		--enable-tests)
344577df16aSPawel Wodkowski			CONFIG[TESTS]=y
3459022a59eSDaniel Verkamp			;;
3469022a59eSDaniel Verkamp		--disable-tests)
347577df16aSPawel Wodkowski			CONFIG[TESTS]=n
3489022a59eSDaniel Verkamp			;;
3499fcb1cb0STomasz Zawadzki		--enable-unit-tests)
3509fcb1cb0STomasz Zawadzki			CONFIG[UNIT_TESTS]=y
3519fcb1cb0STomasz Zawadzki			;;
3529fcb1cb0STomasz Zawadzki		--disable-unit-tests)
3539fcb1cb0STomasz Zawadzki			CONFIG[UNIT_TESTS]=n
3549fcb1cb0STomasz Zawadzki			;;
3559b2c6452SJacek Kalwas		--enable-examples)
3569b2c6452SJacek Kalwas			CONFIG[EXAMPLES]=y
3579b2c6452SJacek Kalwas			;;
3589b2c6452SJacek Kalwas		--disable-examples)
3599b2c6452SJacek Kalwas			CONFIG[EXAMPLES]=n
3609b2c6452SJacek Kalwas			;;
361119158cdSRajarshi Chowdhury		--enable-apps)
362119158cdSRajarshi Chowdhury			CONFIG[APPS]=y
363119158cdSRajarshi Chowdhury			;;
364119158cdSRajarshi Chowdhury		--disable-apps)
365119158cdSRajarshi Chowdhury			CONFIG[APPS]=N
366119158cdSRajarshi Chowdhury			;;
3679dd998cdSBen Walker		--enable-werror)
368577df16aSPawel Wodkowski			CONFIG[WERROR]=y
3699dd998cdSBen Walker			;;
3709dd998cdSBen Walker		--disable-werror)
371577df16aSPawel Wodkowski			CONFIG[WERROR]=n
3729dd998cdSBen Walker			;;
37391e42257SJim Harris		--enable-cet)
37491e42257SJim Harris			CONFIG[CET]=y
37591e42257SJim Harris			;;
37691e42257SJim Harris		--disable-cet)
37791e42257SJim Harris			CONFIG[CET]=n
37891e42257SJim Harris			;;
3797232c450SMichal Berger		--with-dpdk)
3807b04eb72SYuriy Umanets			# Can we use pkg-config?
3817b04eb72SYuriy Umanets			if command -v "pkg-config" > /dev/null 2>&1 && pkg-config --exists libdpdk; then
3827b04eb72SYuriy Umanets				dpdk_libdir=$(pkg-config --variable=libdir libdpdk)
3837b04eb72SYuriy Umanets				dpdk_libdir=$(readlink -f $dpdk_libdir)
3847b04eb72SYuriy Umanets				dpdk_incdir=$(pkg-config --variable=includedir libdpdk)
3857b04eb72SYuriy Umanets				echo "Using DPDK lib dir $dpdk_libdir"
3867b04eb72SYuriy Umanets				CONFIG[DPDK_LIB_DIR]=$dpdk_libdir
3877b04eb72SYuriy Umanets				CONFIG[DPDK_INC_DIR]=$dpdk_incdir
3887232c450SMichal Berger				CONFIG[DPDK_PKG_CONFIG]=y
3897232c450SMichal Berger				CFLAGS="${CFLAGS:+$CFLAGS }$(pkg-config --cflags libdpdk)"
390f1980244SYuriy Umanets				check_IPSec_mb "pkg-config" "$dpdk_libdir" "$dpdk_incdir"
3917232c450SMichal Berger			else
3927232c450SMichal Berger				echo "libdpdk.pc not found, aborting"
3937232c450SMichal Berger				exit 1
3947232c450SMichal Berger			fi
3957232c450SMichal Berger			;;
39606cc8045SBen Walker		--with-dpdk=*)
39706cc8045SBen Walker			check_dir "$i"
3987b04eb72SYuriy Umanets			dpdk_dir=$(readlink -f ${i#*=})
3997b04eb72SYuriy Umanets			dpdk_libdir=$(find_dpdk_arch_libdir $dpdk_dir)
4007b04eb72SYuriy Umanets			dpdk_incdir="$dpdk_dir/include"
4017b04eb72SYuriy Umanets
4027b04eb72SYuriy Umanets			# Can we use pkg-config?
403f13ec525SKarol Latecki			if command -v "pkg-config" > /dev/null 2>&1 && PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --exists libdpdk; then
4047b04eb72SYuriy Umanets				echo "Using $dpdk_libdir/pkgconfig for additional libs..."
4051e6db5fbSTomasz Zawadzki				sysroot_dir=$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --variable=pc_sysrootdir libdpdk)
406e9438453SJacek Kalwas				dpdk_libdir=$(PKG_CONFIG_SYSROOT_DIR='' PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --variable=libdir libdpdk)
4071e6db5fbSTomasz Zawadzki				dpdk_libdir=$(readlink -f "${sysroot_dir}$dpdk_libdir")
4087b04eb72SYuriy Umanets				if ! echo $dpdk_libdir | grep $dpdk_dir > /dev/null 2>&1; then
4097b04eb72SYuriy Umanets					echo "ERROR: pkg-config reported DPDK libdir $dpdk_libdir is out of the directory specified with --with-dpdk="
4107b04eb72SYuriy Umanets					echo "ERROR: do you have another DPDK installed in the system?"
4117b04eb72SYuriy Umanets					exit 1
4127b04eb72SYuriy Umanets				fi
413f13ec525SKarol Latecki				CFLAGS="${CFLAGS:+$CFLAGS }$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --cflags libdpdk)"
4141e6db5fbSTomasz Zawadzki				dpdk_incdir="${sysroot_dir}$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --variable=includedir libdpdk)"
415f1980244SYuriy Umanets				check_IPSec_mb "pkg-config" "$dpdk_libdir" "$dpdk_incdir"
4163e3fbf91SYuriy Umanets			else
4173e3fbf91SYuriy Umanets				echo "Using $dpdk_incdir/rte_build_config.h for additional libs..."
4183e3fbf91SYuriy Umanets
419f1980244SYuriy Umanets				check_IPSec_mb "build-config" "$dpdk_libdir" "$dpdk_incdir"
4207b04eb72SYuriy Umanets			fi
4217b04eb72SYuriy Umanets			echo "DPDK libraries: $dpdk_libdir"
4227b04eb72SYuriy Umanets			echo "DPDK includes: $dpdk_incdir"
4237b04eb72SYuriy Umanets			CONFIG[DPDK_DIR]=$dpdk_dir
4247b04eb72SYuriy Umanets			CONFIG[DPDK_LIB_DIR]="$dpdk_libdir"
4257b04eb72SYuriy Umanets			CONFIG[DPDK_INC_DIR]="$dpdk_incdir"
4267b04eb72SYuriy Umanets			CONFIG[DPDK_PKG_CONFIG]=n
42706cc8045SBen Walker			;;
42806cc8045SBen Walker		--without-dpdk)
42906cc8045SBen Walker			CONFIG[DPDK_DIR]=
43006cc8045SBen Walker			;;
4319854c138SNick Connolly		--with-wpdk=*)
4329854c138SNick Connolly			check_dir "$i"
4339854c138SNick Connolly			CONFIG[WPDK_DIR]=$(readlink -f ${i#*=})
4349854c138SNick Connolly			;;
4352bc71094SMichal Berger		--without-wpdk)
4362bc71094SMichal Berger			CONFIG[WPDK_DIR]=
4372bc71094SMichal Berger			;;
4389dd998cdSBen Walker		--with-env=*)
439577df16aSPawel Wodkowski			CONFIG[ENV]="${i#*=}"
4409dd998cdSBen Walker			;;
441ed2b53f3SYifan Bian		--with-ublk)
442ed2b53f3SYifan Bian			CONFIG[UBLK]=y
443ed2b53f3SYifan Bian			;;
444ed2b53f3SYifan Bian		--without-ublk)
445ed2b53f3SYifan Bian			CONFIG[UBLK]=n
446ed2b53f3SYifan Bian			;;
4479dd998cdSBen Walker		--with-rbd)
448577df16aSPawel Wodkowski			CONFIG[RBD]=y
4499dd998cdSBen Walker			;;
4509dd998cdSBen Walker		--without-rbd)
451577df16aSPawel Wodkowski			CONFIG[RBD]=n
4529dd998cdSBen Walker			;;
453daee62a0SAlexey Marchuk		--with-rdma=*)
454daee62a0SAlexey Marchuk			CONFIG[RDMA]=y
455daee62a0SAlexey Marchuk			CONFIG[RDMA_PROV]=${i#*=}
456daee62a0SAlexey Marchuk			;;
4579dd998cdSBen Walker		--with-rdma)
458577df16aSPawel Wodkowski			CONFIG[RDMA]=y
459daee62a0SAlexey Marchuk			CONFIG[RDMA_PROV]="verbs"
4609dd998cdSBen Walker			;;
4619dd998cdSBen Walker		--without-rdma)
462577df16aSPawel Wodkowski			CONFIG[RDMA]=n
4639dd998cdSBen Walker			;;
464ed56a3d4SAnil Veerabhadrappa		--with-fc=*)
465ed56a3d4SAnil Veerabhadrappa			CONFIG[FC]=y
466ed56a3d4SAnil Veerabhadrappa			CONFIG[FC_PATH]=$(readlink -f ${i#*=})
467ed56a3d4SAnil Veerabhadrappa			;;
468ed56a3d4SAnil Veerabhadrappa		--with-fc)
469ed56a3d4SAnil Veerabhadrappa			CONFIG[FC]=y
470ed56a3d4SAnil Veerabhadrappa			CONFIG[FC_PATH]=
471ed56a3d4SAnil Veerabhadrappa			;;
472ed56a3d4SAnil Veerabhadrappa		--without-fc)
473ed56a3d4SAnil Veerabhadrappa			CONFIG[FC]=n
474ed56a3d4SAnil Veerabhadrappa			CONFIG[FC_PATH]=
475ed56a3d4SAnil Veerabhadrappa			;;
4762e283fcbS0xe0f		--with-daos)
4772e283fcbS0xe0f			CONFIG[DAOS]=y
478044bb175SDenis Barakthanov			CONFIG[DAOS_DIR]=""
479044bb175SDenis Barakthanov			;;
480044bb175SDenis Barakthanov		--with-daos=*)
481044bb175SDenis Barakthanov			CONFIG[DAOS]=y
482044bb175SDenis Barakthanov			check_dir "$i"
483044bb175SDenis Barakthanov			CONFIG[DAOS_DIR]=$(readlink -f ${i#*=})
4842e283fcbS0xe0f			;;
4852e283fcbS0xe0f		--without-daos)
4862e283fcbS0xe0f			CONFIG[DAOS]=n
4872e283fcbS0xe0f			;;
4880923734cSLance Hartmann		--with-shared)
489577df16aSPawel Wodkowski			CONFIG[SHARED]=y
4900923734cSLance Hartmann			;;
4910923734cSLance Hartmann		--without-shared)
492577df16aSPawel Wodkowski			CONFIG[SHARED]=n
4930923734cSLance Hartmann			;;
4942af15344SJim Harris		--with-iscsi-initiator)
495577df16aSPawel Wodkowski			CONFIG[ISCSI_INITIATOR]=y
4962af15344SJim Harris			;;
4972af15344SJim Harris		--without-iscsi-initiator)
498577df16aSPawel Wodkowski			CONFIG[ISCSI_INITIATOR]=n
4992af15344SJim Harris			;;
5006118b853SDaniel Verkamp		--with-crypto)
501577df16aSPawel Wodkowski			CONFIG[CRYPTO]=y
5026118b853SDaniel Verkamp			;;
5036118b853SDaniel Verkamp		--without-crypto)
504577df16aSPawel Wodkowski			CONFIG[CRYPTO]=n
5056118b853SDaniel Verkamp			;;
50635260f2bSDaniel Verkamp		--with-vhost)
507577df16aSPawel Wodkowski			CONFIG[VHOST]=y
50835260f2bSDaniel Verkamp			;;
50935260f2bSDaniel Verkamp		--without-vhost)
510577df16aSPawel Wodkowski			CONFIG[VHOST]=n
51135260f2bSDaniel Verkamp			;;
5127dee96ceSDariusz Stojaczyk		--with-virtio)
513577df16aSPawel Wodkowski			CONFIG[VIRTIO]=y
5147dee96ceSDariusz Stojaczyk			;;
5157dee96ceSDariusz Stojaczyk		--without-virtio)
516577df16aSPawel Wodkowski			CONFIG[VIRTIO]=n
5177dee96ceSDariusz Stojaczyk			;;
518b30d57cdSChangpeng Liu		--with-vfio-user)
519b30d57cdSChangpeng Liu			CONFIG[VFIO_USER]=y
520d0b2448bSChangpeng Liu			CONFIG[VFIO_USER_DIR]=""
521d0b2448bSChangpeng Liu			;;
522d0b2448bSChangpeng Liu		--with-vfio-user=*)
523d0b2448bSChangpeng Liu			CONFIG[VFIO_USER]=y
524d0b2448bSChangpeng Liu			check_dir "$i"
525d0b2448bSChangpeng Liu			CONFIG[VFIO_USER_DIR]=$(readlink -f ${i#*=})
526b30d57cdSChangpeng Liu			;;
527b30d57cdSChangpeng Liu		--without-vfio-user)
528b30d57cdSChangpeng Liu			CONFIG[VFIO_USER]=n
529b30d57cdSChangpeng Liu			;;
53019e2dc38Spaul luse		--with-vbdev-compress)
53119e2dc38Spaul luse			CONFIG[VBDEV_COMPRESS]=y
53297022803SJim Harris			;;
53319e2dc38Spaul luse		--without-vbdev-compress)
53419e2dc38Spaul luse			CONFIG[VBDEV_COMPRESS]=n
53597022803SJim Harris			;;
536976f8b09Spaul luse		--with-dpdk-compressdev)
537976f8b09Spaul luse			CONFIG[DPDK_COMPRESSDEV]=y
538976f8b09Spaul luse			;;
539976f8b09Spaul luse		--without-dpdk-compressdev)
540976f8b09Spaul luse			CONFIG[DPDK_COMPRESSDEV]=n
541976f8b09Spaul luse			;;
5426f338d4bSKrishna Kanth Reddy		--with-xnvme)
5436f338d4bSKrishna Kanth Reddy			CONFIG[XNVME]=y
5446f338d4bSKrishna Kanth Reddy			;;
5456f338d4bSKrishna Kanth Reddy		--without-xnvme)
5466f338d4bSKrishna Kanth Reddy			CONFIG[XNVME]=n
5476f338d4bSKrishna Kanth Reddy			;;
548c3329b52SMichal Berger		--with-fio) ;&
5499dd998cdSBen Walker		--with-fio=*)
550c3329b52SMichal Berger			if [[ ${i#*=} != "$i" ]]; then
55111a5716dSMichal Berger				CONFIG[FIO_SOURCE_DIR]=${i#*=}
552c3329b52SMichal Berger			fi
553c3329b52SMichal Berger			check_dir "--with-fio=${CONFIG[FIO_SOURCE_DIR]}"
55411a5716dSMichal Berger			CONFIG[FIO_SOURCE_DIR]=$(readlink -f "${CONFIG[FIO_SOURCE_DIR]}")
555577df16aSPawel Wodkowski			CONFIG[FIO_PLUGIN]=y
5569dd998cdSBen Walker			;;
5579dd998cdSBen Walker		--without-fio)
558577df16aSPawel Wodkowski			CONFIG[FIO_PLUGIN]=n
5599dd998cdSBen Walker			;;
5605712088aSRoman Sudarikov		--with-vtune=*)
5611723a800SGangCao			check_dir "$i"
562577df16aSPawel Wodkowski			CONFIG[VTUNE_DIR]="${i#*=}"
563577df16aSPawel Wodkowski			CONFIG[VTUNE]=y
5645712088aSRoman Sudarikov			;;
5655712088aSRoman Sudarikov		--without-vtune)
566577df16aSPawel Wodkowski			CONFIG[VTUNE_DIR]=
567577df16aSPawel Wodkowski			CONFIG[VTUNE]=n
5685712088aSRoman Sudarikov			;;
56998d60de6SPiotr Pelplinski		--with-ocf)
57098d60de6SPiotr Pelplinski			CONFIG[OCF]=y
571985d6468SKamil Godzwon			CONFIG[OCF_PATH]=$(readlink -f "$rootdir/ocf")
57298d60de6SPiotr Pelplinski			;;
573d1fee489SVitaliy Mysak		--with-ocf=*)
574d1fee489SVitaliy Mysak			CONFIG[OCF]=y
575d1fee489SVitaliy Mysak			CONFIG[OCF_PATH]=$(readlink -f ${i#*=})
576d1fee489SVitaliy Mysak			;;
577d1fee489SVitaliy Mysak		--without-ocf)
578d1fee489SVitaliy Mysak			CONFIG[OCF]=n
579d1fee489SVitaliy Mysak			CONFIG[OCF_PATH]=
580d1fee489SVitaliy Mysak			;;
5818165bf71SBen Walker		--with-uring=*)
5828165bf71SBen Walker			CONFIG[URING]=y
5838165bf71SBen Walker			CONFIG[URING_PATH]=$(readlink -f ${i#*=})
5848165bf71SBen Walker			;;
5858165bf71SBen Walker		--with-uring)
5868165bf71SBen Walker			CONFIG[URING]=y
587958d196cSIndraneel M			CONFIG[URING_ZNS]=y
5888165bf71SBen Walker			CONFIG[URING_PATH]=
5898165bf71SBen Walker			;;
5908165bf71SBen Walker		--without-uring)
5918165bf71SBen Walker			CONFIG[URING]=n
5928165bf71SBen Walker			CONFIG[URING_PATH]=
5938165bf71SBen Walker			;;
594958d196cSIndraneel M		--without-uring-zns)
595958d196cSIndraneel M			CONFIG[URING_ZNS]=n
5968b840195SIndraneel M			;;
59734192459SBoris Glimcher		--with-openssl=*)
59834192459SBoris Glimcher			check_dir "$i"
59934192459SBoris Glimcher			CONFIG[OPENSSL_PATH]=$(readlink -f ${i#*=})
60034192459SBoris Glimcher			;;
6017fa15e28SXiaodong Liu		--with-fuse)
6027fa15e28SXiaodong Liu			CONFIG[FUSE]=y
6037fa15e28SXiaodong Liu			;;
6047fa15e28SXiaodong Liu		--without-fuse)
6057fa15e28SXiaodong Liu			CONFIG[FUSE]=n
6067fa15e28SXiaodong Liu			;;
607805d9942STomasz Kulasek		--with-nvme-cuse)
608805d9942STomasz Kulasek			CONFIG[NVME_CUSE]=y
609805d9942STomasz Kulasek			;;
610805d9942STomasz Kulasek		--without-nvme-cuse)
611805d9942STomasz Kulasek			CONFIG[NVME_CUSE]=n
612805d9942STomasz Kulasek			;;
61383a4b155SArtur Paszkiewicz		--with-raid5f)
61483a4b155SArtur Paszkiewicz			CONFIG[RAID5F]=y
61573763d40SArtur Paszkiewicz			;;
61683a4b155SArtur Paszkiewicz		--without-raid5f)
61783a4b155SArtur Paszkiewicz			CONFIG[RAID5F]=n
61873763d40SArtur Paszkiewicz			;;
619e58e9fbdSpaul luse		--with-idxd)
620e58e9fbdSpaul luse			CONFIG[IDXD]=y
6212ed914f8SZiye Yang			CONFIG[IDXD_KERNEL]=n
622e58e9fbdSpaul luse			;;
623e58e9fbdSpaul luse		--without-idxd)
624e58e9fbdSpaul luse			CONFIG[IDXD]=n
625e58e9fbdSpaul luse			;;
6265a1c74bfSJim Harris		--with-usdt)
6275a1c74bfSJim Harris			CONFIG[USDT]=y
6285a1c74bfSJim Harris			;;
6295a1c74bfSJim Harris		--without-usdt)
6305a1c74bfSJim Harris			CONFIG[USDT]=n
6315a1c74bfSJim Harris			;;
632050565e5SJim Harris		--with-fuzzer)
633050565e5SJim Harris			echo "Must specify fuzzer library path with --with-fuzzer"
634050565e5SJim Harris			usage
635050565e5SJim Harris			exit 1
636050565e5SJim Harris			;;
637050565e5SJim Harris		--with-fuzzer=*)
638050565e5SJim Harris			CONFIG[FUZZER]=y
639050565e5SJim Harris			CONFIG[FUZZER_LIB]=$(readlink -f ${i#*=})
640050565e5SJim Harris			;;
641050565e5SJim Harris		--without-fuzzer)
642050565e5SJim Harris			CONFIG[FUZZER]=n
643050565e5SJim Harris			CONFIG[FUZZER_LIB]=
644050565e5SJim Harris			;;
645509241ceSKonrad Sztyber		--with-sma)
646509241ceSKonrad Sztyber			CONFIG[SMA]=y
647509241ceSKonrad Sztyber			;;
648509241ceSKonrad Sztyber		--without-sma)
649509241ceSKonrad Sztyber			CONFIG[SMA]=n
650509241ceSKonrad Sztyber			;;
6512796687dSParameswaran Krishnamurthy		--with-avahi)
6522796687dSParameswaran Krishnamurthy			CONFIG[AVAHI]=y
6532796687dSParameswaran Krishnamurthy			;;
6542796687dSParameswaran Krishnamurthy		--without-avahi)
6552796687dSParameswaran Krishnamurthy			CONFIG[AVAHI]=n
6562796687dSParameswaran Krishnamurthy			;;
6578247bd40SMarcin Spiewak		--max-lcores='')
6588247bd40SMarcin Spiewak			echo "Must specify max number of lcores for --max-lcores"
6598247bd40SMarcin Spiewak			usage
6608247bd40SMarcin Spiewak			exit 1
6618247bd40SMarcin Spiewak			;;
6628247bd40SMarcin Spiewak		--max-lcores=*)
6638247bd40SMarcin Spiewak			CONFIG[MAX_LCORES]="${i#*=}"
66473293d73SMarcin Spiewak			CONFIG["MAX_LCORES"]=${CONFIG["MAX_LCORES"],,}
6658247bd40SMarcin Spiewak			;;
6669dd998cdSBen Walker		--)
6679dd998cdSBen Walker			break
6689dd998cdSBen Walker			;;
6699dd998cdSBen Walker		*)
6709dd998cdSBen Walker			echo "Unrecognized option $i"
6719dd998cdSBen Walker			usage
6729dd998cdSBen Walker			exit 1
6735ccabc8fSMichal Berger			;;
6749dd998cdSBen Walker	esac
6759dd998cdSBen Walkerdone
6769dd998cdSBen Walker
677131c9aadSAlexey Marchukif [[ $arch == x86_64* ]]; then
67810e1c615SFélix Piédallu	BUILD_CMD=($CC -o /dev/null -x c $CPPFLAGS $CFLAGS $LDFLAGS "-march=native")
679131c9aadSAlexey Marchukelse
68010e1c615SFélix Piédallu	BUILD_CMD=($CC -o /dev/null -x c $CPPFLAGS $CFLAGS $LDFLAGS)
681131c9aadSAlexey Marchukfi
6826c23a6f4SMichal BergerBUILD_CMD+=(-I/usr/local/include -L/usr/local/lib)
68373439e6fSBen Walker
684b30d57cdSChangpeng Liuif [[ "${CONFIG[VFIO_USER]}" = "y" ]]; then
685421368c0SGreg Inozemtsev	if ! echo -e '#include <json-c/json.h>' \
686421368c0SGreg Inozemtsev		| "${BUILD_CMD[@]}" -E - 2> /dev/null; then
6873b673b84SChangpeng Liu		echo "ERROR: --with-vfio-user requires json-c-devel"
6883b673b84SChangpeng Liu		echo "Please install then re-run this script"
6893b673b84SChangpeng Liu		exit 1
6903b673b84SChangpeng Liu	fi
691421368c0SGreg Inozemtsev	if ! echo -e '#include <cmocka.h>' \
692421368c0SGreg Inozemtsev		| "${BUILD_CMD[@]}" -E - 2> /dev/null; then
6933b673b84SChangpeng Liu		echo "ERROR: --with-vfio-user requires libcmocka-devel"
6943b673b84SChangpeng Liu		echo "Please install then re-run this script"
6953b673b84SChangpeng Liu		exit 1
696b30d57cdSChangpeng Liu	fi
697b30d57cdSChangpeng Liufi
698b30d57cdSChangpeng Liu
699e58e9fbdSpaul luse# IDXD uses Intel specific instructions.
700e58e9fbdSpaul luseif [[ "${CONFIG[IDXD]}" = "y" ]]; then
7012755fbdfSpaul luse	if [ $(uname -s) == "FreeBSD" ]; then
7022755fbdfSpaul luse		intel="hw.model: Intel"
7032755fbdfSpaul luse		cpu_vendor=$(sysctl -a | grep hw.model | cut -c 1-15)
7042755fbdfSpaul luse	else
705e58e9fbdSpaul luse		intel="GenuineIntel"
706e58e9fbdSpaul luse		cpu_vendor=$(grep -i 'vendor' /proc/cpuinfo --max-count=1)
7072755fbdfSpaul luse	fi
708e58e9fbdSpaul luse	if [[ "$cpu_vendor" != *"$intel"* ]]; then
709ff238359SJosh Soref		echo "ERROR: IDXD cannot be used due to CPU incompatibility."
710e58e9fbdSpaul luse		exit 1
711e58e9fbdSpaul luse	fi
7122ed914f8SZiye Yang	if [ -e /usr/include/accel-config/libaccel_config.h ]; then
7132ed914f8SZiye Yang		CONFIG[IDXD_KERNEL]=y
7142ed914f8SZiye Yang	fi
7152ed914f8SZiye Yang
716e58e9fbdSpaul lusefi
717e58e9fbdSpaul luse
718577df16aSPawel Wodkowskiif [ -z "${CONFIG[ENV]}" ]; then
719577df16aSPawel Wodkowski	CONFIG[ENV]=$rootdir/lib/env_dpdk
720577df16aSPawel Wodkowski	echo "Using default SPDK env in ${CONFIG[ENV]}"
7217232c450SMichal Berger	if [[ -z "${CONFIG[DPDK_DIR]}" && "${CONFIG[DPDK_PKG_CONFIG]}" == n ]]; then
72238e26cf5STomasz Zawadzki		if [ ! -f "$rootdir"/dpdk/config/meson.build ]; then
723d199eb29SDaniel Verkamp			echo "DPDK not found; please specify --with-dpdk=<path> or run:"
724d199eb29SDaniel Verkamp			echo
725d199eb29SDaniel Verkamp			echo "  git submodule update --init"
726d199eb29SDaniel Verkamp			exit 1
727577df16aSPawel Wodkowski		else
728577df16aSPawel Wodkowski			CONFIG[DPDK_DIR]="${rootdir}/dpdk/build"
729f1980244SYuriy Umanets			# Default ipsec libs
73019518dfbSAleksey Marchuk			if [[ "${CONFIG[CRYPTO]}" = "y" ]] && [[ $arch = x86_64* ]]; then
731f1980244SYuriy Umanets				CONFIG[IPSEC_MB]=y
732f1980244SYuriy Umanets				CONFIG[IPSEC_MB_DIR]="${rootdir}/intel-ipsec-mb/lib"
733f1980244SYuriy Umanets			fi
734577df16aSPawel Wodkowski			echo "Using default DPDK in ${CONFIG[DPDK_DIR]}"
735d199eb29SDaniel Verkamp		fi
7369dd998cdSBen Walker	fi
7377d2a2f52SBen Walkerelse
7387232c450SMichal Berger	if [[ -n "${CONFIG[DPDK_DIR]}" || "${CONFIG[DPDK_PKG_CONFIG]}" == y ]]; then
73906cc8045SBen Walker		echo "--with-env and --with-dpdk are mutually exclusive."
74006cc8045SBen Walker		exit 1
74106cc8045SBen Walker	fi
74206cc8045SBen Walker
743577df16aSPawel Wodkowski	if [ "${CONFIG[VHOST]}" = "y" ]; then
7447d2a2f52SBen Walker		echo "Vhost is only supported when using the default DPDK environment. Disabling it."
7457d2a2f52SBen Walker	fi
7467d2a2f52SBen Walker	# Always disable vhost, but only print the error message if the user explicitly turned it on.
747577df16aSPawel Wodkowski	CONFIG[VHOST]="n"
748577df16aSPawel Wodkowski	if [ "${CONFIG[VIRTIO]}" = "y" ]; then
7497d2a2f52SBen Walker		echo "Virtio is only supported when using the default DPDK environment. Disabling it."
7507d2a2f52SBen Walker	fi
7517d2a2f52SBen Walker	# Always disable virtio, but only print the error message if the user explicitly turned it on.
752577df16aSPawel Wodkowski	CONFIG[VIRTIO]="n"
7539dd998cdSBen Walkerfi
7549dd998cdSBen Walker
7557232c450SMichal Bergerif [[ "${CONFIG[DPDK_PKG_CONFIG]}" == y ]]; then
7567232c450SMichal Berger	if [[ "${CONFIG[SHARED]}" == n ]]; then
7577232c450SMichal Berger		# dpdk-devel doesn't provide static libs
7587232c450SMichal Berger		echo "Build against packaged DPDK requested, enabling shared libraries"
7597232c450SMichal Berger		CONFIG[SHARED]=y
7607232c450SMichal Berger	fi
7617232c450SMichal Bergerfi
7627232c450SMichal Berger
7639854c138SNick Connollyif [[ $sys_name == "Windows" ]]; then
7649854c138SNick Connolly	if [ -z "${CONFIG[WPDK_DIR]}" ]; then
7659854c138SNick Connolly		if [ ! -f "$rootdir"/wpdk/Makefile ]; then
7669854c138SNick Connolly			echo "WPDK not found; please specify --with-wpdk=<path>. See https://wpdk.github.io."
7679854c138SNick Connolly			exit 1
7689854c138SNick Connolly		else
7699854c138SNick Connolly			CONFIG[WPDK_DIR]="${rootdir}/wpdk/build"
7709854c138SNick Connolly			echo "Using default WPDK in ${CONFIG[WPDK_DIR]}"
7719854c138SNick Connolly		fi
7729854c138SNick Connolly	fi
7739854c138SNick Connollyelse
7749854c138SNick Connolly	if [ -n "${CONFIG[WPDK_DIR]}" ]; then
7759854c138SNick Connolly		echo "ERROR: --with-wpdk is only supported for Windows"
7769854c138SNick Connolly		exit 1
7779854c138SNick Connolly	fi
7789854c138SNick Connollyfi
7799854c138SNick Connolly
780577df16aSPawel Wodkowskiif [ "${CONFIG[VTUNE]}" = "y" ]; then
7816b97cccfSJim Harris	echo "WARNING: VTune support is deprecated."
782577df16aSPawel Wodkowski	if [ -z "${CONFIG[VTUNE_DIR]}" ]; then
7835712088aSRoman Sudarikov		echo "When VTune is enabled, you must specify the VTune directory using --with-vtune=path"
7845712088aSRoman Sudarikov		exit 1
7855712088aSRoman Sudarikov	fi
7865712088aSRoman Sudarikovfi
7875712088aSRoman Sudarikov
788bb0f78a2SMichal Bergerif [[ "${CONFIG[ASAN]}" = "y" && "${CONFIG[TSAN]}" = "y" ]]; then
789830912e2SBen Walker	echo "ERROR: ASAN and TSAN cannot be enabled at the same time."
790830912e2SBen Walker	exit 1
791830912e2SBen Walkerfi
792830912e2SBen Walker
793ac5b53a5SJim Harrisif [[ "${CONFIG[FIO_PLUGIN]}" = "y" && "${CONFIG[EXAMPLES]}" = "n" ]]; then
794ac5b53a5SJim Harris	echo "ERROR: --with-fio and --disable-examples are mutually exclusive."
795ac5b53a5SJim Harris	exit 1
796ac5b53a5SJim Harrisfi
797ac5b53a5SJim Harris
7985a764955SMichal Bergerif [[ $sys_name == "FreeBSD" ]]; then
7995091cadcSPaul Luse	# FreeBSD doesn't support all configurations
800577df16aSPawel Wodkowski	if [[ "${CONFIG[COVERAGE]}" == "y" ]]; then
8015091cadcSPaul Luse		echo "ERROR: CONFIG_COVERAGE not available on FreeBSD"
8025091cadcSPaul Luse		exit 1
8035091cadcSPaul Luse	fi
8045091cadcSPaul Lusefi
8055091cadcSPaul Luse
80625ac67f1SJim Harrisif [[ $sys_name == "Linux" ]]; then
80725ac67f1SJim Harris	if pkg-config libbsd; then
80825ac67f1SJim Harris		CONFIG[HAVE_LIBBSD]=y
80925ac67f1SJim Harris	fi
81025ac67f1SJim Harrisfi
81125ac67f1SJim Harris
812544a8fe5SJim Harrisif pkg-config libarchive; then
813544a8fe5SJim Harris	CONFIG[HAVE_LIBARCHIVE]=y
814544a8fe5SJim Harrisfi
815544a8fe5SJim Harris
8162a0c2a2dSNick Connollyif [[ $sys_name != "Linux" ]]; then
81727b920a2SDarek Stojaczyk	if [[ "${CONFIG[VHOST]}" == "y" ]]; then
818873c8748STomasz Kulasek		echo "Vhost is only supported on Linux."
819873c8748STomasz Kulasek		exit 1
82027b920a2SDarek Stojaczyk	fi
82127b920a2SDarek Stojaczyk	if [[ "${CONFIG[VIRTIO]}" == "y" ]]; then
822873c8748STomasz Kulasek		echo "Virtio is only supported on Linux."
823873c8748STomasz Kulasek		exit 1
82427b920a2SDarek Stojaczyk	fi
82527b920a2SDarek Stojaczykfi
82627b920a2SDarek Stojaczyk
827577df16aSPawel Wodkowskiif [ "${CONFIG[RDMA]}" = "y" ]; then
828daee62a0SAlexey Marchuk	if [[ ! "${CONFIG[RDMA_PROV]}" == "verbs" ]] && [[ ! "${CONFIG[RDMA_PROV]}" == "mlx5_dv" ]]; then
829daee62a0SAlexey Marchuk		echo "Invalid RDMA provider specified, must be \"verbs\" or \"mlx5_dv\""
830daee62a0SAlexey Marchuk		exit 1
831daee62a0SAlexey Marchuk	fi
832daee62a0SAlexey Marchuk
833eed0c6beSDarek Stojaczyk	if ! echo -e '#include <infiniband/verbs.h>\n#include <rdma/rdma_verbs.h>\n' \
834eed0c6beSDarek Stojaczyk		'int main(void) { return 0; }\n' \
835bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -libverbs -lrdmacm - 2> /dev/null; then
836bb0f78a2SMichal Berger		echo "--with-rdma requires libverbs and librdmacm."
837bb0f78a2SMichal Berger		echo "Please install then re-run this script."
838eed0c6beSDarek Stojaczyk		exit 1
839eed0c6beSDarek Stojaczyk	fi
840eed0c6beSDarek Stojaczyk
841eed0c6beSDarek Stojaczyk	if echo -e '#include <infiniband/verbs.h>\n' \
842eed0c6beSDarek Stojaczyk		'int main(void) { return !!IBV_WR_SEND_WITH_INV; }\n' \
843bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -c - 2> /dev/null; then
844577df16aSPawel Wodkowski		CONFIG[RDMA_SEND_WITH_INVAL]="y"
8457671073bSSeth Howell	else
846577df16aSPawel Wodkowski		CONFIG[RDMA_SEND_WITH_INVAL]="n"
84717a819f8SJim Harris		echo "
8487671073bSSeth Howell*******************************************************************************
8497671073bSSeth HowellWARNING: The Infiniband Verbs opcode Send With Invalidate is either not
8507671073bSSeth Howellsupported or is not functional with the current version of libibverbs installed
8517671073bSSeth Howellon this system. Please upgrade to at least version 1.1.
8527671073bSSeth Howell
8537671073bSSeth HowellBeginning with Linux kernel 4.14, the kernel NVMe-oF initiator leverages Send
8547671073bSSeth HowellWith Invalidate RDMA operations to improve performance. Failing to use the
8557671073bSSeth HowellSend With Invalidate operation on the NVMe-oF target side results in full
8567671073bSSeth Howellfunctionality, but greatly reduced performance. The SPDK NVMe-oF target will
8577671073bSSeth Howellbe unable to leverage that operation using the currently installed version
8587671073bSSeth Howellof libibverbs, so Linux kernel NVMe-oF initiators based on kernels greater
8597671073bSSeth Howellthan or equal to 4.14 will see significantly reduced performance.
86017a819f8SJim Harris*******************************************************************************"
8617671073bSSeth Howell	fi
86294966468SAlexey Marchuk
86394966468SAlexey Marchuk	if echo -e '#include <rdma/rdma_cma.h>\n' \
86494966468SAlexey Marchuk		'int main(void) { return !!RDMA_OPTION_ID_ACK_TIMEOUT; }\n' \
865bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -c - 2> /dev/null; then
86694966468SAlexey Marchuk		CONFIG[RDMA_SET_ACK_TIMEOUT]="y"
86794966468SAlexey Marchuk	else
86894966468SAlexey Marchuk		CONFIG[RDMA_SET_ACK_TIMEOUT]="n"
86994966468SAlexey Marchuk		echo "RDMA_OPTION_ID_ACK_TIMEOUT is not supported"
87094966468SAlexey Marchuk	fi
87194966468SAlexey Marchuk
8727706450fSMichael Haeuptle	if echo -e '#include <rdma/rdma_cma.h>\n' \
8737706450fSMichael Haeuptle		'int main(void) { return !!RDMA_OPTION_ID_TOS; }\n' \
8747706450fSMichael Haeuptle		| "${BUILD_CMD[@]}" -c - 2> /dev/null; then
8757706450fSMichael Haeuptle		CONFIG[RDMA_SET_TOS]="y"
8767706450fSMichael Haeuptle	else
8777706450fSMichael Haeuptle		CONFIG[RDMA_SET_TOS]="n"
8787706450fSMichael Haeuptle		echo "RDMA_OPTION_ID_TOS is not supported"
8797706450fSMichael Haeuptle	fi
8807706450fSMichael Haeuptle
881daee62a0SAlexey Marchuk	if [ "${CONFIG[RDMA_PROV]}" == "mlx5_dv" ]; then
882a1dfa7ecSAlexey Marchuk		MLX5_DV_BUILD_BUILD_CMD="
883a1dfa7ecSAlexey Marchuk		#include <infiniband/mlx5dv.h>\n
884a1dfa7ecSAlexey Marchuk		#include <rdma/rdma_cma.h>\n
885a1dfa7ecSAlexey Marchuk		int main(void) { return rdma_establish(NULL) ||\n
886a1dfa7ecSAlexey Marchuk		!!IBV_QP_INIT_ATTR_SEND_OPS_FLAGS || !!MLX5_OPCODE_RDMA_WRITE"
887a1dfa7ecSAlexey Marchuk		if [ "${CONFIG[CRYPTO]}" = "y" ]; then
888a1dfa7ecSAlexey Marchuk			MLX5_DV_BUILD_BUILD_CMD+="|| !!MLX5DV_CRYPTO_ENGINES_CAP_AES_XTS_SINGLE_BLOCK"
889a1dfa7ecSAlexey Marchuk		fi
890a1dfa7ecSAlexey Marchuk		MLX5_DV_BUILD_BUILD_CMD+=";}"
891a1dfa7ecSAlexey Marchuk		if ! echo -e $MLX5_DV_BUILD_BUILD_CMD | "${BUILD_CMD[@]}" -lmlx5 -I${rootdir}/include -c -; then
892daee62a0SAlexey Marchuk			echo "mlx5_dv provider is not supported"
893daee62a0SAlexey Marchuk			exit 1
894daee62a0SAlexey Marchuk		fi
895daee62a0SAlexey Marchuk	fi
896daee62a0SAlexey Marchuk
897bb0f78a2SMichal Berger	echo "Using '${CONFIG[RDMA_PROV]}' RDMA provider"
8987671073bSSeth Howellfi
8997671073bSSeth Howell
900ed56a3d4SAnil Veerabhadrappaif [[ "${CONFIG[FC]}" = "y" ]]; then
901ed56a3d4SAnil Veerabhadrappa	if [[ -n "${CONFIG[FC_PATH]}" ]]; then
902c9b4654bSTomasz Zawadzki		check_dir "${CONFIG[FC_PATH]}"
903ed56a3d4SAnil Veerabhadrappa	fi
904ed56a3d4SAnil Veerabhadrappafi
905ed56a3d4SAnil Veerabhadrappa
9062a6ddeb8SYuriy Umanetsfunction dpdk_version() {
9072a6ddeb8SYuriy Umanets	# Check DPDK version to determine if mlx5_pci driver is supported
9082a6ddeb8SYuriy Umanets	local dpdk_ver="none"
9092a6ddeb8SYuriy Umanets	if [[ "${CONFIG[DPDK_DIR]}" == "$rootdir/dpdk/build" ]]; then
9102a6ddeb8SYuriy Umanets		# DPDK_DIR points at our submodule so ./build may not exist yet. Use
9112a6ddeb8SYuriy Umanets		# absolute path to lookup the version.
9122a6ddeb8SYuriy Umanets		dpdk_ver=$(< "$rootdir/dpdk/VERSION")
9132a6ddeb8SYuriy Umanets	elif [[ -f "${CONFIG[DPDK_DIR]}"/../VERSION ]]; then
9142a6ddeb8SYuriy Umanets		dpdk_ver=$(< "${CONFIG[DPDK_DIR]}"/../VERSION)
9152a6ddeb8SYuriy Umanets	fi
9162a6ddeb8SYuriy Umanets	echo $dpdk_ver
9172a6ddeb8SYuriy Umanets}
9182a6ddeb8SYuriy Umanets
9192a6ddeb8SYuriy Umanetsfunction mlx5_build() {
9202a6ddeb8SYuriy Umanets	# Check if libmlx5 exists to enable mlx5_pci compress/crypto PMD
9212a6ddeb8SYuriy Umanets	if ! echo -e '#include <spdk/stdinc.h>\n' \
9222a6ddeb8SYuriy Umanets		'#include <infiniband/mlx5dv.h>\n' \
9232a6ddeb8SYuriy Umanets		'#include <infiniband/verbs.h>\n' \
9242a6ddeb8SYuriy Umanets		'int main(void) { return 0; }\n' \
9252a6ddeb8SYuriy Umanets		| "${BUILD_CMD[@]}" -lmlx5 -libverbs -I${rootdir}/include -c - 2> /dev/null; then
9262a6ddeb8SYuriy Umanets		return 1
9272a6ddeb8SYuriy Umanets	fi
9282a6ddeb8SYuriy Umanets	return 0
9292a6ddeb8SYuriy Umanets}
9302a6ddeb8SYuriy Umanets
93119e2dc38Spaul luseif [[ "${CONFIG[VBDEV_COMPRESS]}" = "y" ]]; then
93223196506STomasz Zawadzki	echo "WARNING: PMDK - Persistent device support with bdev_compress is deprecated."
933c4a3b312SDarek Stojaczyk	if ! echo -e '#include <libpmem.h>\nint main(void) { return 0; }\n' \
934bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -lpmem - 2> /dev/null; then
93519e2dc38Spaul luse		echo "--with-vbdev-compress requires libpmem."
936bb0f78a2SMichal Berger		echo "Please install then re-run this script."
93797022803SJim Harris		exit 1
93897022803SJim Harris	fi
9392a6ddeb8SYuriy Umanets	# Try to enable mlx5 compress
94019e2dc38Spaul luse	CONFIG[VBDEV_COMPRESS_MLX5]="y"
9412a6ddeb8SYuriy Umanets
942e71ae467SAlexey Marchuk	# Check if libmlx5 exists to enable mlx5_pci compress PMD
9432a6ddeb8SYuriy Umanets	if ! mlx5_build; then
944e71ae467SAlexey Marchuk		echo "libmlx5 is not found, so disabling DPDK mlx5_pci compress PMD"
94519e2dc38Spaul luse		CONFIG[VBDEV_COMPRESS_MLX5]="n"
9462a6ddeb8SYuriy Umanets	else
947e71ae467SAlexey Marchuk		if [[ "${CONFIG[DPDK_PKG_CONFIG]}" = "y" ]]; then
948e71ae467SAlexey Marchuk			# Check if librte_compress_mlx5 exists in DPDK package
949e71ae467SAlexey Marchuk			if [ ! -f "${CONFIG[DPDK_LIB_DIR]}"/librte_compress_mlx5.so ]; then
950e71ae467SAlexey Marchuk				echo "librte_compress_mlx5 is not found, so disabling DPDK mlx5_pci compress PMD"
95119e2dc38Spaul luse				CONFIG[VBDEV_COMPRESS_MLX5]="n"
952e71ae467SAlexey Marchuk			fi
953e71ae467SAlexey Marchuk		else
954e71ae467SAlexey Marchuk			# Check DPDK version to determine if mlx5_pci driver is supported
9552a6ddeb8SYuriy Umanets			dpdk_ver=$(dpdk_version)
9562a6ddeb8SYuriy Umanets			if [[ $dpdk_ver = "none" ]]; then
957c2de56b0SMichal Berger				echo "Cannot get DPDK version, so disabling DPDK mlx5_pci compress PMD"
95819e2dc38Spaul luse				CONFIG[VBDEV_COMPRESS_MLX5]="n"
9592a6ddeb8SYuriy Umanets			elif [[ -n $dpdk_ver ]] && lt "$dpdk_ver" 21.02.0; then
9602a6ddeb8SYuriy Umanets				# mlx5_pci for compress is supported by DPDK >- 21.02.0
961c2de56b0SMichal Berger				echo "DPDK version ${dpdk_ver} doesn't support mlx5_pci compress PMD"
96219e2dc38Spaul luse				CONFIG[VBDEV_COMPRESS_MLX5]="n"
9632a6ddeb8SYuriy Umanets			elif [[ -n ${CONFIG[DPDK_LIB_DIR]} ]] && [ ! -f "${CONFIG[DPDK_LIB_DIR]}"/librte_compress_mlx5.so ]; then
9642a6ddeb8SYuriy Umanets				# This is only checked when --with-dpdk or --with-dpdk=* is used
9652a6ddeb8SYuriy Umanets				echo "librte_compress_mlx5 is not found, so disabling DPDK mlx5_pci compress PMD"
96619e2dc38Spaul luse				CONFIG[VBDEV_COMPRESS_MLX5]="n"
9672a6ddeb8SYuriy Umanets			fi
9682a6ddeb8SYuriy Umanets		fi
9692a6ddeb8SYuriy Umanets	fi
9702a6ddeb8SYuriy Umanetsfi
9712a6ddeb8SYuriy Umanets
9722a6ddeb8SYuriy Umanetsif [[ "${CONFIG[CRYPTO]}" = "y" ]]; then
9732a6ddeb8SYuriy Umanets	# Try to enable mlx5 crypto
9742a6ddeb8SYuriy Umanets	CONFIG[CRYPTO_MLX5]="y"
9752a6ddeb8SYuriy Umanets
9762a6ddeb8SYuriy Umanets	# Check if libmlx5 exists to enable mlx5_pci compress PMD
9772a6ddeb8SYuriy Umanets	if ! mlx5_build; then
9782a6ddeb8SYuriy Umanets		echo "libmlx5 is not found, so disabling DPDK mlx5_pci crypto PMD"
9792a6ddeb8SYuriy Umanets		CONFIG[CRYPTO_MLX5]="n"
9802a6ddeb8SYuriy Umanets	else
9812a6ddeb8SYuriy Umanets		if [[ "${CONFIG[DPDK_PKG_CONFIG]}" = "y" ]]; then
9822a6ddeb8SYuriy Umanets			# Check if librte_crypto_mlx5 exists in DPDK package
9832a6ddeb8SYuriy Umanets			if [ ! -f "${CONFIG[DPDK_LIB_DIR]}"/librte_crypto_mlx5.so ]; then
9842a6ddeb8SYuriy Umanets				echo "librte_crypto_mlx5 is not found, so disabling DPDK mlx5_pci crypto PMD"
9852a6ddeb8SYuriy Umanets				CONFIG[CRYPTO_MLX5]="n"
9862a6ddeb8SYuriy Umanets			fi
9872a6ddeb8SYuriy Umanets		else
9882a6ddeb8SYuriy Umanets			# Check DPDK version to determine if mlx5_pci driver is supported
9892a6ddeb8SYuriy Umanets			dpdk_ver=$(dpdk_version)
9902a6ddeb8SYuriy Umanets			if [[ $dpdk_ver = "none" ]]; then
9912a6ddeb8SYuriy Umanets				echo "Cannot get DPDK version, so disabling DPDK mlx5_pci crypto PMD"
9922a6ddeb8SYuriy Umanets				CONFIG[CRYPTO_MLX5]="n"
9938a2fc789SYuriy Umanets			elif [[ -n $dpdk_ver ]] && lt "$dpdk_ver" 21.11.0; then
9948a2fc789SYuriy Umanets				# mlx5_pci for crypto is supported by DPDK >- 21.11.0
9952a6ddeb8SYuriy Umanets				echo "DPDK version ${dpdk_ver} doesn't support mlx5_pci crypto PMD"
9962a6ddeb8SYuriy Umanets				CONFIG[CRYPTO_MLX5]="n"
9972a6ddeb8SYuriy Umanets			elif [[ -n ${CONFIG[DPDK_LIB_DIR]} ]] && [ ! -f "${CONFIG[DPDK_LIB_DIR]}"/librte_crypto_mlx5.so ]; then
9982a6ddeb8SYuriy Umanets				# This is only checked when --with-dpdk or --with-dpdk=* is used
9992a6ddeb8SYuriy Umanets				echo "librte_crypto_mlx5 is not found, so disabling DPDK mlx5_pci crypto PMD"
10002a6ddeb8SYuriy Umanets				CONFIG[CRYPTO_MLX5]="n"
10012a6ddeb8SYuriy Umanets			fi
1002e71ae467SAlexey Marchuk		fi
1003e269bf4eSAlexey Marchuk	fi
100497022803SJim Harrisfi
100597022803SJim Harris
1006805d9942STomasz Kulasekif [[ "${CONFIG[NVME_CUSE]}" = "y" ]]; then
1007805d9942STomasz 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' \
1008bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -lfuse3 -D_FILE_OFFSET_BITS=64 - 2> /dev/null; then
1009bb0f78a2SMichal Berger		echo "--with-cuse requires libfuse3."
1010bb0f78a2SMichal Berger		echo "Please install then re-run this script."
1011805d9942STomasz Kulasek		exit 1
1012805d9942STomasz Kulasek	fi
1013805d9942STomasz Kulasekfi
1014805d9942STomasz Kulasek
101555bd0d3aSDarek Stojaczykif [[ "${CONFIG[RBD]}" = "y" ]]; then
101655bd0d3aSDarek Stojaczyk	if ! echo -e '#include <rbd/librbd.h>\n#include <rados/librados.h>\n' \
101755bd0d3aSDarek Stojaczyk		'int main(void) { return 0; }\n' \
1018bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -lrados -lrbd - 2> /dev/null; then
1019bb0f78a2SMichal Berger		echo "--with-rbd requires librados and librbd."
1020bb0f78a2SMichal Berger		echo "Please install then re-run this script."
102155bd0d3aSDarek Stojaczyk		exit 1
102255bd0d3aSDarek Stojaczyk	fi
102355bd0d3aSDarek Stojaczykfi
102455bd0d3aSDarek Stojaczyk
1025ed2b53f3SYifan Bianif [[ "${CONFIG[UBLK]}" = "y" ]]; then
1026ed2b53f3SYifan Bian	if ! echo -e '#include <linux/ublk_cmd.h>\n#include <liburing.h>\n' \
1027ed2b53f3SYifan Bian		'int main(void) { return 0; }\n' \
1028ed2b53f3SYifan Bian		| "${BUILD_CMD[@]}" -luring - 2> /dev/null; then
1029ed2b53f3SYifan Bian		echo "--with-ublk requires liburing and ublk_drv."
1030ed2b53f3SYifan Bian		echo "Please install then re-run this script."
1031ed2b53f3SYifan Bian		exit 1
1032ed2b53f3SYifan Bian	fi
1033ed2b53f3SYifan Bianfi
1034ed2b53f3SYifan Bian
10355cb18040SDarek Stojaczykif [[ "${CONFIG[ISCSI_INITIATOR]}" = "y" ]]; then
10365cb18040SDarek Stojaczyk	# Fedora installs libiscsi to /usr/lib64/iscsi for some reason.
10375cb18040SDarek Stojaczyk	if ! echo -e '#include <iscsi/iscsi.h>\n#include <iscsi/scsi-lowlevel.h>\n' \
10385cb18040SDarek Stojaczyk		'#if LIBISCSI_API_VERSION < 20150621\n' \
10395cb18040SDarek Stojaczyk		'#error\n' \
10405cb18040SDarek Stojaczyk		'#endif\n' \
10415cb18040SDarek Stojaczyk		'int main(void) { return 0; }\n' \
1042bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -L/usr/lib64/iscsi -liscsi - 2> /dev/null; then
1043bb0f78a2SMichal Berger		echo "--with-iscsi-initiator requires libiscsi with"
1044bb0f78a2SMichal Berger		echo "LIBISCSI_API_VERSION >= 20150621."
1045bb0f78a2SMichal Berger		echo "Please install then re-run this script."
10465cb18040SDarek Stojaczyk		exit 1
10475cb18040SDarek Stojaczyk	fi
10485cb18040SDarek Stojaczykfi
10495cb18040SDarek Stojaczyk
10502e283fcbS0xe0fif [[ "${CONFIG[DAOS]}" = "y" ]]; then
1051044bb175SDenis Barakthanov	daos_build_cmd=("${BUILD_CMD[@]}")
1052044bb175SDenis Barakthanov	if [[ -n "${CONFIG[DAOS_DIR]}" ]]; then
1053044bb175SDenis Barakthanov		daos_build_cmd+=(-I"${CONFIG[DAOS_DIR]}"/include -L"${CONFIG[DAOS_DIR]}"/lib64)
1054044bb175SDenis Barakthanov	fi
10552e283fcbS0xe0f	if ! echo -e '#include <daos.h>\n#include <daos_fs.h>\n' \
10562e283fcbS0xe0f		'int main(void) { return 0; }\n' \
1057044bb175SDenis Barakthanov		| "${daos_build_cmd[@]}" -lgurt -ldaos -ldaos_common -ldfs - 2> /dev/null; then
10582e283fcbS0xe0f		echo "--with-daos requires libdaos, libdaos_common, libdfs and libgurt"
10592e283fcbS0xe0f		echo "Please install then re-run this script."
10602e283fcbS0xe0f		exit 1
10612e283fcbS0xe0f	fi
10622e283fcbS0xe0ffi
10632e283fcbS0xe0f
10643674c1d3SDarek Stojaczykif [[ "${CONFIG[ASAN]}" = "y" ]]; then
10653674c1d3SDarek Stojaczyk	if ! echo -e 'int main(void) { return 0; }\n' \
1066bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -fsanitize=address - 2> /dev/null; then
1067bb0f78a2SMichal Berger		echo "--enable-asan requires libasan."
1068bb0f78a2SMichal Berger		echo "Please install then re-run this script."
10693674c1d3SDarek Stojaczyk		exit 1
10703674c1d3SDarek Stojaczyk	fi
10713674c1d3SDarek Stojaczykfi
10723674c1d3SDarek Stojaczyk
10733674c1d3SDarek Stojaczykif [[ "${CONFIG[UBSAN]}" = "y" ]]; then
10743674c1d3SDarek Stojaczyk	if ! echo -e 'int main(void) { return 0; }\n' \
1075bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -fsanitize=undefined - 2> /dev/null; then
1076bb0f78a2SMichal Berger		echo "--enable-ubsan requires libubsan."
1077bb0f78a2SMichal Berger		echo "Please install then re-run this script."
1078bb0f78a2SMichal Berger		echo "If installed, please check that the GCC version is at least 6.4"
1079bb0f78a2SMichal Berger		echo "and synchronize CC accordingly."
10803674c1d3SDarek Stojaczyk		exit 1
10813674c1d3SDarek Stojaczyk	fi
10823674c1d3SDarek Stojaczykfi
10833674c1d3SDarek Stojaczyk
10843674c1d3SDarek Stojaczykif [[ "${CONFIG[TSAN]}" = "y" ]]; then
10853674c1d3SDarek Stojaczyk	if ! echo -e 'int main(void) { return 0; }\n' \
1086bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -fsanitize=thread - 2> /dev/null; then
1087bb0f78a2SMichal Berger		echo "--enable-tsan requires libtsan."
1088bb0f78a2SMichal Berger		echo "Please install then re-run this script."
10893674c1d3SDarek Stojaczyk		exit 1
10903674c1d3SDarek Stojaczyk	fi
10913674c1d3SDarek Stojaczykfi
10923674c1d3SDarek Stojaczyk
109343a3984cSJim Harrisif echo -e '#include <stdlib.h>\nint main(void) { arc4random(); return 0; }\n' \
109443a3984cSJim Harris	| "${BUILD_CMD[@]}" - 2> /dev/null; then
109543a3984cSJim Harris	CONFIG[HAVE_ARC4RANDOM]="y"
109643a3984cSJim Harrisfi
109743a3984cSJim Harris
1098634ac768SKrzysztof Karasif echo -e '#include <uuid/uuid.h>\nint main(void) { uuid_generate_sha1(NULL, NULL, NULL, 0); return 0; }\n' \
1099634ac768SKrzysztof Karas	| "${BUILD_CMD[@]}" - -luuid 2> /dev/null; then
1100634ac768SKrzysztof Karas	CONFIG[HAVE_UUID_GENERATE_SHA1]="y"
1101634ac768SKrzysztof Karasfi
1102634ac768SKrzysztof Karas
1103d1fee489SVitaliy Mysakif [[ "${CONFIG[OCF]}" = "y" ]]; then
1104d1fee489SVitaliy Mysak	# If OCF_PATH is a file, assume it is a library and use it to compile with
1105d1fee489SVitaliy Mysak	if [ -f ${CONFIG[OCF_PATH]} ]; then
1106d1fee489SVitaliy Mysak		CONFIG[CUSTOMOCF]=y
1107d1fee489SVitaliy Mysak	else
1108d1fee489SVitaliy Mysak		CONFIG[CUSTOMOCF]=n
1109d1fee489SVitaliy Mysak	fi
1110d1fee489SVitaliy Mysakfi
1111d1fee489SVitaliy Mysak
1112995d60f4SBen Walkerif [[ "${CONFIG[PGO_CAPTURE]}" = "y" && "${CONFIG[PGO_USE]}" = "y" ]]; then
1113995d60f4SBen Walker	echo "ERROR: --enable-pgo-capture and --enable-pgo-use are mutually exclusive."
1114995d60f4SBen Walker	exit 1
1115954728e9SBen Walkerelif [[ "${CONFIG[PGO_USE]}" = "y" ]]; then
1116954728e9SBen Walker	if [[ "$CC_TYPE" = "clang" ]]; then
1117954728e9SBen Walker		# For clang we need to run an extra step on gathered profiling data.
1118954728e9SBen Walker		echo "Generating suitable profile data"
1119954728e9SBen Walker		llvm-profdata merge -output=build/pgo/default.profdata build/pgo
1120954728e9SBen Walker	fi
1121995d60f4SBen Walkerfi
1122995d60f4SBen Walker
112387757389SSimon A. F. Lundif [[ "${CONFIG[URING]}" = "y" || "${CONFIG[XNVME]}" = "y" ]]; then
11248165bf71SBen Walker	if [[ -n "${CONFIG[URING_PATH]}" ]]; then
1125c9b4654bSTomasz Zawadzki		check_dir "${CONFIG[URING_PATH]}"
11264ccc9ea3SJim Harris	elif ! echo -e '#include <liburing.h>\nint main(void) { return 0; }\n' \
11274ccc9ea3SJim Harris		| "${BUILD_CMD[@]}" -luring - 2> /dev/null; then
11284ccc9ea3SJim Harris		echo "--with-uring requires liburing."
11294ccc9ea3SJim Harris		echo "Please build and install then re-run this script."
11304ccc9ea3SJim Harris		exit 1
11318165bf71SBen Walker	fi
1132958d196cSIndraneel M	# Support for Zoned devices is enabled by default for Uring bdev. Check appropriate support in kernel.
11338b840195SIndraneel M	if [[ "${CONFIG[URING_ZNS]}" = "y" ]]; then
11348b840195SIndraneel M		if ! echo -e '#include<linux/blkzoned.h>\nint main(void) { return BLK_ZONE_REP_CAPACITY; }\n' \
11358b840195SIndraneel M			| "${BUILD_CMD[@]}" -c - 2> /dev/null; then
1136958d196cSIndraneel M			echo "Disabling Zoned NS support in Uring! Requires blkzoned.h from kernel >= linux-5.9."
1137958d196cSIndraneel M			CONFIG[URING_ZNS]=n
1138958d196cSIndraneel M		fi
11398b840195SIndraneel M	fi
11408b840195SIndraneel Mfi
11418b840195SIndraneel M
11427fa15e28SXiaodong Liuif [[ "${CONFIG[FUSE]}" = "y" ]]; then
11437fa15e28SXiaodong Liu	if [[ ! -d /usr/include/fuse3 ]] && [[ ! -d /usr/local/include/fuse3 ]]; then
11447fa15e28SXiaodong Liu		echo "--with-fuse requires libfuse3."
11457fa15e28SXiaodong Liu		echo "Please install then re-run this script."
11467fa15e28SXiaodong Liu		exit 1
11477fa15e28SXiaodong Liu	fi
11487fa15e28SXiaodong Liufi
11497fa15e28SXiaodong Liu
115091e42257SJim Harrisif [ "${CONFIG[CET]}" = "y" ]; then
1151bb0f78a2SMichal Berger	if ! echo -e 'int main(void) { return 0; }\n' | "${BUILD_CMD[@]}" -fcf-protection - 2> /dev/null; then
1152bb0f78a2SMichal Berger		echo "--enable-cet requires compiler/linker that supports CET."
1153bb0f78a2SMichal Berger		echo "Please install then re-run this script."
115491e42257SJim Harris		exit 1
115591e42257SJim Harris	fi
115691e42257SJim Harrisfi
115791e42257SJim Harris
1158050565e5SJim Harrisif [[ "${CONFIG[FUZZER]}" = "y" && "$CC_TYPE" != "clang" ]]; then
1159050565e5SJim Harris	echo "--with-fuzzer requires setting CC and CXX to clang."
1160050565e5SJim Harris	exit 1
1161050565e5SJim Harrisfi
1162050565e5SJim Harris
1163dd2c08d2Spaul luseif [[ $arch == x86_64* ]] || [[ $arch == aarch64* ]]; then
1164dd2c08d2Spaul luse	CONFIG[ISAL]=y
1165dd2c08d2Spaul luse	# make sure the submodule is initialized
11669d2f6f86SJim Harris	if [ ! -f "$rootdir"/isa-l/autogen.sh ]; then
1167dd2c08d2Spaul luse		echo "ISA-L is required but was not found, please init the submodule with:"
11689d2f6f86SJim Harris		echo "  git submodule update --init"
1169dd2c08d2Spaul luse		echo "and then re-run this script."
11709d2f6f86SJim Harris		exit 1
11719d2f6f86SJim Harris	fi
1172dd2c08d2Spaul luse	# for x86 only, check the nasm version for ISA-L and IPSEC
1173dd2c08d2Spaul luse	if [[ $arch == x86_64* ]]; then
1174dd2c08d2Spaul luse		ver=$(nasm -v 2> /dev/null | awk '{print $3}' | awk -Fr '{print $1}')
1175dd2c08d2Spaul luse		if lt "$ver" 2.14; then
1176dd2c08d2Spaul luse			CONFIG[ISAL]=n
1177dd2c08d2Spaul luse			# IPSEC has nasm requirement and DPDK crypto relies on IPSEC
1178dd2c08d2Spaul luse			CONFIG[IPSEC_MB]=n
1179dd2c08d2Spaul luse			echo "WARNING: ISA-L & DPDK crypto cannot be used as nasm ver must be 2.14 or newer."
1180dd2c08d2Spaul luse		fi
1181dd2c08d2Spaul luse	fi
1182784b9d48SAlexey Marchuk	# check gas version on aarch64
1183784b9d48SAlexey Marchuk	if [[ $arch == aarch64* ]]; then
1184784b9d48SAlexey Marchuk		ver=$(as --version 2> /dev/null | awk 'NR==1{print $7}')
1185784b9d48SAlexey Marchuk		if lt "$ver" 2.24; then
1186784b9d48SAlexey Marchuk			# ISA-L, compression & crypto require gas version 2.24 or newer.
1187784b9d48SAlexey Marchuk			CONFIG[ISAL]=n
1188784b9d48SAlexey Marchuk			echo "Notice: ISA-L, compression & crypto require GAS version 2.24 or newer. Turning off default ISA-L and crypto features."
1189784b9d48SAlexey Marchuk		elif lt "$ver" 2.34; then
1190784b9d48SAlexey Marchuk			#For gas v2.24~v2.34, sve2 instructions are not supported. To workaround it, sve2 optimization should be disabled
1191784b9d48SAlexey Marchuk			ISAL_CRYPTO_OPTS+=("--disable-sve2")
1192784b9d48SAlexey Marchuk		fi
1193784b9d48SAlexey Marchuk	fi
1194dd2c08d2Spaul luseelse
1195dd2c08d2Spaul luse	# for PPC
1196dd2c08d2Spaul luse	CONFIG[ISAL]=n
1197dd2c08d2Spaul luse	echo "WARNING: ISA-L cannot be used due to architecture incompatibility."
1198dd2c08d2Spaul lusefi
11999d2f6f86SJim Harris
1200dd2c08d2Spaul luse# now either configure ISA-L or disable unavailable features
1201dd2c08d2Spaul luseif [[ "${CONFIG[ISAL]}" = "y" ]]; then
12029d2f6f86SJim Harris	cd $rootdir/isa-l
12039d2f6f86SJim Harris	ISAL_LOG=$rootdir/isa-l/spdk-isal.log
12049d2f6f86SJim Harris	if [[ -n "${CONFIG[CROSS_PREFIX]}" ]]; then
12059d2f6f86SJim Harris		ISAL_OPTS=("--host=${CONFIG[CROSS_PREFIX]}")
12069d2f6f86SJim Harris	else
12079d2f6f86SJim Harris		ISAL_OPTS=()
12089d2f6f86SJim Harris	fi
12099d2f6f86SJim Harris	echo -n "Configuring ISA-L (logfile: $ISAL_LOG)..."
12109d2f6f86SJim Harris	./autogen.sh &> $ISAL_LOG
12119d2f6f86SJim Harris	./configure CFLAGS="-fPIC -g -O2" "${ISAL_OPTS[@]}" --enable-shared=no >> $ISAL_LOG 2>&1
12129d2f6f86SJim Harris	echo "done."
12139d2f6f86SJim Harris	cd $rootdir
1214dd2c08d2Spaul luseelse
1215dd2c08d2Spaul luse	echo "Without ISA-L, there is no software support for crypto or compression,"
1216dd2c08d2Spaul luse	echo "so these features will be disabled."
1217dd2c08d2Spaul luse	CONFIG[CRYPTO]=n
121819e2dc38Spaul luse	CONFIG[VBDEV_COMPRESS]=n
1219976f8b09Spaul luse	CONFIG[DPDK_COMPRESSDEV]=n
12209d2f6f86SJim Harrisfi
12219d2f6f86SJim Harris
1222784b9d48SAlexey Marchuk# ISA-L-crypto complements ISA-L functionality, it is only enabled together with ISA-L
1223784b9d48SAlexey Marchukif [[ "${CONFIG[ISAL]}" = "y" ]]; then
1224784b9d48SAlexey Marchuk	if [ ! -f "$rootdir"/isa-l-crypto/autogen.sh ]; then
1225784b9d48SAlexey Marchuk		echo "ISA-L-crypto is required but was not found, please init the submodule with:"
1226784b9d48SAlexey Marchuk		echo "  git submodule update --init"
1227784b9d48SAlexey Marchuk		echo "and then re-run this script."
1228784b9d48SAlexey Marchuk		exit 1
1229784b9d48SAlexey Marchuk	fi
1230784b9d48SAlexey Marchuk
1231784b9d48SAlexey Marchuk	cd $rootdir/isa-l-crypto
1232784b9d48SAlexey Marchuk	ISAL_CRYPTO_LOG=$rootdir/isa-l-crypto/spdk-isal-crypto.log
1233784b9d48SAlexey Marchuk	if [[ -n "${CONFIG[CROSS_PREFIX]}" ]]; then
1234784b9d48SAlexey Marchuk		ISAL_CRYPTO_OPTS+=("--host=${CONFIG[CROSS_PREFIX]}")
1235784b9d48SAlexey Marchuk	fi
1236784b9d48SAlexey Marchuk	ISAL_CRYPTO_OPTS+=("--enable-shared=no")
1237784b9d48SAlexey Marchuk	echo -n "Configuring ISA-L-crypto (logfile: $ISAL_CRYPTO_LOG)..."
1238784b9d48SAlexey Marchuk	./autogen.sh &> $ISAL_CRYPTO_LOG
1239784b9d48SAlexey Marchuk	./configure CFLAGS="-fPIC -g -O2" "${ISAL_CRYPTO_OPTS[@]}" >> $ISAL_CRYPTO_LOG 2>&1
1240784b9d48SAlexey Marchuk	echo "done."
1241784b9d48SAlexey Marchuk	cd $rootdir
1242784b9d48SAlexey Marchuk	CONFIG[ISAL_CRYPTO]=y
1243784b9d48SAlexey Marchukelse
1244784b9d48SAlexey Marchuk	CONFIG[ISAL_CRYPTO]=n
1245784b9d48SAlexey Marchukfi
1246784b9d48SAlexey Marchuk
1247509241ceSKonrad Sztyberif [[ "${CONFIG[SMA]}" = "y" ]]; then
1248509241ceSKonrad Sztyber	if ! python3 -c 'import grpc; import grpc_tools' 2> /dev/null; then
1249509241ceSKonrad Sztyber		echo "--with-sma requires grpcio and grpcio-tools python packages."
1250509241ceSKonrad Sztyber		echo "Please install then re-run this script."
1251509241ceSKonrad Sztyber		exit 1
1252509241ceSKonrad Sztyber	fi
1253509241ceSKonrad Sztyberfi
1254509241ceSKonrad Sztyber
12552796687dSParameswaran Krishnamurthyif [[ "${CONFIG[AVAHI]}" = "y" ]]; then
12562796687dSParameswaran Krishnamurthy	if ! echo -e '#include <avahi-client/client.h>\n#include <avahi-common/malloc.h>\n' \
12572796687dSParameswaran Krishnamurthy		'int main(void) { return 0; }\n' \
12582796687dSParameswaran Krishnamurthy		| "${BUILD_CMD[@]}" -lavahi-client -lavahi-common - 2> /dev/null; then
12592796687dSParameswaran Krishnamurthy		echo "--with-avahi requires libavahi-client and libavahi-common."
12602796687dSParameswaran Krishnamurthy		echo "Please install then re-run this script."
12612796687dSParameswaran Krishnamurthy		exit 1
12622796687dSParameswaran Krishnamurthy	fi
12632796687dSParameswaran Krishnamurthyfi
12642796687dSParameswaran Krishnamurthy
12658247bd40SMarcin Spiewakif [[ -n ${CONFIG[MAX_LCORES]} ]]; then
126673293d73SMarcin Spiewak	if [[ ! ${CONFIG[MAX_LCORES]} =~ ^([1-9][0-9]*|detect)$ ]] || ((CONFIG[MAX_LCORES] > 1024)); then
126773293d73SMarcin Spiewak		echo "ERROR: Max number of lcores must be a decimal number in range [1..1024] or 'detect' (given: ${CONFIG[MAX_LCORES]})"
12688247bd40SMarcin Spiewak		exit 1
12698247bd40SMarcin Spiewak	fi
12708247bd40SMarcin Spiewakfi
12718247bd40SMarcin Spiewak
1272fcc38949SRui Chang# For ARM Neoverse-N1 platform, debug build needs gcc version newer than 8.4
1273fcc38949SRui Changif [[ "${CONFIG[DEBUG]}" = "y" && $arch = aarch64* && "$CC_TYPE" = "gcc" ]]; then
1274fcc38949SRui Chang	GCC_VERSION=$($CC -dumpfullversion)
1275fcc38949SRui Chang	PART_NUM=$(grep -i -m 1 "CPU part" /proc/cpuinfo | awk '{print $4}')
1276fcc38949SRui Chang
1277fcc38949SRui Chang	if [[ "$(printf '%s\n' "8.4.0" "$GCC_VERSION" | sort -V | head -n1)" != "8.4.0" ]]; then
1278fcc38949SRui Chang		if [[ $PART_NUM = 0xd0c ]]; then
1279fcc38949SRui Chang			echo "WARNING: For ARM Neoverse-N1 platform, debug build needs GCC version newer than 8.4."
1280fcc38949SRui Chang			echo "         Will work around this by using armv8.2-a+crypto as target architecture for now."
1281fcc38949SRui Chang			CONFIG[ARCH]=armv8.2-a+crypto
1282e8f84531SSunil Shahu		elif [[ $PART_NUM = 0x0b2 ]]; then
1283e8f84531SSunil Shahu			echo "WARNING: For ARM octeontx2 platform, debug build needs GCC version newer than 8.4."
1284e8f84531SSunil Shahu			echo "         Will work around this by using armv8.2-a+crypto as target architecture for now."
1285e8f84531SSunil Shahu			CONFIG[ARCH]=armv8.2-a+crypto
1286fcc38949SRui Chang		fi
1287fcc38949SRui Chang	fi
1288fcc38949SRui Changfi
1289fcc38949SRui Chang
129048f70f48SPawel Wodkowski# We are now ready to generate final configuration. But first do sanity
129148f70f48SPawel Wodkowski# check to see if all keys in CONFIG array have its reflection in CONFIG file.
1292bb0f78a2SMichal Bergerif (($(grep -cE "^\s*CONFIG_[[:alnum:]_]+=" "$rootdir/CONFIG") != ${#CONFIG[@]})); then
129348f70f48SPawel Wodkowski	echo ""
129448f70f48SPawel Wodkowski	echo "BUG: Some configuration options are not present in CONFIG file. Please update this file."
129548f70f48SPawel Wodkowski	echo "Missing options in CONFIG (+) file and in current config (-): "
129648f70f48SPawel Wodkowski	diff -u --label "CONFIG file" --label "CONFIG[@]" \
1297f8d6541dSMichal Berger		<(sed -r -e '/^[[:space:]]*$/d; /^[[:space:]]*#.*/d; s/(CONFIG_[[:alnum:]_]+)=.*/\1/g' CONFIG | sort) \
1298bb0f78a2SMichal Berger		<(printf "CONFIG_%s\n" "${!CONFIG[@]}" | sort)
129948f70f48SPawel Wodkowski	exit 1
130048f70f48SPawel Wodkowskifi
130148f70f48SPawel Wodkowski
130285bc2bbeSPawel Wodkowskiecho -n "Creating mk/config.mk..."
1303e62a3c65SSeth Howellcp -f $rootdir/CONFIG $rootdir/mk/config.mk
130451ab849bSJim HarrisARGS=$(echo "$@" | sed 's/ /\\ /g')
130551ab849bSJim Harrissed -i.bak -r "s#__CONFIGURE_OPTIONS__#${ARGS}#g" $rootdir/mk/config.mk
1306bb0f78a2SMichal Bergerfor key in "${!CONFIG[@]}"; do
1307f8d6541dSMichal Berger	sed -i.bak -r "s#[[:space:]]*CONFIG_${key}=.*#CONFIG_${key}\?=${CONFIG[$key]}#g" $rootdir/mk/config.mk
1308577df16aSPawel Wodkowskidone
1309577df16aSPawel Wodkowski# On FreeBSD sed -i 'SUFFIX' - SUFFIX is mandatory. So no way but to delete the backed file.
1310e62a3c65SSeth Howellrm -f $rootdir/mk/config.mk.bak
1311baa6eac0SDarek Stojaczykecho "done."
13129dd998cdSBen Walker
131308ec96ebSDaniel Verkamp# Environment variables
1314baa6eac0SDarek Stojaczykecho -n "Creating mk/cc.flags.mk..."
1315e62a3c65SSeth Howellrm -f $rootdir/mk/cc.flags.mk
1316e62a3c65SSeth Howell[ -n "$CFLAGS" ] && echo "CFLAGS?=$CFLAGS" > $rootdir/mk/cc.flags.mk
1317e62a3c65SSeth Howell[ -n "$CXXFLAGS" ] && echo "CXXFLAGS?=$CXXFLAGS" >> $rootdir/mk/cc.flags.mk
1318e62a3c65SSeth Howell[ -n "$LDFLAGS" ] && echo "LDFLAGS?=$LDFLAGS" >> $rootdir/mk/cc.flags.mk
1319e62a3c65SSeth Howell[ -n "$DESTDIR" ] && echo "DESTDIR?=$DESTDIR" >> $rootdir/mk/cc.flags.mk
13200b56a5b4SJim Harrisecho "done."
132185bc2bbeSPawel Wodkowski
1322db3ebfe6SMichal Berger# Create .sh with build config for easy sourcing|lookup during the tests.
1323db3ebfe6SMichal Bergerfor conf in "${!CONFIG[@]}"; do
1324db3ebfe6SMichal Berger	echo "CONFIG_$conf=${CONFIG[$conf]}"
1325db3ebfe6SMichal Bergerdone > "$rootdir/test/common/build_config.sh"
1326db3ebfe6SMichal Berger
13275a764955SMichal Bergerif [[ $sys_name == "FreeBSD" ]]; then
1328870ce250SPaul Luse	echo "Type 'gmake' to build."
1329870ce250SPaul Luseelse
13300b56a5b4SJim Harris	echo "Type 'make' to build."
1331870ce250SPaul Lusefi
13329dd998cdSBen Walker
13339dd998cdSBen Walkerexit 0
1334