xref: /spdk/configure (revision 8247bd40412e047a53e268a226acabdcd5f0b511)
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)"
31*8247bd40SMarcin Spiewak	echo " --max-lcores=VAL          DPDK configuration. Maximum number of lcores supported by EAL."
323def834cSAmelia Blachuciak	echo ""
339dd998cdSBen Walker	echo " --enable-debug            Configure for debug builds"
349dd998cdSBen Walker	echo " --enable-werror           Treat compiler warnings as errors"
359dd998cdSBen Walker	echo " --enable-asan             Enable address sanitizer"
369dd998cdSBen Walker	echo " --enable-ubsan            Enable undefined behavior sanitizer"
379dd998cdSBen Walker	echo " --enable-coverage         Enable code coverage tracking"
386d6d1161SDaniel Verkamp	echo " --enable-lto              Enable link-time optimization"
39995d60f4SBen Walker	echo " --enable-pgo-capture      Enable generation of profile guided optimization data"
40995d60f4SBen Walker	echo " --enable-pgo-use          Use previously captured profile guided optimization data"
4191e42257SJim Harris	echo " --enable-cet              Enable Intel Control-flow Enforcement Technology (CET)"
429fcb1cb0STomasz Zawadzki	echo " --disable-tests           Disable building of functional tests"
439fcb1cb0STomasz Zawadzki	echo " --disable-unit-tests      Disable building of unit tests"
449b2c6452SJacek Kalwas	echo " --disable-examples        Disable building of examples"
45119158cdSRajarshi Chowdhury	echo " --disable-apps            Disable building of apps"
469dd998cdSBen Walker	echo ""
479dd998cdSBen Walker	echo "Specifying Dependencies:"
489dd998cdSBen Walker	echo "--with-DEPENDENCY[=path]   Use the given dependency. Optionally, provide the"
499dd998cdSBen Walker	echo "                           path."
509dd998cdSBen Walker	echo "--without-DEPENDENCY       Do not link to the given dependency. This may"
519dd998cdSBen Walker	echo "                           disable features and components."
529dd998cdSBen Walker	echo ""
539dd998cdSBen Walker	echo "Valid dependencies are listed below."
542bc71094SMichal Berger	echo " --with-dpdk[=DIR]         Build against a custom dpdk version. By default, the dpdk"
552bc71094SMichal Berger	echo " --without-dpdk            submodule in spdk tree will be used."
569dd998cdSBen Walker	echo "                           example: /usr/share/dpdk/x86_64-default-linuxapp-gcc"
572bc71094SMichal Berger	echo " --with-env=DIR            Use an alternate environment implementation instead of DPDK."
5806cc8045SBen Walker	echo "                           Implies --without-dpdk."
592bc71094SMichal Berger	echo " --with-idxd               Build the IDXD library and accel framework plug-in module."
602bc71094SMichal Berger	echo " --without-idxd            Disabled while experimental. Only built for x86 when enabled."
61784b9d48SAlexey Marchuk	echo " --with-crypto             Build isa-l-crypto and vbdev crypto module. No path required."
62784b9d48SAlexey Marchuk	echo " --without-crypto          Disable isa-l-crypto and vbdev crypto module."
632bc71094SMichal Berger	echo " --with-fio[=DIR]          Build fio_plugin."
642bc71094SMichal Berger	echo " --without-fio             default: /usr/src/fio"
656f338d4bSKrishna Kanth Reddy	echo " --with-xnvme              Build xNVMe bdev module."
666f338d4bSKrishna Kanth Reddy	echo " --without-xnvme           No path required."
672bc71094SMichal Berger	echo " --with-vhost              Build vhost target. Enabled by default."
682bc71094SMichal Berger	echo " --without-vhost           No path required."
692bc71094SMichal Berger	echo " --with-virtio             Build vhost initiator and virtio-pci bdev modules."
702bc71094SMichal Berger	echo " --without-virtio          No path required."
71e50ade31SChangpeng Liu	echo " --with-vfio-user[=DIR]    Build custom vfio-user transport for NVMf target and vfio-user target."
72e50ade31SChangpeng Liu	echo "                           vfio-user initiator is always built-in in Linux."
732f731c63SGangCao	echo "                           example: /usr/src/libvfio-user"
742f731c63SGangCao	echo " --without-vfio-user       No path required."
7519e2dc38Spaul luse	echo " --with-vbdev-compress     Build vbdev compression module and dependencies."
7619e2dc38Spaul luse	echo " --without-vbdev-compress  No path required."
77976f8b09Spaul luse	echo " --with-dpdk-compressdev   Build accel DPDK compression module and dependencies."
78976f8b09Spaul luse	echo " --without-dpdk-compressdev No path required."
792bc71094SMichal Berger	echo " --with-rbd                Build Ceph RBD bdev module."
802bc71094SMichal Berger	echo " --without-rbd             No path required."
81ed2b53f3SYifan Bian	echo " --with-ublk               Build ublk library."
82ed2b53f3SYifan Bian	echo " --without-ublk            No path required."
832bc71094SMichal Berger	echo " --with-rdma[=DIR]         Build RDMA transport for NVMf target and initiator."
842bc71094SMichal Berger	echo " --without-rdma            Accepts optional RDMA provider name. Can be \"verbs\" or \"mlx5_dv\"."
85daee62a0SAlexey Marchuk	echo "                           If no provider specified, \"verbs\" provider is used by default."
862bc71094SMichal Berger	echo " --with-fc[=DIR]           Build FC transport for NVMf target."
872bc71094SMichal Berger	echo " --without-fc              If an argument is provided, it is considered a directory containing"
88ed56a3d4SAnil Veerabhadrappa	echo "                           libufc.a and fc_lld.h. Otherwise the regular system paths will"
89ed56a3d4SAnil Veerabhadrappa	echo "                           be searched."
90044bb175SDenis Barakthanov	echo " --with-daos[=DIR]         Build DAOS bdev module."
912e283fcbS0xe0f	echo " --without-daos            No path required."
922bc71094SMichal Berger	echo " --with-shared             Build spdk shared libraries."
932bc71094SMichal Berger	echo " --without-shared          No path required."
942bc71094SMichal Berger	echo " --with-iscsi-initiator    Build with iscsi bdev module."
952bc71094SMichal Berger	echo " --without-iscsi-initiator No path required."
966b97cccfSJim Harris	echo " --with-vtune=DIR          Required to profile I/O under Intel VTune Amplifier XE. (Deprecated)"
972bc71094SMichal Berger	echo " --without-vtune           example: /opt/intel/vtune_amplifier_xe_version"
9832908cbfSTomasz Zawadzki	echo " --with-ocf[=DIR]          Build OCF library and bdev module. (Deprecated)"
992bc71094SMichal Berger	echo " --without-ocf             If argument is directory, interpret it as root of OCF repo"
100d1fee489SVitaliy Mysak	echo "                           If argument is file, interpret it as compiled OCF lib"
10198d60de6SPiotr Pelplinski	echo "                           If no argument is specified, OCF git submodule is used by default"
102d1fee489SVitaliy Mysak	echo "                           example: /usr/src/ocf/"
1032bc71094SMichal Berger	echo " --with-uring[=DIR]        Build I/O uring bdev or socket module."
1042bc71094SMichal Berger	echo " --without-uring           If an argument is provided, it is considered a directory containing"
105161c88a0SDarek Stojaczyk	echo "                           liburing.a and io_uring.h. Otherwise the regular system paths will"
106161c88a0SDarek Stojaczyk	echo "                           be searched."
107958d196cSIndraneel M	echo " --without-uring-zns       Build I/O uring module without ZNS (zoned namespaces) support."
10834192459SBoris Glimcher	echo " --with-openssl[=DIR]      Build OPENSSL with custom path. Otherwise the regular system paths will"
10934192459SBoris Glimcher	echo "                           be searched."
1102bc71094SMichal Berger	echo " --with-fuse               Build FUSE components for mounting a blobfs filesystem."
1112bc71094SMichal Berger	echo " --without-fuse            No path required."
1122bc71094SMichal Berger	echo " --with-nvme-cuse          Build NVMe driver with support for CUSE-based character devices."
1132bc71094SMichal Berger	echo " --without-nvme-cuse       No path required."
11483a4b155SArtur Paszkiewicz	echo " --with-raid5f             Build with bdev_raid module RAID5f support."
11583a4b155SArtur Paszkiewicz	echo " --without-raid5f          No path required."
1162bc71094SMichal Berger	echo " --with-wpdk=DIR           Build using WPDK to provide support for Windows (experimental)."
1172bc71094SMichal Berger	echo " --without-wpdk            The argument must be a directory containing lib and include."
1182bc71094SMichal Berger	echo " --with-usdt               Build with userspace DTrace probes enabled."
1192bc71094SMichal Berger	echo " --without-usdt            No path required."
120050565e5SJim Harris	echo " --with-fuzzer             Build with LLVM fuzzing enabled."
121050565e5SJim Harris	echo "                           Path to clang_rt.fuzzer_no_main library required."
122050565e5SJim Harris	echo "                           Requires setting CC and CXX to clang."
123050565e5SJim Harris	echo "                           (Typically /usr/lib/llvm-VER/lib/clang/VER/lib/linux/libclang_rt.fuzzer_no_main-ARCH.a)"
124509241ceSKonrad Sztyber	echo " --with-sma                Generate Storage Management Agent's protobuf interface"
125509241ceSKonrad Sztyber	echo " --without-sma             No path required."
1262796687dSParameswaran Krishnamurthy	echo " --with-avahi              Build with Avahi mDNS discovery client service enabled in bdev-nvme module."
1272796687dSParameswaran Krishnamurthy	echo " --without-avahi           No path required."
1289dd998cdSBen Walker	echo ""
12908ec96ebSDaniel Verkamp	echo "Environment variables:"
13008ec96ebSDaniel Verkamp	echo ""
13173439e6fSBen Walker	echo "CC                         C compiler"
13208ec96ebSDaniel Verkamp	echo "CFLAGS                     C compiler flags"
13373439e6fSBen Walker	echo "CXX                        C++ compiler"
13408ec96ebSDaniel Verkamp	echo "CXXFLAGS                   C++ compiler flags"
13573439e6fSBen Walker	echo "LD                         Linker"
13608ec96ebSDaniel Verkamp	echo "LDFLAGS                    Linker flags"
13708ec96ebSDaniel Verkamp	echo "DESTDIR                    Destination for 'make install'"
13808ec96ebSDaniel Verkamp	echo ""
1399dd998cdSBen Walker}
1409dd998cdSBen Walker
141577df16aSPawel Wodkowski# Load default values
142ff238359SJosh Soref# Convert config to sourceable configuration file
143e62a3c65SSeth Howellsed -r 's/CONFIG_([[:alnum:]_]+)=(.*)/CONFIG[\1]=\2/g' $rootdir/CONFIG > $rootdir/CONFIG.sh
144577df16aSPawel Wodkowskideclare -A CONFIG
145e62a3c65SSeth Howellsource $rootdir/CONFIG.sh
146e62a3c65SSeth Howellrm $rootdir/CONFIG.sh
147577df16aSPawel Wodkowski
14811a5716dSMichal Berger# Try to expand literal ~ that might have been passed as an option via --long-opt=~/dir.
14911a5716dSMichal Bergerset -- "${@//\~/~}"
15011a5716dSMichal Berger
1514d2e26d8STomasz Zawadzkifor i in "$@"; do
1524d2e26d8STomasz Zawadzki	case "$i" in
1534d2e26d8STomasz Zawadzki		--cross-prefix=*)
1544d2e26d8STomasz Zawadzki			CONFIG[CROSS_PREFIX]="${i#*=}"
1554d2e26d8STomasz Zawadzki			;;
1564d2e26d8STomasz Zawadzki		--enable-lto)
1574d2e26d8STomasz Zawadzki			CONFIG[LTO]=y
1584d2e26d8STomasz Zawadzki			;;
1594d2e26d8STomasz Zawadzki		--disable-lto)
1604d2e26d8STomasz Zawadzki			CONFIG[LTO]=n
1614d2e26d8STomasz Zawadzki			;;
1624d2e26d8STomasz Zawadzki	esac
1634d2e26d8STomasz Zawadzkidone
1644d2e26d8STomasz Zawadzki
165873c8748STomasz Kulasek# Detect the compiler toolchain
166873c8748STomasz Kulasek$rootdir/scripts/detect_cc.sh --cc="$CC" --cxx="$CXX" --lto="${CONFIG[LTO]}" --ld="$LD" --cross-prefix="${CONFIG[CROSS_PREFIX]}" > $rootdir/mk/cc.mk
167873c8748STomasz Kulasek
168bb0f78a2SMichal BergerCC=$(grep "DEFAULT_CC=" "$rootdir/mk/cc.mk" | sed s/DEFAULT_CC=//)
169bb0f78a2SMichal BergerCC_TYPE=$(grep "CC_TYPE=" "$rootdir/mk/cc.mk" | cut -d "=" -f 2)
170873c8748STomasz Kulasek
171873c8748STomasz Kulasekarch=$($CC -dumpmachine)
1725a764955SMichal Bergersys_name=$(uname -s)
173873c8748STomasz Kulasek
1749854c138SNick Connollyif [[ $arch == *mingw* ]] || [[ $arch == *windows* ]]; then
1759854c138SNick Connolly	sys_name=Windows
1769854c138SNick Connollyfi
1779854c138SNick Connolly
1782a0c2a2dSNick Connollyif [[ $sys_name != "Linux" ]]; then
179873c8748STomasz Kulasek	# Vhost, rte_vhost library and virtio are only supported on Linux.
180873c8748STomasz Kulasek	CONFIG[VHOST]="n"
181873c8748STomasz Kulasek	CONFIG[VIRTIO]="n"
182873c8748STomasz Kulasek	echo "Notice: Vhost, rte_vhost library and virtio are only supported on Linux. Turning off default feature."
183873c8748STomasz Kulasekfi
184873c8748STomasz Kulasek
1851723a800SGangCaofunction check_dir() {
1861723a800SGangCao	arg="$1"
1871723a800SGangCao	dir="${arg#*=}"
1881723a800SGangCao	if [ ! -d "$dir" ]; then
1891723a800SGangCao		echo "$arg: directory not found"
1901723a800SGangCao		exit 1
1911723a800SGangCao	fi
1921723a800SGangCao}
1931723a800SGangCao
1947b04eb72SYuriy Umanets# On x86_64 'clang -dumpmachine' produces x86_64-pc-linux-gnu
1957b04eb72SYuriy Umanets# whereas the dpdk might be built with gcc and its libs lie in
196acd2cc94STomasz Zawadzki# x86_64-linux-gnu. Let's find the right libdir for dpdk libs.
1977b04eb72SYuriy Umanetsfunction find_dpdk_arch_libdir() {
198acd2cc94STomasz Zawadzki	local dpdk_libdir="$1/lib"
199acd2cc94STomasz Zawadzki
200acd2cc94STomasz Zawadzki	# Use libdir with 'lib' or 'lib64'
201acd2cc94STomasz Zawadzki	if [[ ! -d "$dpdk_libdir" ]]; then
202acd2cc94STomasz Zawadzki		dpdk_libdir+="64"
203acd2cc94STomasz Zawadzki	fi
2047b04eb72SYuriy Umanets
2057b04eb72SYuriy Umanets	# Checking first what we have with $arch, then clang
2067b04eb72SYuriy Umanets	# variant of arch.
2077b04eb72SYuriy Umanets	arches=("$arch" "$(echo $arch | sed 's/-pc//g')")
2087b04eb72SYuriy Umanets	for a in "${arches[@]}"; do
209acd2cc94STomasz Zawadzki		local libdir_arch="$dpdk_libdir/$a"
210acd2cc94STomasz Zawadzki		if [[ -d "$libdir_arch" ]]; then
211acd2cc94STomasz Zawadzki			echo "$libdir_arch"
2127b04eb72SYuriy Umanets			return
2137b04eb72SYuriy Umanets		fi
2147b04eb72SYuriy Umanets	done
2157b04eb72SYuriy Umanets
2167b04eb72SYuriy Umanets	# Fallback to the libdir without arch component
217acd2cc94STomasz Zawadzki	echo "$dpdk_libdir"
2187b04eb72SYuriy Umanets}
2197b04eb72SYuriy Umanets
220f1980244SYuriy Umanetsfunction check_IPSec_mb() {
221f1980244SYuriy Umanets	local mode=$1
222f1980244SYuriy Umanets	local dpdk_libdir=$2
223f1980244SYuriy Umanets	local dpdk_incdir=$3
224f1980244SYuriy Umanets	local have_ipsec_mb=n
225f1980244SYuriy Umanets
226f1980244SYuriy Umanets	if [[ $mode = "pkg-config" ]]; then
227f1980244SYuriy Umanets		local dpdk_libs
228f1980244SYuriy Umanets
229f1980244SYuriy Umanets		# Request libdpdk pkg-config settings to figure out if the IPSec_MB is used
230f1980244SYuriy Umanets		# as a dependency.
231f1980244SYuriy Umanets		# Due to some reason pkg-config shows -lIPSec_MB only with --static option
232f13ec525SKarol Latecki		dpdk_libs=$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --libs --static libdpdk)
233f1980244SYuriy Umanets		if echo "$dpdk_libs" | grep "\-lIPSec_MB" > /dev/null 2>&1; then
234f1980244SYuriy Umanets			have_ipsec_mb=y
235f1980244SYuriy Umanets		fi
236f1980244SYuriy Umanets	elif [[ $mode = "build-config" ]]; then
237f1980244SYuriy Umanets		# Use dpdk build config header to check if the IPSec_MB was used.
238f1980244SYuriy Umanets		if grep -F "define RTE_CRYPTO_IPSEC_MB 1" "$dpdk_incdir/rte_build_config.h" > /dev/null 2>&1; then
239f1980244SYuriy Umanets			have_ipsec_mb=y
240f1980244SYuriy Umanets		fi
241f1980244SYuriy Umanets	else
242f1980244SYuriy Umanets		echo "ERROR: Invalid IPSec_MB checking mode $mode."
243f1980244SYuriy Umanets		echo "ERROR: Only \"pkg-config\" and \"build-config\" available."
244f1980244SYuriy Umanets		exit 1
245f1980244SYuriy Umanets	fi
246f1980244SYuriy Umanets	if [[ $have_ipsec_mb = "n" ]]; then
247f1980244SYuriy Umanets		CONFIG[IPSEC_MB]=n
248f1980244SYuriy Umanets		return
249f1980244SYuriy Umanets	fi
250f1980244SYuriy Umanets
251f1980244SYuriy Umanets	# Since we don't know the library path where the IPSec_MB is located
252f1980244SYuriy Umanets	# let's find it out with the ldd utility. This can be a standard location
253f1980244SYuriy Umanets	# or a custom build.
254f1980244SYuriy Umanets	local librte_crypto_ipsec_mb="$dpdk_libdir/librte_crypto_ipsec_mb.so"
255f1980244SYuriy Umanets	if [[ -f "$librte_crypto_ipsec_mb" ]]; then
256f1980244SYuriy Umanets		local ipsec_mb_libdir
257f1980244SYuriy Umanets
258f1980244SYuriy Umanets		ipsec_mb_libdir=$(ldd "$librte_crypto_ipsec_mb" | grep "libIPSec_MB.so" \
259f1980244SYuriy Umanets			| sed -e 's/\s*libIPSec_MB.so.*=>\s//' -e 's/\/libIPSec_MB.so.*$//')
260f1980244SYuriy Umanets		if [[ -d $ipsec_mb_libdir ]]; then
261f1980244SYuriy Umanets			CONFIG[IPSEC_MB]=y
262f1980244SYuriy Umanets			CONFIG[IPSEC_MB_DIR]="$ipsec_mb_libdir"
263f1980244SYuriy Umanets		elif [[ $ipsec_mb_libdir = "not found" ]]; then
264f1980244SYuriy Umanets			# ldconfig cache is broken, old build with refs to non-existing libs, etc.
265f1980244SYuriy Umanets			echo "ERROR: Invalid IPSec_MB installation. Library is not found and/or ldconfig cache is broken!"
266f1980244SYuriy Umanets			exit 1
267f1980244SYuriy Umanets		else
268f1980244SYuriy Umanets			# Failed to check for IPSec_MB lib path. Let's just assume it is lives
269f1980244SYuriy Umanets			# in one of the standard locations (/usr/lib, etc.).
270f1980244SYuriy Umanets			CONFIG[IPSEC_MB]=y
271f1980244SYuriy Umanets		fi
272f1980244SYuriy Umanets	else
273f1980244SYuriy Umanets		# pkg-config says there is IPSec_mb and dpdk lib does not have it. Let's just
274f1980244SYuriy Umanets		# assume it is installed in the system in one of the standard locations.
275f1980244SYuriy Umanets		CONFIG[IPSEC_MB]=y
276f1980244SYuriy Umanets	fi
277f1980244SYuriy Umanets}
278f1980244SYuriy Umanets
2799dd998cdSBen Walkerfor i in "$@"; do
2809dd998cdSBen Walker	case "$i" in
2819dd998cdSBen Walker		-h | --help)
2829dd998cdSBen Walker			usage
2839dd998cdSBen Walker			exit 0
2849dd998cdSBen Walker			;;
2854d2e26d8STomasz Zawadzki		--cross-prefix=*) ;&
2864d2e26d8STomasz Zawadzki		--enable-lto) ;&
2874d2e26d8STomasz Zawadzki		--disable-lto)
2884d2e26d8STomasz Zawadzki			# Options handled before detecting CC.
2894d2e26d8STomasz Zawadzki			;;
2902e7fe8e8SDaniel Verkamp		--prefix=*)
291577df16aSPawel Wodkowski			CONFIG[PREFIX]="${i#*=}"
2922e7fe8e8SDaniel Verkamp			;;
2930e6ddfd6SBen Walker		--target-arch=*)
2940e6ddfd6SBen Walker			CONFIG[ARCH]="${i#*=}"
2950e6ddfd6SBen Walker			;;
296e8863cb7SMichal Berger		--libdir=*)
297e8863cb7SMichal Berger			CONFIG[LIBDIR]="${i#*=}"
298e8863cb7SMichal Berger			;;
2999dd998cdSBen Walker		--enable-debug)
300577df16aSPawel Wodkowski			CONFIG[DEBUG]=y
3019dd998cdSBen Walker			;;
3029dd998cdSBen Walker		--disable-debug)
303577df16aSPawel Wodkowski			CONFIG[DEBUG]=n
3049dd998cdSBen Walker			;;
3059dd998cdSBen Walker		--enable-asan)
306577df16aSPawel Wodkowski			CONFIG[ASAN]=y
3079dd998cdSBen Walker			;;
3089dd998cdSBen Walker		--disable-asan)
309577df16aSPawel Wodkowski			CONFIG[ASAN]=n
3109dd998cdSBen Walker			;;
3119dd998cdSBen Walker		--enable-ubsan)
312577df16aSPawel Wodkowski			CONFIG[UBSAN]=y
3139dd998cdSBen Walker			;;
3149dd998cdSBen Walker		--disable-ubsan)
315577df16aSPawel Wodkowski			CONFIG[UBSAN]=n
3169dd998cdSBen Walker			;;
317830912e2SBen Walker		--enable-tsan)
318577df16aSPawel Wodkowski			CONFIG[TSAN]=y
319830912e2SBen Walker			;;
320830912e2SBen Walker		--disable-tsan)
321577df16aSPawel Wodkowski			CONFIG[TSAN]=n
322830912e2SBen Walker			;;
3239dd998cdSBen Walker		--enable-coverage)
324577df16aSPawel Wodkowski			CONFIG[COVERAGE]=y
3259dd998cdSBen Walker			;;
3269dd998cdSBen Walker		--disable-coverage)
327577df16aSPawel Wodkowski			CONFIG[COVERAGE]=n
3289dd998cdSBen Walker			;;
329995d60f4SBen Walker		--enable-pgo-capture)
330995d60f4SBen Walker			CONFIG[PGO_CAPTURE]=y
331995d60f4SBen Walker			;;
332995d60f4SBen Walker		--disable-pgo-capture)
333995d60f4SBen Walker			CONFIG[PGO_CAPTURE]=n
334995d60f4SBen Walker			;;
335995d60f4SBen Walker		--enable-pgo-use)
336995d60f4SBen Walker			CONFIG[PGO_USE]=y
337995d60f4SBen Walker			;;
338995d60f4SBen Walker		--disable-pgo-use)
339995d60f4SBen Walker			CONFIG[PGO_USE]=n
340995d60f4SBen Walker			;;
3419022a59eSDaniel Verkamp		--enable-tests)
342577df16aSPawel Wodkowski			CONFIG[TESTS]=y
3439022a59eSDaniel Verkamp			;;
3449022a59eSDaniel Verkamp		--disable-tests)
345577df16aSPawel Wodkowski			CONFIG[TESTS]=n
3469022a59eSDaniel Verkamp			;;
3479fcb1cb0STomasz Zawadzki		--enable-unit-tests)
3489fcb1cb0STomasz Zawadzki			CONFIG[UNIT_TESTS]=y
3499fcb1cb0STomasz Zawadzki			;;
3509fcb1cb0STomasz Zawadzki		--disable-unit-tests)
3519fcb1cb0STomasz Zawadzki			CONFIG[UNIT_TESTS]=n
3529fcb1cb0STomasz Zawadzki			;;
3539b2c6452SJacek Kalwas		--enable-examples)
3549b2c6452SJacek Kalwas			CONFIG[EXAMPLES]=y
3559b2c6452SJacek Kalwas			;;
3569b2c6452SJacek Kalwas		--disable-examples)
3579b2c6452SJacek Kalwas			CONFIG[EXAMPLES]=n
3589b2c6452SJacek Kalwas			;;
359119158cdSRajarshi Chowdhury		--enable-apps)
360119158cdSRajarshi Chowdhury			CONFIG[APPS]=y
361119158cdSRajarshi Chowdhury			;;
362119158cdSRajarshi Chowdhury		--disable-apps)
363119158cdSRajarshi Chowdhury			CONFIG[APPS]=N
364119158cdSRajarshi Chowdhury			;;
3659dd998cdSBen Walker		--enable-werror)
366577df16aSPawel Wodkowski			CONFIG[WERROR]=y
3679dd998cdSBen Walker			;;
3689dd998cdSBen Walker		--disable-werror)
369577df16aSPawel Wodkowski			CONFIG[WERROR]=n
3709dd998cdSBen Walker			;;
37191e42257SJim Harris		--enable-cet)
37291e42257SJim Harris			CONFIG[CET]=y
37391e42257SJim Harris			;;
37491e42257SJim Harris		--disable-cet)
37591e42257SJim Harris			CONFIG[CET]=n
37691e42257SJim Harris			;;
3777232c450SMichal Berger		--with-dpdk)
3787b04eb72SYuriy Umanets			# Can we use pkg-config?
3797b04eb72SYuriy Umanets			if command -v "pkg-config" > /dev/null 2>&1 && pkg-config --exists libdpdk; then
3807b04eb72SYuriy Umanets				dpdk_libdir=$(pkg-config --variable=libdir libdpdk)
3817b04eb72SYuriy Umanets				dpdk_libdir=$(readlink -f $dpdk_libdir)
3827b04eb72SYuriy Umanets				dpdk_incdir=$(pkg-config --variable=includedir libdpdk)
3837b04eb72SYuriy Umanets				echo "Using DPDK lib dir $dpdk_libdir"
3847b04eb72SYuriy Umanets				CONFIG[DPDK_LIB_DIR]=$dpdk_libdir
3857b04eb72SYuriy Umanets				CONFIG[DPDK_INC_DIR]=$dpdk_incdir
3867232c450SMichal Berger				CONFIG[DPDK_PKG_CONFIG]=y
3877232c450SMichal Berger				CFLAGS="${CFLAGS:+$CFLAGS }$(pkg-config --cflags libdpdk)"
388f1980244SYuriy Umanets				check_IPSec_mb "pkg-config" "$dpdk_libdir" "$dpdk_incdir"
3897232c450SMichal Berger			else
3907232c450SMichal Berger				echo "libdpdk.pc not found, aborting"
3917232c450SMichal Berger				exit 1
3927232c450SMichal Berger			fi
3937232c450SMichal Berger			;;
39406cc8045SBen Walker		--with-dpdk=*)
39506cc8045SBen Walker			check_dir "$i"
3967b04eb72SYuriy Umanets			dpdk_dir=$(readlink -f ${i#*=})
3977b04eb72SYuriy Umanets			dpdk_libdir=$(find_dpdk_arch_libdir $dpdk_dir)
3987b04eb72SYuriy Umanets			dpdk_incdir="$dpdk_dir/include"
3997b04eb72SYuriy Umanets
4007b04eb72SYuriy Umanets			# Can we use pkg-config?
401f13ec525SKarol Latecki			if command -v "pkg-config" > /dev/null 2>&1 && PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --exists libdpdk; then
4027b04eb72SYuriy Umanets				echo "Using $dpdk_libdir/pkgconfig for additional libs..."
4031e6db5fbSTomasz Zawadzki				sysroot_dir=$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --variable=pc_sysrootdir libdpdk)
404e9438453SJacek Kalwas				dpdk_libdir=$(PKG_CONFIG_SYSROOT_DIR='' PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --variable=libdir libdpdk)
4051e6db5fbSTomasz Zawadzki				dpdk_libdir=$(readlink -f "${sysroot_dir}$dpdk_libdir")
4067b04eb72SYuriy Umanets				if ! echo $dpdk_libdir | grep $dpdk_dir > /dev/null 2>&1; then
4077b04eb72SYuriy Umanets					echo "ERROR: pkg-config reported DPDK libdir $dpdk_libdir is out of the directory specified with --with-dpdk="
4087b04eb72SYuriy Umanets					echo "ERROR: do you have another DPDK installed in the system?"
4097b04eb72SYuriy Umanets					exit 1
4107b04eb72SYuriy Umanets				fi
411f13ec525SKarol Latecki				CFLAGS="${CFLAGS:+$CFLAGS }$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --cflags libdpdk)"
4121e6db5fbSTomasz Zawadzki				dpdk_incdir="${sysroot_dir}$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --variable=includedir libdpdk)"
413f1980244SYuriy Umanets				check_IPSec_mb "pkg-config" "$dpdk_libdir" "$dpdk_incdir"
4143e3fbf91SYuriy Umanets			else
4153e3fbf91SYuriy Umanets				echo "Using $dpdk_incdir/rte_build_config.h for additional libs..."
4163e3fbf91SYuriy Umanets
417f1980244SYuriy Umanets				check_IPSec_mb "build-config" "$dpdk_libdir" "$dpdk_incdir"
4187b04eb72SYuriy Umanets			fi
4197b04eb72SYuriy Umanets			echo "DPDK libraries: $dpdk_libdir"
4207b04eb72SYuriy Umanets			echo "DPDK includes: $dpdk_incdir"
4217b04eb72SYuriy Umanets			CONFIG[DPDK_DIR]=$dpdk_dir
4227b04eb72SYuriy Umanets			CONFIG[DPDK_LIB_DIR]="$dpdk_libdir"
4237b04eb72SYuriy Umanets			CONFIG[DPDK_INC_DIR]="$dpdk_incdir"
4247b04eb72SYuriy Umanets			CONFIG[DPDK_PKG_CONFIG]=n
42506cc8045SBen Walker			;;
42606cc8045SBen Walker		--without-dpdk)
42706cc8045SBen Walker			CONFIG[DPDK_DIR]=
42806cc8045SBen Walker			;;
4299854c138SNick Connolly		--with-wpdk=*)
4309854c138SNick Connolly			check_dir "$i"
4319854c138SNick Connolly			CONFIG[WPDK_DIR]=$(readlink -f ${i#*=})
4329854c138SNick Connolly			;;
4332bc71094SMichal Berger		--without-wpdk)
4342bc71094SMichal Berger			CONFIG[WPDK_DIR]=
4352bc71094SMichal Berger			;;
4369dd998cdSBen Walker		--with-env=*)
437577df16aSPawel Wodkowski			CONFIG[ENV]="${i#*=}"
4389dd998cdSBen Walker			;;
439ed2b53f3SYifan Bian		--with-ublk)
440ed2b53f3SYifan Bian			CONFIG[UBLK]=y
441ed2b53f3SYifan Bian			;;
442ed2b53f3SYifan Bian		--without-ublk)
443ed2b53f3SYifan Bian			CONFIG[UBLK]=n
444ed2b53f3SYifan Bian			;;
4459dd998cdSBen Walker		--with-rbd)
446577df16aSPawel Wodkowski			CONFIG[RBD]=y
4479dd998cdSBen Walker			;;
4489dd998cdSBen Walker		--without-rbd)
449577df16aSPawel Wodkowski			CONFIG[RBD]=n
4509dd998cdSBen Walker			;;
451daee62a0SAlexey Marchuk		--with-rdma=*)
452daee62a0SAlexey Marchuk			CONFIG[RDMA]=y
453daee62a0SAlexey Marchuk			CONFIG[RDMA_PROV]=${i#*=}
454daee62a0SAlexey Marchuk			;;
4559dd998cdSBen Walker		--with-rdma)
456577df16aSPawel Wodkowski			CONFIG[RDMA]=y
457daee62a0SAlexey Marchuk			CONFIG[RDMA_PROV]="verbs"
4589dd998cdSBen Walker			;;
4599dd998cdSBen Walker		--without-rdma)
460577df16aSPawel Wodkowski			CONFIG[RDMA]=n
4619dd998cdSBen Walker			;;
462ed56a3d4SAnil Veerabhadrappa		--with-fc=*)
463ed56a3d4SAnil Veerabhadrappa			CONFIG[FC]=y
464ed56a3d4SAnil Veerabhadrappa			CONFIG[FC_PATH]=$(readlink -f ${i#*=})
465ed56a3d4SAnil Veerabhadrappa			;;
466ed56a3d4SAnil Veerabhadrappa		--with-fc)
467ed56a3d4SAnil Veerabhadrappa			CONFIG[FC]=y
468ed56a3d4SAnil Veerabhadrappa			CONFIG[FC_PATH]=
469ed56a3d4SAnil Veerabhadrappa			;;
470ed56a3d4SAnil Veerabhadrappa		--without-fc)
471ed56a3d4SAnil Veerabhadrappa			CONFIG[FC]=n
472ed56a3d4SAnil Veerabhadrappa			CONFIG[FC_PATH]=
473ed56a3d4SAnil Veerabhadrappa			;;
4742e283fcbS0xe0f		--with-daos)
4752e283fcbS0xe0f			CONFIG[DAOS]=y
476044bb175SDenis Barakthanov			CONFIG[DAOS_DIR]=""
477044bb175SDenis Barakthanov			;;
478044bb175SDenis Barakthanov		--with-daos=*)
479044bb175SDenis Barakthanov			CONFIG[DAOS]=y
480044bb175SDenis Barakthanov			check_dir "$i"
481044bb175SDenis Barakthanov			CONFIG[DAOS_DIR]=$(readlink -f ${i#*=})
4822e283fcbS0xe0f			;;
4832e283fcbS0xe0f		--without-daos)
4842e283fcbS0xe0f			CONFIG[DAOS]=n
4852e283fcbS0xe0f			;;
4860923734cSLance Hartmann		--with-shared)
487577df16aSPawel Wodkowski			CONFIG[SHARED]=y
4880923734cSLance Hartmann			;;
4890923734cSLance Hartmann		--without-shared)
490577df16aSPawel Wodkowski			CONFIG[SHARED]=n
4910923734cSLance Hartmann			;;
4922af15344SJim Harris		--with-iscsi-initiator)
493577df16aSPawel Wodkowski			CONFIG[ISCSI_INITIATOR]=y
4942af15344SJim Harris			;;
4952af15344SJim Harris		--without-iscsi-initiator)
496577df16aSPawel Wodkowski			CONFIG[ISCSI_INITIATOR]=n
4972af15344SJim Harris			;;
4986118b853SDaniel Verkamp		--with-crypto)
499577df16aSPawel Wodkowski			CONFIG[CRYPTO]=y
5006118b853SDaniel Verkamp			;;
5016118b853SDaniel Verkamp		--without-crypto)
502577df16aSPawel Wodkowski			CONFIG[CRYPTO]=n
5036118b853SDaniel Verkamp			;;
50435260f2bSDaniel Verkamp		--with-vhost)
505577df16aSPawel Wodkowski			CONFIG[VHOST]=y
50635260f2bSDaniel Verkamp			;;
50735260f2bSDaniel Verkamp		--without-vhost)
508577df16aSPawel Wodkowski			CONFIG[VHOST]=n
50935260f2bSDaniel Verkamp			;;
5107dee96ceSDariusz Stojaczyk		--with-virtio)
511577df16aSPawel Wodkowski			CONFIG[VIRTIO]=y
5127dee96ceSDariusz Stojaczyk			;;
5137dee96ceSDariusz Stojaczyk		--without-virtio)
514577df16aSPawel Wodkowski			CONFIG[VIRTIO]=n
5157dee96ceSDariusz Stojaczyk			;;
516b30d57cdSChangpeng Liu		--with-vfio-user)
517b30d57cdSChangpeng Liu			CONFIG[VFIO_USER]=y
518d0b2448bSChangpeng Liu			CONFIG[VFIO_USER_DIR]=""
519d0b2448bSChangpeng Liu			;;
520d0b2448bSChangpeng Liu		--with-vfio-user=*)
521d0b2448bSChangpeng Liu			CONFIG[VFIO_USER]=y
522d0b2448bSChangpeng Liu			check_dir "$i"
523d0b2448bSChangpeng Liu			CONFIG[VFIO_USER_DIR]=$(readlink -f ${i#*=})
524b30d57cdSChangpeng Liu			;;
525b30d57cdSChangpeng Liu		--without-vfio-user)
526b30d57cdSChangpeng Liu			CONFIG[VFIO_USER]=n
527b30d57cdSChangpeng Liu			;;
52819e2dc38Spaul luse		--with-vbdev-compress)
52919e2dc38Spaul luse			CONFIG[VBDEV_COMPRESS]=y
53097022803SJim Harris			;;
53119e2dc38Spaul luse		--without-vbdev-compress)
53219e2dc38Spaul luse			CONFIG[VBDEV_COMPRESS]=n
53397022803SJim Harris			;;
534976f8b09Spaul luse		--with-dpdk-compressdev)
535976f8b09Spaul luse			CONFIG[DPDK_COMPRESSDEV]=y
536976f8b09Spaul luse			;;
537976f8b09Spaul luse		--without-dpdk-compressdev)
538976f8b09Spaul luse			CONFIG[DPDK_COMPRESSDEV]=n
539976f8b09Spaul luse			;;
5406f338d4bSKrishna Kanth Reddy		--with-xnvme)
5416f338d4bSKrishna Kanth Reddy			CONFIG[XNVME]=y
5426f338d4bSKrishna Kanth Reddy			;;
5436f338d4bSKrishna Kanth Reddy		--without-xnvme)
5446f338d4bSKrishna Kanth Reddy			CONFIG[XNVME]=n
5456f338d4bSKrishna Kanth Reddy			;;
546c3329b52SMichal Berger		--with-fio) ;&
5479dd998cdSBen Walker		--with-fio=*)
548c3329b52SMichal Berger			if [[ ${i#*=} != "$i" ]]; then
54911a5716dSMichal Berger				CONFIG[FIO_SOURCE_DIR]=${i#*=}
550c3329b52SMichal Berger			fi
551c3329b52SMichal Berger			check_dir "--with-fio=${CONFIG[FIO_SOURCE_DIR]}"
55211a5716dSMichal Berger			CONFIG[FIO_SOURCE_DIR]=$(readlink -f "${CONFIG[FIO_SOURCE_DIR]}")
553577df16aSPawel Wodkowski			CONFIG[FIO_PLUGIN]=y
5549dd998cdSBen Walker			;;
5559dd998cdSBen Walker		--without-fio)
556577df16aSPawel Wodkowski			CONFIG[FIO_PLUGIN]=n
5579dd998cdSBen Walker			;;
5585712088aSRoman Sudarikov		--with-vtune=*)
5591723a800SGangCao			check_dir "$i"
560577df16aSPawel Wodkowski			CONFIG[VTUNE_DIR]="${i#*=}"
561577df16aSPawel Wodkowski			CONFIG[VTUNE]=y
5625712088aSRoman Sudarikov			;;
5635712088aSRoman Sudarikov		--without-vtune)
564577df16aSPawel Wodkowski			CONFIG[VTUNE_DIR]=
565577df16aSPawel Wodkowski			CONFIG[VTUNE]=n
5665712088aSRoman Sudarikov			;;
56798d60de6SPiotr Pelplinski		--with-ocf)
56898d60de6SPiotr Pelplinski			CONFIG[OCF]=y
569985d6468SKamil Godzwon			CONFIG[OCF_PATH]=$(readlink -f "$rootdir/ocf")
57098d60de6SPiotr Pelplinski			;;
571d1fee489SVitaliy Mysak		--with-ocf=*)
572d1fee489SVitaliy Mysak			CONFIG[OCF]=y
573d1fee489SVitaliy Mysak			CONFIG[OCF_PATH]=$(readlink -f ${i#*=})
574d1fee489SVitaliy Mysak			;;
575d1fee489SVitaliy Mysak		--without-ocf)
576d1fee489SVitaliy Mysak			CONFIG[OCF]=n
577d1fee489SVitaliy Mysak			CONFIG[OCF_PATH]=
578d1fee489SVitaliy Mysak			;;
5798165bf71SBen Walker		--with-uring=*)
5808165bf71SBen Walker			CONFIG[URING]=y
5818165bf71SBen Walker			CONFIG[URING_PATH]=$(readlink -f ${i#*=})
5828165bf71SBen Walker			;;
5838165bf71SBen Walker		--with-uring)
5848165bf71SBen Walker			CONFIG[URING]=y
585958d196cSIndraneel M			CONFIG[URING_ZNS]=y
5868165bf71SBen Walker			CONFIG[URING_PATH]=
5878165bf71SBen Walker			;;
5888165bf71SBen Walker		--without-uring)
5898165bf71SBen Walker			CONFIG[URING]=n
5908165bf71SBen Walker			CONFIG[URING_PATH]=
5918165bf71SBen Walker			;;
592958d196cSIndraneel M		--without-uring-zns)
593958d196cSIndraneel M			CONFIG[URING_ZNS]=n
5948b840195SIndraneel M			;;
59534192459SBoris Glimcher		--with-openssl=*)
59634192459SBoris Glimcher			check_dir "$i"
59734192459SBoris Glimcher			CONFIG[OPENSSL_PATH]=$(readlink -f ${i#*=})
59834192459SBoris Glimcher			;;
5997fa15e28SXiaodong Liu		--with-fuse)
6007fa15e28SXiaodong Liu			CONFIG[FUSE]=y
6017fa15e28SXiaodong Liu			;;
6027fa15e28SXiaodong Liu		--without-fuse)
6037fa15e28SXiaodong Liu			CONFIG[FUSE]=n
6047fa15e28SXiaodong Liu			;;
605805d9942STomasz Kulasek		--with-nvme-cuse)
606805d9942STomasz Kulasek			CONFIG[NVME_CUSE]=y
607805d9942STomasz Kulasek			;;
608805d9942STomasz Kulasek		--without-nvme-cuse)
609805d9942STomasz Kulasek			CONFIG[NVME_CUSE]=n
610805d9942STomasz Kulasek			;;
61183a4b155SArtur Paszkiewicz		--with-raid5f)
61283a4b155SArtur Paszkiewicz			CONFIG[RAID5F]=y
61373763d40SArtur Paszkiewicz			;;
61483a4b155SArtur Paszkiewicz		--without-raid5f)
61583a4b155SArtur Paszkiewicz			CONFIG[RAID5F]=n
61673763d40SArtur Paszkiewicz			;;
617e58e9fbdSpaul luse		--with-idxd)
618e58e9fbdSpaul luse			CONFIG[IDXD]=y
6192ed914f8SZiye Yang			CONFIG[IDXD_KERNEL]=n
620e58e9fbdSpaul luse			;;
621e58e9fbdSpaul luse		--without-idxd)
622e58e9fbdSpaul luse			CONFIG[IDXD]=n
623e58e9fbdSpaul luse			;;
6245a1c74bfSJim Harris		--with-usdt)
6255a1c74bfSJim Harris			CONFIG[USDT]=y
6265a1c74bfSJim Harris			;;
6275a1c74bfSJim Harris		--without-usdt)
6285a1c74bfSJim Harris			CONFIG[USDT]=n
6295a1c74bfSJim Harris			;;
630050565e5SJim Harris		--with-fuzzer)
631050565e5SJim Harris			echo "Must specify fuzzer library path with --with-fuzzer"
632050565e5SJim Harris			usage
633050565e5SJim Harris			exit 1
634050565e5SJim Harris			;;
635050565e5SJim Harris		--with-fuzzer=*)
636050565e5SJim Harris			CONFIG[FUZZER]=y
637050565e5SJim Harris			CONFIG[FUZZER_LIB]=$(readlink -f ${i#*=})
638050565e5SJim Harris			;;
639050565e5SJim Harris		--without-fuzzer)
640050565e5SJim Harris			CONFIG[FUZZER]=n
641050565e5SJim Harris			CONFIG[FUZZER_LIB]=
642050565e5SJim Harris			;;
643509241ceSKonrad Sztyber		--with-sma)
644509241ceSKonrad Sztyber			CONFIG[SMA]=y
645509241ceSKonrad Sztyber			;;
646509241ceSKonrad Sztyber		--without-sma)
647509241ceSKonrad Sztyber			CONFIG[SMA]=n
648509241ceSKonrad Sztyber			;;
6492796687dSParameswaran Krishnamurthy		--with-avahi)
6502796687dSParameswaran Krishnamurthy			CONFIG[AVAHI]=y
6512796687dSParameswaran Krishnamurthy			;;
6522796687dSParameswaran Krishnamurthy		--without-avahi)
6532796687dSParameswaran Krishnamurthy			CONFIG[AVAHI]=n
6542796687dSParameswaran Krishnamurthy			;;
655*8247bd40SMarcin Spiewak		--max-lcores='')
656*8247bd40SMarcin Spiewak			echo "Must specify max number of lcores for --max-lcores"
657*8247bd40SMarcin Spiewak			usage
658*8247bd40SMarcin Spiewak			exit 1
659*8247bd40SMarcin Spiewak			;;
660*8247bd40SMarcin Spiewak		--max-lcores=*)
661*8247bd40SMarcin Spiewak			CONFIG[MAX_LCORES]="${i#*=}"
662*8247bd40SMarcin Spiewak			;;
6639dd998cdSBen Walker		--)
6649dd998cdSBen Walker			break
6659dd998cdSBen Walker			;;
6669dd998cdSBen Walker		*)
6679dd998cdSBen Walker			echo "Unrecognized option $i"
6689dd998cdSBen Walker			usage
6699dd998cdSBen Walker			exit 1
6705ccabc8fSMichal Berger			;;
6719dd998cdSBen Walker	esac
6729dd998cdSBen Walkerdone
6739dd998cdSBen Walker
674131c9aadSAlexey Marchukif [[ $arch == x86_64* ]]; then
67510e1c615SFélix Piédallu	BUILD_CMD=($CC -o /dev/null -x c $CPPFLAGS $CFLAGS $LDFLAGS "-march=native")
676131c9aadSAlexey Marchukelse
67710e1c615SFélix Piédallu	BUILD_CMD=($CC -o /dev/null -x c $CPPFLAGS $CFLAGS $LDFLAGS)
678131c9aadSAlexey Marchukfi
6796c23a6f4SMichal BergerBUILD_CMD+=(-I/usr/local/include -L/usr/local/lib)
68073439e6fSBen Walker
681b30d57cdSChangpeng Liuif [[ "${CONFIG[VFIO_USER]}" = "y" ]]; then
682421368c0SGreg Inozemtsev	if ! echo -e '#include <json-c/json.h>' \
683421368c0SGreg Inozemtsev		| "${BUILD_CMD[@]}" -E - 2> /dev/null; then
6843b673b84SChangpeng Liu		echo "ERROR: --with-vfio-user requires json-c-devel"
6853b673b84SChangpeng Liu		echo "Please install then re-run this script"
6863b673b84SChangpeng Liu		exit 1
6873b673b84SChangpeng Liu	fi
688421368c0SGreg Inozemtsev	if ! echo -e '#include <cmocka.h>' \
689421368c0SGreg Inozemtsev		| "${BUILD_CMD[@]}" -E - 2> /dev/null; then
6903b673b84SChangpeng Liu		echo "ERROR: --with-vfio-user requires libcmocka-devel"
6913b673b84SChangpeng Liu		echo "Please install then re-run this script"
6923b673b84SChangpeng Liu		exit 1
693b30d57cdSChangpeng Liu	fi
694b30d57cdSChangpeng Liufi
695b30d57cdSChangpeng Liu
696e58e9fbdSpaul luse# IDXD uses Intel specific instructions.
697e58e9fbdSpaul luseif [[ "${CONFIG[IDXD]}" = "y" ]]; then
6982755fbdfSpaul luse	if [ $(uname -s) == "FreeBSD" ]; then
6992755fbdfSpaul luse		intel="hw.model: Intel"
7002755fbdfSpaul luse		cpu_vendor=$(sysctl -a | grep hw.model | cut -c 1-15)
7012755fbdfSpaul luse	else
702e58e9fbdSpaul luse		intel="GenuineIntel"
703e58e9fbdSpaul luse		cpu_vendor=$(grep -i 'vendor' /proc/cpuinfo --max-count=1)
7042755fbdfSpaul luse	fi
705e58e9fbdSpaul luse	if [[ "$cpu_vendor" != *"$intel"* ]]; then
706ff238359SJosh Soref		echo "ERROR: IDXD cannot be used due to CPU incompatibility."
707e58e9fbdSpaul luse		exit 1
708e58e9fbdSpaul luse	fi
7092ed914f8SZiye Yang	if [ -e /usr/include/accel-config/libaccel_config.h ]; then
7102ed914f8SZiye Yang		CONFIG[IDXD_KERNEL]=y
7112ed914f8SZiye Yang	fi
7122ed914f8SZiye Yang
713e58e9fbdSpaul lusefi
714e58e9fbdSpaul luse
715577df16aSPawel Wodkowskiif [ -z "${CONFIG[ENV]}" ]; then
716577df16aSPawel Wodkowski	CONFIG[ENV]=$rootdir/lib/env_dpdk
717577df16aSPawel Wodkowski	echo "Using default SPDK env in ${CONFIG[ENV]}"
7187232c450SMichal Berger	if [[ -z "${CONFIG[DPDK_DIR]}" && "${CONFIG[DPDK_PKG_CONFIG]}" == n ]]; then
71938e26cf5STomasz Zawadzki		if [ ! -f "$rootdir"/dpdk/config/meson.build ]; then
720d199eb29SDaniel Verkamp			echo "DPDK not found; please specify --with-dpdk=<path> or run:"
721d199eb29SDaniel Verkamp			echo
722d199eb29SDaniel Verkamp			echo "  git submodule update --init"
723d199eb29SDaniel Verkamp			exit 1
724577df16aSPawel Wodkowski		else
725577df16aSPawel Wodkowski			CONFIG[DPDK_DIR]="${rootdir}/dpdk/build"
726f1980244SYuriy Umanets			# Default ipsec libs
72719518dfbSAleksey Marchuk			if [[ "${CONFIG[CRYPTO]}" = "y" ]] && [[ $arch = x86_64* ]]; then
728f1980244SYuriy Umanets				CONFIG[IPSEC_MB]=y
729f1980244SYuriy Umanets				CONFIG[IPSEC_MB_DIR]="${rootdir}/intel-ipsec-mb/lib"
730f1980244SYuriy Umanets			fi
731577df16aSPawel Wodkowski			echo "Using default DPDK in ${CONFIG[DPDK_DIR]}"
732d199eb29SDaniel Verkamp		fi
7339dd998cdSBen Walker	fi
7347d2a2f52SBen Walkerelse
7357232c450SMichal Berger	if [[ -n "${CONFIG[DPDK_DIR]}" || "${CONFIG[DPDK_PKG_CONFIG]}" == y ]]; then
73606cc8045SBen Walker		echo "--with-env and --with-dpdk are mutually exclusive."
73706cc8045SBen Walker		exit 1
73806cc8045SBen Walker	fi
73906cc8045SBen Walker
740577df16aSPawel Wodkowski	if [ "${CONFIG[VHOST]}" = "y" ]; then
7417d2a2f52SBen Walker		echo "Vhost is only supported when using the default DPDK environment. Disabling it."
7427d2a2f52SBen Walker	fi
7437d2a2f52SBen Walker	# Always disable vhost, but only print the error message if the user explicitly turned it on.
744577df16aSPawel Wodkowski	CONFIG[VHOST]="n"
745577df16aSPawel Wodkowski	if [ "${CONFIG[VIRTIO]}" = "y" ]; then
7467d2a2f52SBen Walker		echo "Virtio is only supported when using the default DPDK environment. Disabling it."
7477d2a2f52SBen Walker	fi
7487d2a2f52SBen Walker	# Always disable virtio, but only print the error message if the user explicitly turned it on.
749577df16aSPawel Wodkowski	CONFIG[VIRTIO]="n"
7509dd998cdSBen Walkerfi
7519dd998cdSBen Walker
7527232c450SMichal Bergerif [[ "${CONFIG[DPDK_PKG_CONFIG]}" == y ]]; then
7537232c450SMichal Berger	if [[ "${CONFIG[SHARED]}" == n ]]; then
7547232c450SMichal Berger		# dpdk-devel doesn't provide static libs
7557232c450SMichal Berger		echo "Build against packaged DPDK requested, enabling shared libraries"
7567232c450SMichal Berger		CONFIG[SHARED]=y
7577232c450SMichal Berger	fi
7587232c450SMichal Bergerfi
7597232c450SMichal Berger
7609854c138SNick Connollyif [[ $sys_name == "Windows" ]]; then
7619854c138SNick Connolly	if [ -z "${CONFIG[WPDK_DIR]}" ]; then
7629854c138SNick Connolly		if [ ! -f "$rootdir"/wpdk/Makefile ]; then
7639854c138SNick Connolly			echo "WPDK not found; please specify --with-wpdk=<path>. See https://wpdk.github.io."
7649854c138SNick Connolly			exit 1
7659854c138SNick Connolly		else
7669854c138SNick Connolly			CONFIG[WPDK_DIR]="${rootdir}/wpdk/build"
7679854c138SNick Connolly			echo "Using default WPDK in ${CONFIG[WPDK_DIR]}"
7689854c138SNick Connolly		fi
7699854c138SNick Connolly	fi
7709854c138SNick Connollyelse
7719854c138SNick Connolly	if [ -n "${CONFIG[WPDK_DIR]}" ]; then
7729854c138SNick Connolly		echo "ERROR: --with-wpdk is only supported for Windows"
7739854c138SNick Connolly		exit 1
7749854c138SNick Connolly	fi
7759854c138SNick Connollyfi
7769854c138SNick Connolly
777577df16aSPawel Wodkowskiif [ "${CONFIG[VTUNE]}" = "y" ]; then
7786b97cccfSJim Harris	echo "WARNING: VTune support is deprecated."
779577df16aSPawel Wodkowski	if [ -z "${CONFIG[VTUNE_DIR]}" ]; then
7805712088aSRoman Sudarikov		echo "When VTune is enabled, you must specify the VTune directory using --with-vtune=path"
7815712088aSRoman Sudarikov		exit 1
7825712088aSRoman Sudarikov	fi
7835712088aSRoman Sudarikovfi
7845712088aSRoman Sudarikov
785bb0f78a2SMichal Bergerif [[ "${CONFIG[ASAN]}" = "y" && "${CONFIG[TSAN]}" = "y" ]]; then
786830912e2SBen Walker	echo "ERROR: ASAN and TSAN cannot be enabled at the same time."
787830912e2SBen Walker	exit 1
788830912e2SBen Walkerfi
789830912e2SBen Walker
790ac5b53a5SJim Harrisif [[ "${CONFIG[FIO_PLUGIN]}" = "y" && "${CONFIG[EXAMPLES]}" = "n" ]]; then
791ac5b53a5SJim Harris	echo "ERROR: --with-fio and --disable-examples are mutually exclusive."
792ac5b53a5SJim Harris	exit 1
793ac5b53a5SJim Harrisfi
794ac5b53a5SJim Harris
7955a764955SMichal Bergerif [[ $sys_name == "FreeBSD" ]]; then
7965091cadcSPaul Luse	# FreeBSD doesn't support all configurations
797577df16aSPawel Wodkowski	if [[ "${CONFIG[COVERAGE]}" == "y" ]]; then
7985091cadcSPaul Luse		echo "ERROR: CONFIG_COVERAGE not available on FreeBSD"
7995091cadcSPaul Luse		exit 1
8005091cadcSPaul Luse	fi
8015091cadcSPaul Lusefi
8025091cadcSPaul Luse
80325ac67f1SJim Harrisif [[ $sys_name == "Linux" ]]; then
80425ac67f1SJim Harris	if pkg-config libbsd; then
80525ac67f1SJim Harris		CONFIG[HAVE_LIBBSD]=y
80625ac67f1SJim Harris	fi
80725ac67f1SJim Harrisfi
80825ac67f1SJim Harris
809544a8fe5SJim Harrisif pkg-config libarchive; then
810544a8fe5SJim Harris	CONFIG[HAVE_LIBARCHIVE]=y
811544a8fe5SJim Harrisfi
812544a8fe5SJim Harris
8132a0c2a2dSNick Connollyif [[ $sys_name != "Linux" ]]; then
81427b920a2SDarek Stojaczyk	if [[ "${CONFIG[VHOST]}" == "y" ]]; then
815873c8748STomasz Kulasek		echo "Vhost is only supported on Linux."
816873c8748STomasz Kulasek		exit 1
81727b920a2SDarek Stojaczyk	fi
81827b920a2SDarek Stojaczyk	if [[ "${CONFIG[VIRTIO]}" == "y" ]]; then
819873c8748STomasz Kulasek		echo "Virtio is only supported on Linux."
820873c8748STomasz Kulasek		exit 1
82127b920a2SDarek Stojaczyk	fi
82227b920a2SDarek Stojaczykfi
82327b920a2SDarek Stojaczyk
824577df16aSPawel Wodkowskiif [ "${CONFIG[RDMA]}" = "y" ]; then
825daee62a0SAlexey Marchuk	if [[ ! "${CONFIG[RDMA_PROV]}" == "verbs" ]] && [[ ! "${CONFIG[RDMA_PROV]}" == "mlx5_dv" ]]; then
826daee62a0SAlexey Marchuk		echo "Invalid RDMA provider specified, must be \"verbs\" or \"mlx5_dv\""
827daee62a0SAlexey Marchuk		exit 1
828daee62a0SAlexey Marchuk	fi
829daee62a0SAlexey Marchuk
830eed0c6beSDarek Stojaczyk	if ! echo -e '#include <infiniband/verbs.h>\n#include <rdma/rdma_verbs.h>\n' \
831eed0c6beSDarek Stojaczyk		'int main(void) { return 0; }\n' \
832bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -libverbs -lrdmacm - 2> /dev/null; then
833bb0f78a2SMichal Berger		echo "--with-rdma requires libverbs and librdmacm."
834bb0f78a2SMichal Berger		echo "Please install then re-run this script."
835eed0c6beSDarek Stojaczyk		exit 1
836eed0c6beSDarek Stojaczyk	fi
837eed0c6beSDarek Stojaczyk
838eed0c6beSDarek Stojaczyk	if echo -e '#include <infiniband/verbs.h>\n' \
839eed0c6beSDarek Stojaczyk		'int main(void) { return !!IBV_WR_SEND_WITH_INV; }\n' \
840bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -c - 2> /dev/null; then
841577df16aSPawel Wodkowski		CONFIG[RDMA_SEND_WITH_INVAL]="y"
8427671073bSSeth Howell	else
843577df16aSPawel Wodkowski		CONFIG[RDMA_SEND_WITH_INVAL]="n"
84417a819f8SJim Harris		echo "
8457671073bSSeth Howell*******************************************************************************
8467671073bSSeth HowellWARNING: The Infiniband Verbs opcode Send With Invalidate is either not
8477671073bSSeth Howellsupported or is not functional with the current version of libibverbs installed
8487671073bSSeth Howellon this system. Please upgrade to at least version 1.1.
8497671073bSSeth Howell
8507671073bSSeth HowellBeginning with Linux kernel 4.14, the kernel NVMe-oF initiator leverages Send
8517671073bSSeth HowellWith Invalidate RDMA operations to improve performance. Failing to use the
8527671073bSSeth HowellSend With Invalidate operation on the NVMe-oF target side results in full
8537671073bSSeth Howellfunctionality, but greatly reduced performance. The SPDK NVMe-oF target will
8547671073bSSeth Howellbe unable to leverage that operation using the currently installed version
8557671073bSSeth Howellof libibverbs, so Linux kernel NVMe-oF initiators based on kernels greater
8567671073bSSeth Howellthan or equal to 4.14 will see significantly reduced performance.
85717a819f8SJim Harris*******************************************************************************"
8587671073bSSeth Howell	fi
85994966468SAlexey Marchuk
86094966468SAlexey Marchuk	if echo -e '#include <rdma/rdma_cma.h>\n' \
86194966468SAlexey Marchuk		'int main(void) { return !!RDMA_OPTION_ID_ACK_TIMEOUT; }\n' \
862bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -c - 2> /dev/null; then
86394966468SAlexey Marchuk		CONFIG[RDMA_SET_ACK_TIMEOUT]="y"
86494966468SAlexey Marchuk	else
86594966468SAlexey Marchuk		CONFIG[RDMA_SET_ACK_TIMEOUT]="n"
86694966468SAlexey Marchuk		echo "RDMA_OPTION_ID_ACK_TIMEOUT is not supported"
86794966468SAlexey Marchuk	fi
86894966468SAlexey Marchuk
8697706450fSMichael Haeuptle	if echo -e '#include <rdma/rdma_cma.h>\n' \
8707706450fSMichael Haeuptle		'int main(void) { return !!RDMA_OPTION_ID_TOS; }\n' \
8717706450fSMichael Haeuptle		| "${BUILD_CMD[@]}" -c - 2> /dev/null; then
8727706450fSMichael Haeuptle		CONFIG[RDMA_SET_TOS]="y"
8737706450fSMichael Haeuptle	else
8747706450fSMichael Haeuptle		CONFIG[RDMA_SET_TOS]="n"
8757706450fSMichael Haeuptle		echo "RDMA_OPTION_ID_TOS is not supported"
8767706450fSMichael Haeuptle	fi
8777706450fSMichael Haeuptle
878daee62a0SAlexey Marchuk	if [ "${CONFIG[RDMA_PROV]}" == "mlx5_dv" ]; then
879a1dfa7ecSAlexey Marchuk		MLX5_DV_BUILD_BUILD_CMD="
880a1dfa7ecSAlexey Marchuk		#include <infiniband/mlx5dv.h>\n
881a1dfa7ecSAlexey Marchuk		#include <rdma/rdma_cma.h>\n
882a1dfa7ecSAlexey Marchuk		int main(void) { return rdma_establish(NULL) ||\n
883a1dfa7ecSAlexey Marchuk		!!IBV_QP_INIT_ATTR_SEND_OPS_FLAGS || !!MLX5_OPCODE_RDMA_WRITE"
884a1dfa7ecSAlexey Marchuk		if [ "${CONFIG[CRYPTO]}" = "y" ]; then
885a1dfa7ecSAlexey Marchuk			MLX5_DV_BUILD_BUILD_CMD+="|| !!MLX5DV_CRYPTO_ENGINES_CAP_AES_XTS_SINGLE_BLOCK"
886a1dfa7ecSAlexey Marchuk		fi
887a1dfa7ecSAlexey Marchuk		MLX5_DV_BUILD_BUILD_CMD+=";}"
888a1dfa7ecSAlexey Marchuk		if ! echo -e $MLX5_DV_BUILD_BUILD_CMD | "${BUILD_CMD[@]}" -lmlx5 -I${rootdir}/include -c -; then
889daee62a0SAlexey Marchuk			echo "mlx5_dv provider is not supported"
890daee62a0SAlexey Marchuk			exit 1
891daee62a0SAlexey Marchuk		fi
892daee62a0SAlexey Marchuk	fi
893daee62a0SAlexey Marchuk
894bb0f78a2SMichal Berger	echo "Using '${CONFIG[RDMA_PROV]}' RDMA provider"
8957671073bSSeth Howellfi
8967671073bSSeth Howell
897ed56a3d4SAnil Veerabhadrappaif [[ "${CONFIG[FC]}" = "y" ]]; then
898ed56a3d4SAnil Veerabhadrappa	if [[ -n "${CONFIG[FC_PATH]}" ]]; then
899c9b4654bSTomasz Zawadzki		check_dir "${CONFIG[FC_PATH]}"
900ed56a3d4SAnil Veerabhadrappa	fi
901ed56a3d4SAnil Veerabhadrappafi
902ed56a3d4SAnil Veerabhadrappa
9032a6ddeb8SYuriy Umanetsfunction dpdk_version() {
9042a6ddeb8SYuriy Umanets	# Check DPDK version to determine if mlx5_pci driver is supported
9052a6ddeb8SYuriy Umanets	local dpdk_ver="none"
9062a6ddeb8SYuriy Umanets	if [[ "${CONFIG[DPDK_DIR]}" == "$rootdir/dpdk/build" ]]; then
9072a6ddeb8SYuriy Umanets		# DPDK_DIR points at our submodule so ./build may not exist yet. Use
9082a6ddeb8SYuriy Umanets		# absolute path to lookup the version.
9092a6ddeb8SYuriy Umanets		dpdk_ver=$(< "$rootdir/dpdk/VERSION")
9102a6ddeb8SYuriy Umanets	elif [[ -f "${CONFIG[DPDK_DIR]}"/../VERSION ]]; then
9112a6ddeb8SYuriy Umanets		dpdk_ver=$(< "${CONFIG[DPDK_DIR]}"/../VERSION)
9122a6ddeb8SYuriy Umanets	fi
9132a6ddeb8SYuriy Umanets	echo $dpdk_ver
9142a6ddeb8SYuriy Umanets}
9152a6ddeb8SYuriy Umanets
9162a6ddeb8SYuriy Umanetsfunction mlx5_build() {
9172a6ddeb8SYuriy Umanets	# Check if libmlx5 exists to enable mlx5_pci compress/crypto PMD
9182a6ddeb8SYuriy Umanets	if ! echo -e '#include <spdk/stdinc.h>\n' \
9192a6ddeb8SYuriy Umanets		'#include <infiniband/mlx5dv.h>\n' \
9202a6ddeb8SYuriy Umanets		'#include <infiniband/verbs.h>\n' \
9212a6ddeb8SYuriy Umanets		'int main(void) { return 0; }\n' \
9222a6ddeb8SYuriy Umanets		| "${BUILD_CMD[@]}" -lmlx5 -libverbs -I${rootdir}/include -c - 2> /dev/null; then
9232a6ddeb8SYuriy Umanets		return 1
9242a6ddeb8SYuriy Umanets	fi
9252a6ddeb8SYuriy Umanets	return 0
9262a6ddeb8SYuriy Umanets}
9272a6ddeb8SYuriy Umanets
92819e2dc38Spaul luseif [[ "${CONFIG[VBDEV_COMPRESS]}" = "y" ]]; then
92923196506STomasz Zawadzki	echo "WARNING: PMDK - Persistent device support with bdev_compress is deprecated."
930c4a3b312SDarek Stojaczyk	if ! echo -e '#include <libpmem.h>\nint main(void) { return 0; }\n' \
931bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -lpmem - 2> /dev/null; then
93219e2dc38Spaul luse		echo "--with-vbdev-compress requires libpmem."
933bb0f78a2SMichal Berger		echo "Please install then re-run this script."
93497022803SJim Harris		exit 1
93597022803SJim Harris	fi
9362a6ddeb8SYuriy Umanets	# Try to enable mlx5 compress
93719e2dc38Spaul luse	CONFIG[VBDEV_COMPRESS_MLX5]="y"
9382a6ddeb8SYuriy Umanets
939e71ae467SAlexey Marchuk	# Check if libmlx5 exists to enable mlx5_pci compress PMD
9402a6ddeb8SYuriy Umanets	if ! mlx5_build; then
941e71ae467SAlexey Marchuk		echo "libmlx5 is not found, so disabling DPDK mlx5_pci compress PMD"
94219e2dc38Spaul luse		CONFIG[VBDEV_COMPRESS_MLX5]="n"
9432a6ddeb8SYuriy Umanets	else
944e71ae467SAlexey Marchuk		if [[ "${CONFIG[DPDK_PKG_CONFIG]}" = "y" ]]; then
945e71ae467SAlexey Marchuk			# Check if librte_compress_mlx5 exists in DPDK package
946e71ae467SAlexey Marchuk			if [ ! -f "${CONFIG[DPDK_LIB_DIR]}"/librte_compress_mlx5.so ]; then
947e71ae467SAlexey Marchuk				echo "librte_compress_mlx5 is not found, so disabling DPDK mlx5_pci compress PMD"
94819e2dc38Spaul luse				CONFIG[VBDEV_COMPRESS_MLX5]="n"
949e71ae467SAlexey Marchuk			fi
950e71ae467SAlexey Marchuk		else
951e71ae467SAlexey Marchuk			# Check DPDK version to determine if mlx5_pci driver is supported
9522a6ddeb8SYuriy Umanets			dpdk_ver=$(dpdk_version)
9532a6ddeb8SYuriy Umanets			if [[ $dpdk_ver = "none" ]]; then
954c2de56b0SMichal Berger				echo "Cannot get DPDK version, so disabling DPDK mlx5_pci compress PMD"
95519e2dc38Spaul luse				CONFIG[VBDEV_COMPRESS_MLX5]="n"
9562a6ddeb8SYuriy Umanets			elif [[ -n $dpdk_ver ]] && lt "$dpdk_ver" 21.02.0; then
9572a6ddeb8SYuriy Umanets				# mlx5_pci for compress is supported by DPDK >- 21.02.0
958c2de56b0SMichal Berger				echo "DPDK version ${dpdk_ver} doesn't support mlx5_pci compress PMD"
95919e2dc38Spaul luse				CONFIG[VBDEV_COMPRESS_MLX5]="n"
9602a6ddeb8SYuriy Umanets			elif [[ -n ${CONFIG[DPDK_LIB_DIR]} ]] && [ ! -f "${CONFIG[DPDK_LIB_DIR]}"/librte_compress_mlx5.so ]; then
9612a6ddeb8SYuriy Umanets				# This is only checked when --with-dpdk or --with-dpdk=* is used
9622a6ddeb8SYuriy Umanets				echo "librte_compress_mlx5 is not found, so disabling DPDK mlx5_pci compress PMD"
96319e2dc38Spaul luse				CONFIG[VBDEV_COMPRESS_MLX5]="n"
9642a6ddeb8SYuriy Umanets			fi
9652a6ddeb8SYuriy Umanets		fi
9662a6ddeb8SYuriy Umanets	fi
9672a6ddeb8SYuriy Umanetsfi
9682a6ddeb8SYuriy Umanets
9692a6ddeb8SYuriy Umanetsif [[ "${CONFIG[CRYPTO]}" = "y" ]]; then
9702a6ddeb8SYuriy Umanets	# Try to enable mlx5 crypto
9712a6ddeb8SYuriy Umanets	CONFIG[CRYPTO_MLX5]="y"
9722a6ddeb8SYuriy Umanets
9732a6ddeb8SYuriy Umanets	# Check if libmlx5 exists to enable mlx5_pci compress PMD
9742a6ddeb8SYuriy Umanets	if ! mlx5_build; then
9752a6ddeb8SYuriy Umanets		echo "libmlx5 is not found, so disabling DPDK mlx5_pci crypto PMD"
9762a6ddeb8SYuriy Umanets		CONFIG[CRYPTO_MLX5]="n"
9772a6ddeb8SYuriy Umanets	else
9782a6ddeb8SYuriy Umanets		if [[ "${CONFIG[DPDK_PKG_CONFIG]}" = "y" ]]; then
9792a6ddeb8SYuriy Umanets			# Check if librte_crypto_mlx5 exists in DPDK package
9802a6ddeb8SYuriy Umanets			if [ ! -f "${CONFIG[DPDK_LIB_DIR]}"/librte_crypto_mlx5.so ]; then
9812a6ddeb8SYuriy Umanets				echo "librte_crypto_mlx5 is not found, so disabling DPDK mlx5_pci crypto PMD"
9822a6ddeb8SYuriy Umanets				CONFIG[CRYPTO_MLX5]="n"
9832a6ddeb8SYuriy Umanets			fi
9842a6ddeb8SYuriy Umanets		else
9852a6ddeb8SYuriy Umanets			# Check DPDK version to determine if mlx5_pci driver is supported
9862a6ddeb8SYuriy Umanets			dpdk_ver=$(dpdk_version)
9872a6ddeb8SYuriy Umanets			if [[ $dpdk_ver = "none" ]]; then
9882a6ddeb8SYuriy Umanets				echo "Cannot get DPDK version, so disabling DPDK mlx5_pci crypto PMD"
9892a6ddeb8SYuriy Umanets				CONFIG[CRYPTO_MLX5]="n"
9908a2fc789SYuriy Umanets			elif [[ -n $dpdk_ver ]] && lt "$dpdk_ver" 21.11.0; then
9918a2fc789SYuriy Umanets				# mlx5_pci for crypto is supported by DPDK >- 21.11.0
9922a6ddeb8SYuriy Umanets				echo "DPDK version ${dpdk_ver} doesn't support mlx5_pci crypto PMD"
9932a6ddeb8SYuriy Umanets				CONFIG[CRYPTO_MLX5]="n"
9942a6ddeb8SYuriy Umanets			elif [[ -n ${CONFIG[DPDK_LIB_DIR]} ]] && [ ! -f "${CONFIG[DPDK_LIB_DIR]}"/librte_crypto_mlx5.so ]; then
9952a6ddeb8SYuriy Umanets				# This is only checked when --with-dpdk or --with-dpdk=* is used
9962a6ddeb8SYuriy Umanets				echo "librte_crypto_mlx5 is not found, so disabling DPDK mlx5_pci crypto PMD"
9972a6ddeb8SYuriy Umanets				CONFIG[CRYPTO_MLX5]="n"
9982a6ddeb8SYuriy Umanets			fi
999e71ae467SAlexey Marchuk		fi
1000e269bf4eSAlexey Marchuk	fi
100197022803SJim Harrisfi
100297022803SJim Harris
1003805d9942STomasz Kulasekif [[ "${CONFIG[NVME_CUSE]}" = "y" ]]; then
1004805d9942STomasz 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' \
1005bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -lfuse3 -D_FILE_OFFSET_BITS=64 - 2> /dev/null; then
1006bb0f78a2SMichal Berger		echo "--with-cuse requires libfuse3."
1007bb0f78a2SMichal Berger		echo "Please install then re-run this script."
1008805d9942STomasz Kulasek		exit 1
1009805d9942STomasz Kulasek	fi
1010805d9942STomasz Kulasekfi
1011805d9942STomasz Kulasek
101255bd0d3aSDarek Stojaczykif [[ "${CONFIG[RBD]}" = "y" ]]; then
101355bd0d3aSDarek Stojaczyk	if ! echo -e '#include <rbd/librbd.h>\n#include <rados/librados.h>\n' \
101455bd0d3aSDarek Stojaczyk		'int main(void) { return 0; }\n' \
1015bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -lrados -lrbd - 2> /dev/null; then
1016bb0f78a2SMichal Berger		echo "--with-rbd requires librados and librbd."
1017bb0f78a2SMichal Berger		echo "Please install then re-run this script."
101855bd0d3aSDarek Stojaczyk		exit 1
101955bd0d3aSDarek Stojaczyk	fi
102055bd0d3aSDarek Stojaczykfi
102155bd0d3aSDarek Stojaczyk
1022ed2b53f3SYifan Bianif [[ "${CONFIG[UBLK]}" = "y" ]]; then
1023ed2b53f3SYifan Bian	if ! echo -e '#include <linux/ublk_cmd.h>\n#include <liburing.h>\n' \
1024ed2b53f3SYifan Bian		'int main(void) { return 0; }\n' \
1025ed2b53f3SYifan Bian		| "${BUILD_CMD[@]}" -luring - 2> /dev/null; then
1026ed2b53f3SYifan Bian		echo "--with-ublk requires liburing and ublk_drv."
1027ed2b53f3SYifan Bian		echo "Please install then re-run this script."
1028ed2b53f3SYifan Bian		exit 1
1029ed2b53f3SYifan Bian	fi
1030ed2b53f3SYifan Bianfi
1031ed2b53f3SYifan Bian
10325cb18040SDarek Stojaczykif [[ "${CONFIG[ISCSI_INITIATOR]}" = "y" ]]; then
10335cb18040SDarek Stojaczyk	# Fedora installs libiscsi to /usr/lib64/iscsi for some reason.
10345cb18040SDarek Stojaczyk	if ! echo -e '#include <iscsi/iscsi.h>\n#include <iscsi/scsi-lowlevel.h>\n' \
10355cb18040SDarek Stojaczyk		'#if LIBISCSI_API_VERSION < 20150621\n' \
10365cb18040SDarek Stojaczyk		'#error\n' \
10375cb18040SDarek Stojaczyk		'#endif\n' \
10385cb18040SDarek Stojaczyk		'int main(void) { return 0; }\n' \
1039bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -L/usr/lib64/iscsi -liscsi - 2> /dev/null; then
1040bb0f78a2SMichal Berger		echo "--with-iscsi-initiator requires libiscsi with"
1041bb0f78a2SMichal Berger		echo "LIBISCSI_API_VERSION >= 20150621."
1042bb0f78a2SMichal Berger		echo "Please install then re-run this script."
10435cb18040SDarek Stojaczyk		exit 1
10445cb18040SDarek Stojaczyk	fi
10455cb18040SDarek Stojaczykfi
10465cb18040SDarek Stojaczyk
10472e283fcbS0xe0fif [[ "${CONFIG[DAOS]}" = "y" ]]; then
1048044bb175SDenis Barakthanov	daos_build_cmd=("${BUILD_CMD[@]}")
1049044bb175SDenis Barakthanov	if [[ -n "${CONFIG[DAOS_DIR]}" ]]; then
1050044bb175SDenis Barakthanov		daos_build_cmd+=(-I"${CONFIG[DAOS_DIR]}"/include -L"${CONFIG[DAOS_DIR]}"/lib64)
1051044bb175SDenis Barakthanov	fi
10522e283fcbS0xe0f	if ! echo -e '#include <daos.h>\n#include <daos_fs.h>\n' \
10532e283fcbS0xe0f		'int main(void) { return 0; }\n' \
1054044bb175SDenis Barakthanov		| "${daos_build_cmd[@]}" -lgurt -ldaos -ldaos_common -ldfs - 2> /dev/null; then
10552e283fcbS0xe0f		echo "--with-daos requires libdaos, libdaos_common, libdfs and libgurt"
10562e283fcbS0xe0f		echo "Please install then re-run this script."
10572e283fcbS0xe0f		exit 1
10582e283fcbS0xe0f	fi
10592e283fcbS0xe0ffi
10602e283fcbS0xe0f
10613674c1d3SDarek Stojaczykif [[ "${CONFIG[ASAN]}" = "y" ]]; then
10623674c1d3SDarek Stojaczyk	if ! echo -e 'int main(void) { return 0; }\n' \
1063bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -fsanitize=address - 2> /dev/null; then
1064bb0f78a2SMichal Berger		echo "--enable-asan requires libasan."
1065bb0f78a2SMichal Berger		echo "Please install then re-run this script."
10663674c1d3SDarek Stojaczyk		exit 1
10673674c1d3SDarek Stojaczyk	fi
10683674c1d3SDarek Stojaczykfi
10693674c1d3SDarek Stojaczyk
10703674c1d3SDarek Stojaczykif [[ "${CONFIG[UBSAN]}" = "y" ]]; then
10713674c1d3SDarek Stojaczyk	if ! echo -e 'int main(void) { return 0; }\n' \
1072bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -fsanitize=undefined - 2> /dev/null; then
1073bb0f78a2SMichal Berger		echo "--enable-ubsan requires libubsan."
1074bb0f78a2SMichal Berger		echo "Please install then re-run this script."
1075bb0f78a2SMichal Berger		echo "If installed, please check that the GCC version is at least 6.4"
1076bb0f78a2SMichal Berger		echo "and synchronize CC accordingly."
10773674c1d3SDarek Stojaczyk		exit 1
10783674c1d3SDarek Stojaczyk	fi
10793674c1d3SDarek Stojaczykfi
10803674c1d3SDarek Stojaczyk
10813674c1d3SDarek Stojaczykif [[ "${CONFIG[TSAN]}" = "y" ]]; then
10823674c1d3SDarek Stojaczyk	if ! echo -e 'int main(void) { return 0; }\n' \
1083bb0f78a2SMichal Berger		| "${BUILD_CMD[@]}" -fsanitize=thread - 2> /dev/null; then
1084bb0f78a2SMichal Berger		echo "--enable-tsan requires libtsan."
1085bb0f78a2SMichal Berger		echo "Please install then re-run this script."
10863674c1d3SDarek Stojaczyk		exit 1
10873674c1d3SDarek Stojaczyk	fi
10883674c1d3SDarek Stojaczykfi
10893674c1d3SDarek Stojaczyk
109043a3984cSJim Harrisif echo -e '#include <stdlib.h>\nint main(void) { arc4random(); return 0; }\n' \
109143a3984cSJim Harris	| "${BUILD_CMD[@]}" - 2> /dev/null; then
109243a3984cSJim Harris	CONFIG[HAVE_ARC4RANDOM]="y"
109343a3984cSJim Harrisfi
109443a3984cSJim Harris
1095634ac768SKrzysztof Karasif echo -e '#include <uuid/uuid.h>\nint main(void) { uuid_generate_sha1(NULL, NULL, NULL, 0); return 0; }\n' \
1096634ac768SKrzysztof Karas	| "${BUILD_CMD[@]}" - -luuid 2> /dev/null; then
1097634ac768SKrzysztof Karas	CONFIG[HAVE_UUID_GENERATE_SHA1]="y"
1098634ac768SKrzysztof Karasfi
1099634ac768SKrzysztof Karas
1100d1fee489SVitaliy Mysakif [[ "${CONFIG[OCF]}" = "y" ]]; then
1101d1fee489SVitaliy Mysak	# If OCF_PATH is a file, assume it is a library and use it to compile with
1102d1fee489SVitaliy Mysak	if [ -f ${CONFIG[OCF_PATH]} ]; then
1103d1fee489SVitaliy Mysak		CONFIG[CUSTOMOCF]=y
1104d1fee489SVitaliy Mysak	else
1105d1fee489SVitaliy Mysak		CONFIG[CUSTOMOCF]=n
1106d1fee489SVitaliy Mysak	fi
1107d1fee489SVitaliy Mysakfi
1108d1fee489SVitaliy Mysak
1109995d60f4SBen Walkerif [[ "${CONFIG[PGO_CAPTURE]}" = "y" && "${CONFIG[PGO_USE]}" = "y" ]]; then
1110995d60f4SBen Walker	echo "ERROR: --enable-pgo-capture and --enable-pgo-use are mutually exclusive."
1111995d60f4SBen Walker	exit 1
1112954728e9SBen Walkerelif [[ "${CONFIG[PGO_USE]}" = "y" ]]; then
1113954728e9SBen Walker	if [[ "$CC_TYPE" = "clang" ]]; then
1114954728e9SBen Walker		# For clang we need to run an extra step on gathered profiling data.
1115954728e9SBen Walker		echo "Generating suitable profile data"
1116954728e9SBen Walker		llvm-profdata merge -output=build/pgo/default.profdata build/pgo
1117954728e9SBen Walker	fi
1118995d60f4SBen Walkerfi
1119995d60f4SBen Walker
112087757389SSimon A. F. Lundif [[ "${CONFIG[URING]}" = "y" || "${CONFIG[XNVME]}" = "y" ]]; then
11218165bf71SBen Walker	if [[ -n "${CONFIG[URING_PATH]}" ]]; then
1122c9b4654bSTomasz Zawadzki		check_dir "${CONFIG[URING_PATH]}"
11234ccc9ea3SJim Harris	elif ! echo -e '#include <liburing.h>\nint main(void) { return 0; }\n' \
11244ccc9ea3SJim Harris		| "${BUILD_CMD[@]}" -luring - 2> /dev/null; then
11254ccc9ea3SJim Harris		echo "--with-uring requires liburing."
11264ccc9ea3SJim Harris		echo "Please build and install then re-run this script."
11274ccc9ea3SJim Harris		exit 1
11288165bf71SBen Walker	fi
1129958d196cSIndraneel M	# Support for Zoned devices is enabled by default for Uring bdev. Check appropriate support in kernel.
11308b840195SIndraneel M	if [[ "${CONFIG[URING_ZNS]}" = "y" ]]; then
11318b840195SIndraneel M		if ! echo -e '#include<linux/blkzoned.h>\nint main(void) { return BLK_ZONE_REP_CAPACITY; }\n' \
11328b840195SIndraneel M			| "${BUILD_CMD[@]}" -c - 2> /dev/null; then
1133958d196cSIndraneel M			echo "Disabling Zoned NS support in Uring! Requires blkzoned.h from kernel >= linux-5.9."
1134958d196cSIndraneel M			CONFIG[URING_ZNS]=n
1135958d196cSIndraneel M		fi
11368b840195SIndraneel M	fi
11378b840195SIndraneel Mfi
11388b840195SIndraneel M
11397fa15e28SXiaodong Liuif [[ "${CONFIG[FUSE]}" = "y" ]]; then
11407fa15e28SXiaodong Liu	if [[ ! -d /usr/include/fuse3 ]] && [[ ! -d /usr/local/include/fuse3 ]]; then
11417fa15e28SXiaodong Liu		echo "--with-fuse requires libfuse3."
11427fa15e28SXiaodong Liu		echo "Please install then re-run this script."
11437fa15e28SXiaodong Liu		exit 1
11447fa15e28SXiaodong Liu	fi
11457fa15e28SXiaodong Liufi
11467fa15e28SXiaodong Liu
114791e42257SJim Harrisif [ "${CONFIG[CET]}" = "y" ]; then
1148bb0f78a2SMichal Berger	if ! echo -e 'int main(void) { return 0; }\n' | "${BUILD_CMD[@]}" -fcf-protection - 2> /dev/null; then
1149bb0f78a2SMichal Berger		echo "--enable-cet requires compiler/linker that supports CET."
1150bb0f78a2SMichal Berger		echo "Please install then re-run this script."
115191e42257SJim Harris		exit 1
115291e42257SJim Harris	fi
115391e42257SJim Harrisfi
115491e42257SJim Harris
1155050565e5SJim Harrisif [[ "${CONFIG[FUZZER]}" = "y" && "$CC_TYPE" != "clang" ]]; then
1156050565e5SJim Harris	echo "--with-fuzzer requires setting CC and CXX to clang."
1157050565e5SJim Harris	exit 1
1158050565e5SJim Harrisfi
1159050565e5SJim Harris
1160dd2c08d2Spaul luseif [[ $arch == x86_64* ]] || [[ $arch == aarch64* ]]; then
1161dd2c08d2Spaul luse	CONFIG[ISAL]=y
1162dd2c08d2Spaul luse	# make sure the submodule is initialized
11639d2f6f86SJim Harris	if [ ! -f "$rootdir"/isa-l/autogen.sh ]; then
1164dd2c08d2Spaul luse		echo "ISA-L is required but was not found, please init the submodule with:"
11659d2f6f86SJim Harris		echo "  git submodule update --init"
1166dd2c08d2Spaul luse		echo "and then re-run this script."
11679d2f6f86SJim Harris		exit 1
11689d2f6f86SJim Harris	fi
1169dd2c08d2Spaul luse	# for x86 only, check the nasm version for ISA-L and IPSEC
1170dd2c08d2Spaul luse	if [[ $arch == x86_64* ]]; then
1171dd2c08d2Spaul luse		ver=$(nasm -v 2> /dev/null | awk '{print $3}' | awk -Fr '{print $1}')
1172dd2c08d2Spaul luse		if lt "$ver" 2.14; then
1173dd2c08d2Spaul luse			CONFIG[ISAL]=n
1174dd2c08d2Spaul luse			# IPSEC has nasm requirement and DPDK crypto relies on IPSEC
1175dd2c08d2Spaul luse			CONFIG[IPSEC_MB]=n
1176dd2c08d2Spaul luse			echo "WARNING: ISA-L & DPDK crypto cannot be used as nasm ver must be 2.14 or newer."
1177dd2c08d2Spaul luse		fi
1178dd2c08d2Spaul luse	fi
1179784b9d48SAlexey Marchuk	# check gas version on aarch64
1180784b9d48SAlexey Marchuk	if [[ $arch == aarch64* ]]; then
1181784b9d48SAlexey Marchuk		ver=$(as --version 2> /dev/null | awk 'NR==1{print $7}')
1182784b9d48SAlexey Marchuk		if lt "$ver" 2.24; then
1183784b9d48SAlexey Marchuk			# ISA-L, compression & crypto require gas version 2.24 or newer.
1184784b9d48SAlexey Marchuk			CONFIG[ISAL]=n
1185784b9d48SAlexey Marchuk			echo "Notice: ISA-L, compression & crypto require GAS version 2.24 or newer. Turning off default ISA-L and crypto features."
1186784b9d48SAlexey Marchuk		elif lt "$ver" 2.34; then
1187784b9d48SAlexey Marchuk			#For gas v2.24~v2.34, sve2 instructions are not supported. To workaround it, sve2 optimization should be disabled
1188784b9d48SAlexey Marchuk			ISAL_CRYPTO_OPTS+=("--disable-sve2")
1189784b9d48SAlexey Marchuk		fi
1190784b9d48SAlexey Marchuk	fi
1191dd2c08d2Spaul luseelse
1192dd2c08d2Spaul luse	# for PPC
1193dd2c08d2Spaul luse	CONFIG[ISAL]=n
1194dd2c08d2Spaul luse	echo "WARNING: ISA-L cannot be used due to architecture incompatibility."
1195dd2c08d2Spaul lusefi
11969d2f6f86SJim Harris
1197dd2c08d2Spaul luse# now either configure ISA-L or disable unavailable features
1198dd2c08d2Spaul luseif [[ "${CONFIG[ISAL]}" = "y" ]]; then
11999d2f6f86SJim Harris	cd $rootdir/isa-l
12009d2f6f86SJim Harris	ISAL_LOG=$rootdir/isa-l/spdk-isal.log
12019d2f6f86SJim Harris	if [[ -n "${CONFIG[CROSS_PREFIX]}" ]]; then
12029d2f6f86SJim Harris		ISAL_OPTS=("--host=${CONFIG[CROSS_PREFIX]}")
12039d2f6f86SJim Harris	else
12049d2f6f86SJim Harris		ISAL_OPTS=()
12059d2f6f86SJim Harris	fi
12069d2f6f86SJim Harris	echo -n "Configuring ISA-L (logfile: $ISAL_LOG)..."
12079d2f6f86SJim Harris	./autogen.sh &> $ISAL_LOG
12089d2f6f86SJim Harris	./configure CFLAGS="-fPIC -g -O2" "${ISAL_OPTS[@]}" --enable-shared=no >> $ISAL_LOG 2>&1
12099d2f6f86SJim Harris	echo "done."
12109d2f6f86SJim Harris	cd $rootdir
1211dd2c08d2Spaul luseelse
1212dd2c08d2Spaul luse	echo "Without ISA-L, there is no software support for crypto or compression,"
1213dd2c08d2Spaul luse	echo "so these features will be disabled."
1214dd2c08d2Spaul luse	CONFIG[CRYPTO]=n
121519e2dc38Spaul luse	CONFIG[VBDEV_COMPRESS]=n
1216976f8b09Spaul luse	CONFIG[DPDK_COMPRESSDEV]=n
12179d2f6f86SJim Harrisfi
12189d2f6f86SJim Harris
1219784b9d48SAlexey Marchuk# ISA-L-crypto complements ISA-L functionality, it is only enabled together with ISA-L
1220784b9d48SAlexey Marchukif [[ "${CONFIG[ISAL]}" = "y" ]]; then
1221784b9d48SAlexey Marchuk	if [ ! -f "$rootdir"/isa-l-crypto/autogen.sh ]; then
1222784b9d48SAlexey Marchuk		echo "ISA-L-crypto is required but was not found, please init the submodule with:"
1223784b9d48SAlexey Marchuk		echo "  git submodule update --init"
1224784b9d48SAlexey Marchuk		echo "and then re-run this script."
1225784b9d48SAlexey Marchuk		exit 1
1226784b9d48SAlexey Marchuk	fi
1227784b9d48SAlexey Marchuk
1228784b9d48SAlexey Marchuk	cd $rootdir/isa-l-crypto
1229784b9d48SAlexey Marchuk	ISAL_CRYPTO_LOG=$rootdir/isa-l-crypto/spdk-isal-crypto.log
1230784b9d48SAlexey Marchuk	if [[ -n "${CONFIG[CROSS_PREFIX]}" ]]; then
1231784b9d48SAlexey Marchuk		ISAL_CRYPTO_OPTS+=("--host=${CONFIG[CROSS_PREFIX]}")
1232784b9d48SAlexey Marchuk	fi
1233784b9d48SAlexey Marchuk	ISAL_CRYPTO_OPTS+=("--enable-shared=no")
1234784b9d48SAlexey Marchuk	echo -n "Configuring ISA-L-crypto (logfile: $ISAL_CRYPTO_LOG)..."
1235784b9d48SAlexey Marchuk	./autogen.sh &> $ISAL_CRYPTO_LOG
1236784b9d48SAlexey Marchuk	./configure CFLAGS="-fPIC -g -O2" "${ISAL_CRYPTO_OPTS[@]}" >> $ISAL_CRYPTO_LOG 2>&1
1237784b9d48SAlexey Marchuk	echo "done."
1238784b9d48SAlexey Marchuk	cd $rootdir
1239784b9d48SAlexey Marchuk	CONFIG[ISAL_CRYPTO]=y
1240784b9d48SAlexey Marchukelse
1241784b9d48SAlexey Marchuk	CONFIG[ISAL_CRYPTO]=n
1242784b9d48SAlexey Marchukfi
1243784b9d48SAlexey Marchuk
1244509241ceSKonrad Sztyberif [[ "${CONFIG[SMA]}" = "y" ]]; then
1245509241ceSKonrad Sztyber	if ! python3 -c 'import grpc; import grpc_tools' 2> /dev/null; then
1246509241ceSKonrad Sztyber		echo "--with-sma requires grpcio and grpcio-tools python packages."
1247509241ceSKonrad Sztyber		echo "Please install then re-run this script."
1248509241ceSKonrad Sztyber		exit 1
1249509241ceSKonrad Sztyber	fi
1250509241ceSKonrad Sztyberfi
1251509241ceSKonrad Sztyber
12522796687dSParameswaran Krishnamurthyif [[ "${CONFIG[AVAHI]}" = "y" ]]; then
12532796687dSParameswaran Krishnamurthy	if ! echo -e '#include <avahi-client/client.h>\n#include <avahi-common/malloc.h>\n' \
12542796687dSParameswaran Krishnamurthy		'int main(void) { return 0; }\n' \
12552796687dSParameswaran Krishnamurthy		| "${BUILD_CMD[@]}" -lavahi-client -lavahi-common - 2> /dev/null; then
12562796687dSParameswaran Krishnamurthy		echo "--with-avahi requires libavahi-client and libavahi-common."
12572796687dSParameswaran Krishnamurthy		echo "Please install then re-run this script."
12582796687dSParameswaran Krishnamurthy		exit 1
12592796687dSParameswaran Krishnamurthy	fi
12602796687dSParameswaran Krishnamurthyfi
12612796687dSParameswaran Krishnamurthy
1262*8247bd40SMarcin Spiewakif [[ -n ${CONFIG[MAX_LCORES]} ]]; then
1263*8247bd40SMarcin Spiewak	if [[ ! ${CONFIG[MAX_LCORES]} =~ ^[1-9][0-9]*$ ]] || ((CONFIG[MAX_LCORES] > 1024)); then
1264*8247bd40SMarcin Spiewak		echo "ERROR: Max number of lcores must be a decimal number in range [1..1024] (given: ${CONFIG[MAX_LCORES]})"
1265*8247bd40SMarcin Spiewak		exit 1
1266*8247bd40SMarcin Spiewak	fi
1267*8247bd40SMarcin Spiewakfi
1268*8247bd40SMarcin Spiewak
1269fcc38949SRui Chang# For ARM Neoverse-N1 platform, debug build needs gcc version newer than 8.4
1270fcc38949SRui Changif [[ "${CONFIG[DEBUG]}" = "y" && $arch = aarch64* && "$CC_TYPE" = "gcc" ]]; then
1271fcc38949SRui Chang	GCC_VERSION=$($CC -dumpfullversion)
1272fcc38949SRui Chang	PART_NUM=$(grep -i -m 1 "CPU part" /proc/cpuinfo | awk '{print $4}')
1273fcc38949SRui Chang
1274fcc38949SRui Chang	if [[ "$(printf '%s\n' "8.4.0" "$GCC_VERSION" | sort -V | head -n1)" != "8.4.0" ]]; then
1275fcc38949SRui Chang		if [[ $PART_NUM = 0xd0c ]]; then
1276fcc38949SRui Chang			echo "WARNING: For ARM Neoverse-N1 platform, debug build needs GCC version newer than 8.4."
1277fcc38949SRui Chang			echo "         Will work around this by using armv8.2-a+crypto as target architecture for now."
1278fcc38949SRui Chang			CONFIG[ARCH]=armv8.2-a+crypto
1279e8f84531SSunil Shahu		elif [[ $PART_NUM = 0x0b2 ]]; then
1280e8f84531SSunil Shahu			echo "WARNING: For ARM octeontx2 platform, debug build needs GCC version newer than 8.4."
1281e8f84531SSunil Shahu			echo "         Will work around this by using armv8.2-a+crypto as target architecture for now."
1282e8f84531SSunil Shahu			CONFIG[ARCH]=armv8.2-a+crypto
1283fcc38949SRui Chang		fi
1284fcc38949SRui Chang	fi
1285fcc38949SRui Changfi
1286fcc38949SRui Chang
128748f70f48SPawel Wodkowski# We are now ready to generate final configuration. But first do sanity
128848f70f48SPawel Wodkowski# check to see if all keys in CONFIG array have its reflection in CONFIG file.
1289bb0f78a2SMichal Bergerif (($(grep -cE "^\s*CONFIG_[[:alnum:]_]+=" "$rootdir/CONFIG") != ${#CONFIG[@]})); then
129048f70f48SPawel Wodkowski	echo ""
129148f70f48SPawel Wodkowski	echo "BUG: Some configuration options are not present in CONFIG file. Please update this file."
129248f70f48SPawel Wodkowski	echo "Missing options in CONFIG (+) file and in current config (-): "
129348f70f48SPawel Wodkowski	diff -u --label "CONFIG file" --label "CONFIG[@]" \
1294f8d6541dSMichal Berger		<(sed -r -e '/^[[:space:]]*$/d; /^[[:space:]]*#.*/d; s/(CONFIG_[[:alnum:]_]+)=.*/\1/g' CONFIG | sort) \
1295bb0f78a2SMichal Berger		<(printf "CONFIG_%s\n" "${!CONFIG[@]}" | sort)
129648f70f48SPawel Wodkowski	exit 1
129748f70f48SPawel Wodkowskifi
129848f70f48SPawel Wodkowski
129985bc2bbeSPawel Wodkowskiecho -n "Creating mk/config.mk..."
1300e62a3c65SSeth Howellcp -f $rootdir/CONFIG $rootdir/mk/config.mk
130151ab849bSJim HarrisARGS=$(echo "$@" | sed 's/ /\\ /g')
130251ab849bSJim Harrissed -i.bak -r "s#__CONFIGURE_OPTIONS__#${ARGS}#g" $rootdir/mk/config.mk
1303bb0f78a2SMichal Bergerfor key in "${!CONFIG[@]}"; do
1304f8d6541dSMichal Berger	sed -i.bak -r "s#[[:space:]]*CONFIG_${key}=.*#CONFIG_${key}\?=${CONFIG[$key]}#g" $rootdir/mk/config.mk
1305577df16aSPawel Wodkowskidone
1306577df16aSPawel Wodkowski# On FreeBSD sed -i 'SUFFIX' - SUFFIX is mandatory. So no way but to delete the backed file.
1307e62a3c65SSeth Howellrm -f $rootdir/mk/config.mk.bak
1308baa6eac0SDarek Stojaczykecho "done."
13099dd998cdSBen Walker
131008ec96ebSDaniel Verkamp# Environment variables
1311baa6eac0SDarek Stojaczykecho -n "Creating mk/cc.flags.mk..."
1312e62a3c65SSeth Howellrm -f $rootdir/mk/cc.flags.mk
1313e62a3c65SSeth Howell[ -n "$CFLAGS" ] && echo "CFLAGS?=$CFLAGS" > $rootdir/mk/cc.flags.mk
1314e62a3c65SSeth Howell[ -n "$CXXFLAGS" ] && echo "CXXFLAGS?=$CXXFLAGS" >> $rootdir/mk/cc.flags.mk
1315e62a3c65SSeth Howell[ -n "$LDFLAGS" ] && echo "LDFLAGS?=$LDFLAGS" >> $rootdir/mk/cc.flags.mk
1316e62a3c65SSeth Howell[ -n "$DESTDIR" ] && echo "DESTDIR?=$DESTDIR" >> $rootdir/mk/cc.flags.mk
13170b56a5b4SJim Harrisecho "done."
131885bc2bbeSPawel Wodkowski
1319db3ebfe6SMichal Berger# Create .sh with build config for easy sourcing|lookup during the tests.
1320db3ebfe6SMichal Bergerfor conf in "${!CONFIG[@]}"; do
1321db3ebfe6SMichal Berger	echo "CONFIG_$conf=${CONFIG[$conf]}"
1322db3ebfe6SMichal Bergerdone > "$rootdir/test/common/build_config.sh"
1323db3ebfe6SMichal Berger
13245a764955SMichal Bergerif [[ $sys_name == "FreeBSD" ]]; then
1325870ce250SPaul Luse	echo "Type 'gmake' to build."
1326870ce250SPaul Luseelse
13270b56a5b4SJim Harris	echo "Type 'make' to build."
1328870ce250SPaul Lusefi
13299dd998cdSBen Walker
13309dd998cdSBen Walkerexit 0
1331