xref: /spdk/configure (revision b30d57cdad6d2bc75cc1e4e2ebbcebcb0d98dcfa)
19dd998cdSBen Walker#!/usr/bin/env bash
29dd998cdSBen Walker
39dd998cdSBen Walkerset -e
49dd998cdSBen Walker
514bbde7bSPawel Wodkowskitrap 'echo -e "\n\nConfiguration failed\n\n" >&2' ERR
614bbde7bSPawel Wodkowski
7e62a3c65SSeth Howellrootdir=$(readlink -f $(dirname $0))
865ed6034SMichal Bergersource "$rootdir/scripts/common.sh"
9e62a3c65SSeth Howell
109dd998cdSBen Walkerfunction usage()
119dd998cdSBen Walker{
129dd998cdSBen Walker	echo "'configure' configures SPDK to compile on supported platforms."
139dd998cdSBen Walker	echo ""
149dd998cdSBen Walker	echo "Usage: ./configure [OPTION]..."
159dd998cdSBen Walker	echo ""
169dd998cdSBen Walker	echo "Defaults for the options are specified in brackets."
179dd998cdSBen Walker	echo ""
189dd998cdSBen Walker	echo "General:"
199dd998cdSBen Walker	echo " -h, --help                Display this help and exit"
202e7fe8e8SDaniel Verkamp	echo ""
212e7fe8e8SDaniel Verkamp	echo " --prefix=path             Configure installation prefix (default: /usr/local)"
220e6ddfd6SBen Walker	echo " --target-arch=arch        Target build architecture. Must be a valid GNU arch. Default: native"
232e7fe8e8SDaniel Verkamp	echo ""
243def834cSAmelia Blachuciak	echo " --cross-prefix=prefix     Prefix for cross compilation (default: none)"
253def834cSAmelia Blachuciak	echo "                           example: aarch64-linux-gnu"
263def834cSAmelia Blachuciak	echo ""
279dd998cdSBen Walker	echo " --enable-debug            Configure for debug builds"
289dd998cdSBen Walker	echo " --enable-werror           Treat compiler warnings as errors"
299dd998cdSBen Walker	echo " --enable-asan             Enable address sanitizer"
309dd998cdSBen Walker	echo " --enable-ubsan            Enable undefined behavior sanitizer"
319dd998cdSBen Walker	echo " --enable-coverage         Enable code coverage tracking"
326d6d1161SDaniel Verkamp	echo " --enable-lto              Enable link-time optimization"
33995d60f4SBen Walker	echo " --enable-pgo-capture      Enable generation of profile guided optimization data"
34995d60f4SBen Walker	echo " --enable-pgo-use          Use previously captured profile guided optimization data"
359fcb1cb0STomasz Zawadzki	echo " --disable-tests           Disable building of functional tests"
369fcb1cb0STomasz Zawadzki	echo " --disable-unit-tests      Disable building of unit tests"
379b2c6452SJacek Kalwas	echo " --disable-examples        Disable building of examples"
389dd998cdSBen Walker	echo ""
399dd998cdSBen Walker	echo "Specifying Dependencies:"
409dd998cdSBen Walker	echo "--with-DEPENDENCY[=path]   Use the given dependency. Optionally, provide the"
419dd998cdSBen Walker	echo "                           path."
429dd998cdSBen Walker	echo "--without-DEPENDENCY       Do not link to the given dependency. This may"
439dd998cdSBen Walker	echo "                           disable features and components."
449dd998cdSBen Walker	echo ""
459dd998cdSBen Walker	echo "Valid dependencies are listed below."
46161c88a0SDarek Stojaczyk	echo " dpdk                      Build against a custom dpdk version. By default, the dpdk"
47161c88a0SDarek Stojaczyk	echo "                           submodule in spdk tree will be used."
489dd998cdSBen Walker	echo "                           example: /usr/share/dpdk/x86_64-default-linuxapp-gcc"
4906cc8045SBen Walker	echo " env                       Use an alternate environment implementation instead of DPDK."
5006cc8045SBen Walker	echo "                           Implies --without-dpdk."
51161c88a0SDarek Stojaczyk	echo " igb-uio-driver            Build DPDK's igb-uio driver."
52161c88a0SDarek Stojaczyk	echo "                           Required on some systems to use qat devices. This flag is"
53161c88a0SDarek Stojaczyk	echo "                           effective only with the default dpdk submodule."
5406cc8045SBen Walker	echo "                           No path required"
55e58e9fbdSpaul luse	echo " idxd                      Build the IDXD library and accel framework plug-in module."
56e58e9fbdSpaul luse	echo "                           Disabled while experimental. Only built for x86 when enabled."
57161c88a0SDarek Stojaczyk	echo " crypto                    Build vbdev crypto module."
5806cc8045SBen Walker	echo "                           No path required."
59161c88a0SDarek Stojaczyk	echo " fio                       Build fio_plugin."
60c3329b52SMichal Berger	echo "                           default: /usr/src/fio"
61161c88a0SDarek Stojaczyk	echo " vhost                     Build vhost target. Enabled by default."
6235260f2bSDaniel Verkamp	echo "                           No path required."
63161c88a0SDarek Stojaczyk	echo " virtio                    Build vhost initiator and virtio-pci bdev modules."
647dee96ceSDariusz Stojaczyk	echo "                           No path required."
65*b30d57cdSChangpeng Liu	echo " vfio-user                 Build NVMf custom vfio-user target."
66*b30d57cdSChangpeng Liu	echo "                           No path required."
67161c88a0SDarek Stojaczyk	echo " pmdk                      Build persistent memory bdev."
68218dcd84SJim Harris	echo "                           example: /usr/share/pmdk"
69161c88a0SDarek Stojaczyk	echo " reduce                    Build vbdev compression module."
7097022803SJim Harris	echo "                           No path required."
71161c88a0SDarek Stojaczyk	echo " rbd                       Build Ceph RBD bdev module."
729dd998cdSBen Walker	echo "                           No path required."
73161c88a0SDarek Stojaczyk	echo " rdma                      Build RDMA transport for NVMf target and initiator."
74daee62a0SAlexey Marchuk	echo "                           Accepts optional RDMA provider name. Can be \"verbs\" or \"mlx5_dv\"."
75daee62a0SAlexey Marchuk	echo "                           If no provider specified, \"verbs\" provider is used by default."
76ed56a3d4SAnil Veerabhadrappa	echo " fc                        Build FC transport for NVMf target."
77ed56a3d4SAnil Veerabhadrappa	echo "                           If an argument is provided, it is considered a directory containing"
78ed56a3d4SAnil Veerabhadrappa	echo "                           libufc.a and fc_lld.h. Otherwise the regular system paths will"
79ed56a3d4SAnil Veerabhadrappa	echo "                           be searched."
80161c88a0SDarek Stojaczyk	echo " shared                    Build spdk shared libraries."
810923734cSLance Hartmann	echo "                           No path required."
82161c88a0SDarek Stojaczyk	echo " iscsi-initiator           Build with iscsi bdev module."
832af15344SJim Harris	echo "                           No path required."
845712088aSRoman Sudarikov	echo " vtune                     Required to profile I/O under Intel VTune Amplifier XE."
855712088aSRoman Sudarikov	echo "                           example: /opt/intel/vtune_amplifier_xe_version"
86161c88a0SDarek Stojaczyk	echo " ocf                       Build OCF library and bdev module."
87d1fee489SVitaliy Mysak	echo "                           If argument is directory, interpret it as root of OCF repo"
88d1fee489SVitaliy Mysak	echo "                           If argument is file, interpret it as compiled OCF lib"
8998d60de6SPiotr Pelplinski	echo "                           If no argument is specified, OCF git submodule is used by default"
90d1fee489SVitaliy Mysak	echo "                           example: /usr/src/ocf/"
918cad9cc1SRichael Zhuang	echo " isal                      Build with ISA-L. Enabled by default on x86 and aarch64 architectures."
92552e21ccSZiye Yang	echo "                           No path required."
93465f4c12SZiye Yang	echo " uring                     Build I/O uring bdev or socket module."
94161c88a0SDarek Stojaczyk	echo "                           If an argument is provided, it is considered a directory containing"
95161c88a0SDarek Stojaczyk	echo "                           liburing.a and io_uring.h. Otherwise the regular system paths will"
96161c88a0SDarek Stojaczyk	echo "                           be searched."
977fa15e28SXiaodong Liu	echo " fuse                      Build FUSE components for mounting a blobfs filesystem."
987fa15e28SXiaodong Liu	echo "                           No path required."
99805d9942STomasz Kulasek	echo " nvme-cuse                 Build NVMe driver with support for CUSE-based character devices."
100805d9942STomasz Kulasek	echo "                           No path required."
10173763d40SArtur Paszkiewicz	echo " raid5                     Build with bdev_raid module RAID5 support."
10273763d40SArtur Paszkiewicz	echo "                           No path required."
1039dd998cdSBen Walker	echo ""
10408ec96ebSDaniel Verkamp	echo "Environment variables:"
10508ec96ebSDaniel Verkamp	echo ""
10673439e6fSBen Walker	echo "CC                         C compiler"
10708ec96ebSDaniel Verkamp	echo "CFLAGS                     C compiler flags"
10873439e6fSBen Walker	echo "CXX                        C++ compiler"
10908ec96ebSDaniel Verkamp	echo "CXXFLAGS                   C++ compiler flags"
11073439e6fSBen Walker	echo "LD                         Linker"
11108ec96ebSDaniel Verkamp	echo "LDFLAGS                    Linker flags"
11208ec96ebSDaniel Verkamp	echo "DESTDIR                    Destination for 'make install'"
11308ec96ebSDaniel Verkamp	echo ""
1149dd998cdSBen Walker}
1159dd998cdSBen Walker
116577df16aSPawel Wodkowski# Load default values
117577df16aSPawel Wodkowski# Convert config to sourcable configuration file
118e62a3c65SSeth Howellsed -r 's/CONFIG_([[:alnum:]_]+)=(.*)/CONFIG[\1]=\2/g' $rootdir/CONFIG > $rootdir/CONFIG.sh
119577df16aSPawel Wodkowskideclare -A CONFIG
120e62a3c65SSeth Howellsource $rootdir/CONFIG.sh
121e62a3c65SSeth Howellrm $rootdir/CONFIG.sh
122577df16aSPawel Wodkowski
1234d2e26d8STomasz Zawadzkifor i in "$@"; do
1244d2e26d8STomasz Zawadzki	case "$i" in
1254d2e26d8STomasz Zawadzki		--cross-prefix=*)
1264d2e26d8STomasz Zawadzki			CONFIG[CROSS_PREFIX]="${i#*=}"
1274d2e26d8STomasz Zawadzki			;;
1284d2e26d8STomasz Zawadzki		--enable-lto)
1294d2e26d8STomasz Zawadzki			CONFIG[LTO]=y
1304d2e26d8STomasz Zawadzki			;;
1314d2e26d8STomasz Zawadzki		--disable-lto)
1324d2e26d8STomasz Zawadzki			CONFIG[LTO]=n
1334d2e26d8STomasz Zawadzki			;;
1344d2e26d8STomasz Zawadzki	esac
1354d2e26d8STomasz Zawadzkidone
1364d2e26d8STomasz Zawadzki
137873c8748STomasz Kulasek# Detect the compiler toolchain
138873c8748STomasz Kulasek$rootdir/scripts/detect_cc.sh --cc="$CC" --cxx="$CXX" --lto="${CONFIG[LTO]}" --ld="$LD" --cross-prefix="${CONFIG[CROSS_PREFIX]}"  > $rootdir/mk/cc.mk
139873c8748STomasz Kulasek
14051d69a7fSJonathan RichardsonCC=$(cat $rootdir/mk/cc.mk | grep "DEFAULT_CC=" | sed s/DEFAULT_CC=//)
141873c8748STomasz KulasekCC_TYPE=$(cat $rootdir/mk/cc.mk | grep "CC_TYPE=" | cut -d "=" -f 2)
142873c8748STomasz Kulasek
143873c8748STomasz Kulasekarch=$($CC -dumpmachine)
1445a764955SMichal Bergersys_name=$(uname -s)
145873c8748STomasz Kulasek
146873c8748STomasz Kulasek# Sanitize default configuration. All parameters set by user explicit should fail
147873c8748STomasz Kulasek# Force no ISA-L if non-x86 or non-aarch64 architecture
148873c8748STomasz Kulasekif [[ "${CONFIG[ISAL]}" = "y" ]]; then
149873c8748STomasz Kulasek	if [[ $arch != x86_64* ]] && [[ $arch != aarch64* ]]; then
150873c8748STomasz Kulasek		CONFIG[ISAL]=n
151873c8748STomasz Kulasek		echo "Notice: ISA-L not supported for ${arch}. Turning off default feature."
152873c8748STomasz Kulasek	fi
153873c8748STomasz Kulasekfi
154873c8748STomasz Kulasek
1555a764955SMichal Bergerif [[ $sys_name == "FreeBSD" ]]; then
156873c8748STomasz Kulasek	# Vhost, rte_vhost library and virtio are only supported on Linux.
157873c8748STomasz Kulasek	CONFIG[VHOST]="n"
158873c8748STomasz Kulasek	CONFIG[VIRTIO]="n"
159873c8748STomasz Kulasek	echo "Notice: Vhost, rte_vhost library and virtio are only supported on Linux. Turning off default feature."
160873c8748STomasz Kulasekfi
161873c8748STomasz Kulasek
162325010bfSRichael Zhuang#check nasm only on x86
163325010bfSRichael Zhuangif [[ $arch == x86_64* ]]; then
16465ed6034SMichal Berger	ver=$(nasm -v 2>/dev/null | awk '{print $3}')
16565ed6034SMichal Berger	if lt "$ver" 2.14; then
16635e54647STomasz Zawadzki		# ISA-L, compression & crypto require NASM version 2.14 or newer.
167873c8748STomasz Kulasek		CONFIG[ISAL]=n
168873c8748STomasz Kulasek		CONFIG[CRYPTO]=n
169873c8748STomasz Kulasek		CONFIG[IPSEC_MB]=n
170873c8748STomasz Kulasek		CONFIG[REDUCE]=n
171873c8748STomasz Kulasek		HAVE_NASM=n
17235e54647STomasz Zawadzki		echo "Notice: ISA-L, compression & crypto require NASM version 2.14 or newer. Turning off default ISA-L and crypto features."
173873c8748STomasz Kulasek	else
174873c8748STomasz Kulasek		HAVE_NASM=y
175873c8748STomasz Kulasek	fi
176325010bfSRichael Zhuangfi
177873c8748STomasz Kulasek
1781723a800SGangCaofunction check_dir() {
1791723a800SGangCao	arg="$1"
1801723a800SGangCao	dir="${arg#*=}"
1811723a800SGangCao	if [ ! -d "$dir" ]; then
1821723a800SGangCao		echo "$arg: directory not found"
1831723a800SGangCao		exit 1
1841723a800SGangCao	fi
1851723a800SGangCao}
1861723a800SGangCao
1879dd998cdSBen Walkerfor i in "$@"; do
1889dd998cdSBen Walker	case "$i" in
1899dd998cdSBen Walker		-h|--help)
1909dd998cdSBen Walker			usage
1919dd998cdSBen Walker			exit 0
1929dd998cdSBen Walker			;;
1934d2e26d8STomasz Zawadzki		--cross-prefix=*) ;&
1944d2e26d8STomasz Zawadzki		--enable-lto) ;&
1954d2e26d8STomasz Zawadzki		--disable-lto)
1964d2e26d8STomasz Zawadzki			# Options handled before detecting CC.
1974d2e26d8STomasz Zawadzki			;;
1982e7fe8e8SDaniel Verkamp		--prefix=*)
199577df16aSPawel Wodkowski			CONFIG[PREFIX]="${i#*=}"
2002e7fe8e8SDaniel Verkamp			;;
2010e6ddfd6SBen Walker		--target-arch=*)
2020e6ddfd6SBen Walker			CONFIG[ARCH]="${i#*=}"
2030e6ddfd6SBen Walker			;;
2049dd998cdSBen Walker		--enable-debug)
205577df16aSPawel Wodkowski			CONFIG[DEBUG]=y
2069dd998cdSBen Walker			;;
2079dd998cdSBen Walker		--disable-debug)
208577df16aSPawel Wodkowski			CONFIG[DEBUG]=n
2099dd998cdSBen Walker			;;
2109dd998cdSBen Walker		--enable-asan)
211577df16aSPawel Wodkowski			CONFIG[ASAN]=y
2129dd998cdSBen Walker			;;
2139dd998cdSBen Walker		--disable-asan)
214577df16aSPawel Wodkowski			CONFIG[ASAN]=n
2159dd998cdSBen Walker			;;
2169dd998cdSBen Walker		--enable-ubsan)
217577df16aSPawel Wodkowski			CONFIG[UBSAN]=y
2189dd998cdSBen Walker			;;
2199dd998cdSBen Walker		--disable-ubsan)
220577df16aSPawel Wodkowski			CONFIG[UBSAN]=n
2219dd998cdSBen Walker			;;
222830912e2SBen Walker		--enable-tsan)
223577df16aSPawel Wodkowski			CONFIG[TSAN]=y
224830912e2SBen Walker			;;
225830912e2SBen Walker		--disable-tsan)
226577df16aSPawel Wodkowski			CONFIG[TSAN]=n
227830912e2SBen Walker			;;
2289dd998cdSBen Walker		--enable-coverage)
229577df16aSPawel Wodkowski			CONFIG[COVERAGE]=y
2309dd998cdSBen Walker			;;
2319dd998cdSBen Walker		--disable-coverage)
232577df16aSPawel Wodkowski			CONFIG[COVERAGE]=n
2339dd998cdSBen Walker			;;
234995d60f4SBen Walker		--enable-pgo-capture)
235995d60f4SBen Walker			CONFIG[PGO_CAPTURE]=y
236995d60f4SBen Walker			;;
237995d60f4SBen Walker		--disable-pgo-capture)
238995d60f4SBen Walker			CONFIG[PGO_CAPTURE]=n
239995d60f4SBen Walker			;;
240995d60f4SBen Walker		--enable-pgo-use)
241995d60f4SBen Walker			CONFIG[PGO_USE]=y
242995d60f4SBen Walker			;;
243995d60f4SBen Walker		--disable-pgo-use)
244995d60f4SBen Walker			CONFIG[PGO_USE]=n
245995d60f4SBen Walker			;;
2469022a59eSDaniel Verkamp		--enable-tests)
247577df16aSPawel Wodkowski			CONFIG[TESTS]=y
2489022a59eSDaniel Verkamp			;;
2499022a59eSDaniel Verkamp		--disable-tests)
250577df16aSPawel Wodkowski			CONFIG[TESTS]=n
2519022a59eSDaniel Verkamp			;;
2529fcb1cb0STomasz Zawadzki		--enable-unit-tests)
2539fcb1cb0STomasz Zawadzki			CONFIG[UNIT_TESTS]=y
2549fcb1cb0STomasz Zawadzki			;;
2559fcb1cb0STomasz Zawadzki		--disable-unit-tests)
2569fcb1cb0STomasz Zawadzki			CONFIG[UNIT_TESTS]=n
2579fcb1cb0STomasz Zawadzki			;;
2589b2c6452SJacek Kalwas		--enable-examples)
2599b2c6452SJacek Kalwas			CONFIG[EXAMPLES]=y
2609b2c6452SJacek Kalwas			;;
2619b2c6452SJacek Kalwas		--disable-examples)
2629b2c6452SJacek Kalwas			CONFIG[EXAMPLES]=n
2639b2c6452SJacek Kalwas			;;
2649dd998cdSBen Walker		--enable-werror)
265577df16aSPawel Wodkowski			CONFIG[WERROR]=y
2669dd998cdSBen Walker			;;
2679dd998cdSBen Walker		--disable-werror)
268577df16aSPawel Wodkowski			CONFIG[WERROR]=n
2699dd998cdSBen Walker			;;
27006cc8045SBen Walker		--with-dpdk=*)
27106cc8045SBen Walker			check_dir "$i"
27206cc8045SBen Walker			CONFIG[DPDK_DIR]=$(readlink -f ${i#*=})
27306cc8045SBen Walker			;;
27406cc8045SBen Walker		--without-dpdk)
27506cc8045SBen Walker			CONFIG[DPDK_DIR]=
27606cc8045SBen Walker			;;
2779dd998cdSBen Walker		--with-env=*)
278577df16aSPawel Wodkowski			CONFIG[ENV]="${i#*=}"
2799dd998cdSBen Walker			;;
2809dd998cdSBen Walker		--with-rbd)
281577df16aSPawel Wodkowski			CONFIG[RBD]=y
2829dd998cdSBen Walker			;;
2839dd998cdSBen Walker		--without-rbd)
284577df16aSPawel Wodkowski			CONFIG[RBD]=n
2859dd998cdSBen Walker			;;
286daee62a0SAlexey Marchuk		--with-rdma=*)
287daee62a0SAlexey Marchuk			CONFIG[RDMA]=y
288daee62a0SAlexey Marchuk			CONFIG[RDMA_PROV]=${i#*=}
289daee62a0SAlexey Marchuk			;;
2909dd998cdSBen Walker		--with-rdma)
291577df16aSPawel Wodkowski			CONFIG[RDMA]=y
292daee62a0SAlexey Marchuk			CONFIG[RDMA_PROV]="verbs"
2939dd998cdSBen Walker			;;
2949dd998cdSBen Walker		--without-rdma)
295577df16aSPawel Wodkowski			CONFIG[RDMA]=n
2969dd998cdSBen Walker			;;
297ed56a3d4SAnil Veerabhadrappa		--with-fc=*)
298ed56a3d4SAnil Veerabhadrappa			CONFIG[FC]=y
299ed56a3d4SAnil Veerabhadrappa			CONFIG[FC_PATH]=$(readlink -f ${i#*=})
300ed56a3d4SAnil Veerabhadrappa			;;
301ed56a3d4SAnil Veerabhadrappa		--with-fc)
302ed56a3d4SAnil Veerabhadrappa			CONFIG[FC]=y
303ed56a3d4SAnil Veerabhadrappa			CONFIG[FC_PATH]=
304ed56a3d4SAnil Veerabhadrappa			;;
305ed56a3d4SAnil Veerabhadrappa		--without-fc)
306ed56a3d4SAnil Veerabhadrappa			CONFIG[FC]=n
307ed56a3d4SAnil Veerabhadrappa			CONFIG[FC_PATH]=
308ed56a3d4SAnil Veerabhadrappa			;;
3090923734cSLance Hartmann		--with-shared)
310577df16aSPawel Wodkowski			CONFIG[SHARED]=y
3110923734cSLance Hartmann			;;
3120923734cSLance Hartmann		--without-shared)
313577df16aSPawel Wodkowski			CONFIG[SHARED]=n
3140923734cSLance Hartmann			;;
3152af15344SJim Harris		--with-iscsi-initiator)
316577df16aSPawel Wodkowski			CONFIG[ISCSI_INITIATOR]=y
3172af15344SJim Harris			;;
3182af15344SJim Harris		--without-iscsi-initiator)
319577df16aSPawel Wodkowski			CONFIG[ISCSI_INITIATOR]=n
3202af15344SJim Harris			;;
3216118b853SDaniel Verkamp		--with-crypto)
322577df16aSPawel Wodkowski			CONFIG[CRYPTO]=y
3236118b853SDaniel Verkamp			;;
3246118b853SDaniel Verkamp		--without-crypto)
325577df16aSPawel Wodkowski			CONFIG[CRYPTO]=n
3266118b853SDaniel Verkamp			;;
32735260f2bSDaniel Verkamp		--with-vhost)
328577df16aSPawel Wodkowski			CONFIG[VHOST]=y
32935260f2bSDaniel Verkamp			;;
33035260f2bSDaniel Verkamp		--without-vhost)
331577df16aSPawel Wodkowski			CONFIG[VHOST]=n
33235260f2bSDaniel Verkamp			;;
3337dee96ceSDariusz Stojaczyk		--with-virtio)
334577df16aSPawel Wodkowski			CONFIG[VIRTIO]=y
3357dee96ceSDariusz Stojaczyk			;;
3367dee96ceSDariusz Stojaczyk		--without-virtio)
337577df16aSPawel Wodkowski			CONFIG[VIRTIO]=n
3387dee96ceSDariusz Stojaczyk			;;
339*b30d57cdSChangpeng Liu		--with-vfio-user)
340*b30d57cdSChangpeng Liu			CONFIG[VFIO_USER]=y
341*b30d57cdSChangpeng Liu			;;
342*b30d57cdSChangpeng Liu		--without-vfio-user)
343*b30d57cdSChangpeng Liu			CONFIG[VFIO_USER]=n
344*b30d57cdSChangpeng Liu			;;
345218dcd84SJim Harris		--with-pmdk)
346577df16aSPawel Wodkowski			CONFIG[PMDK]=y
347577df16aSPawel Wodkowski			CONFIG[PMDK_DIR]=""
348fca11f15SPiotr Pelplinski			;;
349218dcd84SJim Harris		--with-pmdk=*)
350577df16aSPawel Wodkowski			CONFIG[PMDK]=y
3511723a800SGangCao			check_dir "$i"
352577df16aSPawel Wodkowski			CONFIG[PMDK_DIR]=$(readlink -f ${i#*=})
353fca11f15SPiotr Pelplinski			;;
354218dcd84SJim Harris		--without-pmdk)
355577df16aSPawel Wodkowski			CONFIG[PMDK]=n
356fca11f15SPiotr Pelplinski			;;
35797022803SJim Harris		--with-reduce)
35897022803SJim Harris			CONFIG[REDUCE]=y
35997022803SJim Harris			;;
36097022803SJim Harris		--without-reduce)
36197022803SJim Harris			CONFIG[REDUCE]=n
36297022803SJim Harris			;;
363c3329b52SMichal Berger		--with-fio) ;&
3649dd998cdSBen Walker		--with-fio=*)
365c3329b52SMichal Berger			if [[ ${i#*=} != "$i" ]]; then
366c3329b52SMichal Berger				CONFIG[FIO_SOURCE_DIR]=$(readlink -f "${i#*=}")
367c3329b52SMichal Berger			fi
368c3329b52SMichal Berger			check_dir "--with-fio=${CONFIG[FIO_SOURCE_DIR]}"
369577df16aSPawel Wodkowski			CONFIG[FIO_PLUGIN]=y
3709dd998cdSBen Walker			;;
3719dd998cdSBen Walker		--without-fio)
372577df16aSPawel Wodkowski			CONFIG[FIO_PLUGIN]=n
3739dd998cdSBen Walker			;;
3745712088aSRoman Sudarikov		--with-vtune=*)
3751723a800SGangCao			check_dir "$i"
376577df16aSPawel Wodkowski			CONFIG[VTUNE_DIR]="${i#*=}"
377577df16aSPawel Wodkowski			CONFIG[VTUNE]=y
3785712088aSRoman Sudarikov			;;
3795712088aSRoman Sudarikov		--without-vtune)
380577df16aSPawel Wodkowski			CONFIG[VTUNE_DIR]=
381577df16aSPawel Wodkowski			CONFIG[VTUNE]=n
3825712088aSRoman Sudarikov			;;
3839abf7e8fSSeth Howell		--with-igb-uio-driver)
3849abf7e8fSSeth Howell			CONFIG[IGB_UIO_DRIVER]=y
3859abf7e8fSSeth Howell			;;
3869abf7e8fSSeth Howell		--without-igb-uio-driver)
3879abf7e8fSSeth Howell			CONFIG[IGB_UIO_DRIVER]=n
3889abf7e8fSSeth Howell			;;
38998d60de6SPiotr Pelplinski		--with-ocf)
39098d60de6SPiotr Pelplinski			CONFIG[OCF]=y
39198d60de6SPiotr Pelplinski			CONFIG[OCF_PATH]=$(readlink -f "./ocf")
39298d60de6SPiotr Pelplinski			;;
393d1fee489SVitaliy Mysak		--with-ocf=*)
394d1fee489SVitaliy Mysak			CONFIG[OCF]=y
395d1fee489SVitaliy Mysak			CONFIG[OCF_PATH]=$(readlink -f ${i#*=})
396d1fee489SVitaliy Mysak			;;
397d1fee489SVitaliy Mysak		--without-ocf)
398d1fee489SVitaliy Mysak			CONFIG[OCF]=n
399d1fee489SVitaliy Mysak			CONFIG[OCF_PATH]=
400d1fee489SVitaliy Mysak			;;
401552e21ccSZiye Yang		--with-isal)
402552e21ccSZiye Yang			CONFIG[ISAL]=y
403552e21ccSZiye Yang			;;
404552e21ccSZiye Yang		--without-isal)
405552e21ccSZiye Yang			CONFIG[ISAL]=n
406552e21ccSZiye Yang			;;
4078165bf71SBen Walker		--with-uring=*)
4088165bf71SBen Walker			CONFIG[URING]=y
4098165bf71SBen Walker			CONFIG[URING_PATH]=$(readlink -f ${i#*=})
4108165bf71SBen Walker			;;
4118165bf71SBen Walker		--with-uring)
4128165bf71SBen Walker			CONFIG[URING]=y
4138165bf71SBen Walker			CONFIG[URING_PATH]=
4148165bf71SBen Walker			;;
4158165bf71SBen Walker		--without-uring)
4168165bf71SBen Walker			CONFIG[URING]=n
4178165bf71SBen Walker			CONFIG[URING_PATH]=
4188165bf71SBen Walker			;;
4197fa15e28SXiaodong Liu		--with-fuse)
4207fa15e28SXiaodong Liu			CONFIG[FUSE]=y
4217fa15e28SXiaodong Liu			;;
4227fa15e28SXiaodong Liu		--without-fuse)
4237fa15e28SXiaodong Liu			CONFIG[FUSE]=n
4247fa15e28SXiaodong Liu			;;
425805d9942STomasz Kulasek		--with-nvme-cuse)
426805d9942STomasz Kulasek			CONFIG[NVME_CUSE]=y
427805d9942STomasz Kulasek			;;
428805d9942STomasz Kulasek		--without-nvme-cuse)
429805d9942STomasz Kulasek			CONFIG[NVME_CUSE]=n
430805d9942STomasz Kulasek			;;
43173763d40SArtur Paszkiewicz		--with-raid5)
43273763d40SArtur Paszkiewicz			CONFIG[RAID5]=y
43373763d40SArtur Paszkiewicz			;;
43473763d40SArtur Paszkiewicz		--without-raid5)
43573763d40SArtur Paszkiewicz			CONFIG[RAID5]=n
43673763d40SArtur Paszkiewicz			;;
437e58e9fbdSpaul luse		--with-idxd)
438e58e9fbdSpaul luse			CONFIG[IDXD]=y
439e58e9fbdSpaul luse			;;
440e58e9fbdSpaul luse		--without-idxd)
441e58e9fbdSpaul luse			CONFIG[IDXD]=n
442e58e9fbdSpaul luse			;;
4439dd998cdSBen Walker		--)
4449dd998cdSBen Walker			break
4459dd998cdSBen Walker			;;
4469dd998cdSBen Walker		*)
4479dd998cdSBen Walker			echo "Unrecognized option $i"
4489dd998cdSBen Walker			usage
4499dd998cdSBen Walker			exit 1
4509dd998cdSBen Walker	esac
4519dd998cdSBen Walkerdone
4529dd998cdSBen Walker
453131c9aadSAlexey Marchukif [[ $arch == x86_64* ]]; then
45400dd9e85SSeth Howell	BUILD_CMD=($CC -o /dev/null -x c $CPPFLAGS $CFLAGS $LDFLAGS -march=native)
455131c9aadSAlexey Marchukelse
456131c9aadSAlexey Marchuk	BUILD_CMD=($CC -o /dev/null -x c $CPPFLAGS $CFLAGS $LDFLAGS)
457131c9aadSAlexey Marchukfi
4586c23a6f4SMichal BergerBUILD_CMD+=(-I/usr/local/include -L/usr/local/lib)
45973439e6fSBen Walker
460*b30d57cdSChangpeng Liufunction set_os_id_version() {
461*b30d57cdSChangpeng Liu	if [[ -f /etc/os-release ]]; then
462*b30d57cdSChangpeng Liu		source /etc/os-release
463*b30d57cdSChangpeng Liu	fi
464*b30d57cdSChangpeng Liu
465*b30d57cdSChangpeng Liu	OSID=$ID
466*b30d57cdSChangpeng Liu	OSVERSION=$VERSION_ID
467*b30d57cdSChangpeng Liu
468*b30d57cdSChangpeng Liu	echo "OS-ID: $OSID | OS-Version: $OSVERSION"
469*b30d57cdSChangpeng Liu}
470*b30d57cdSChangpeng Liu
471*b30d57cdSChangpeng Liuif [[ "${CONFIG[VFIO_USER]}" = "y" ]]; then
472*b30d57cdSChangpeng Liu	if [[ $arch != x86_64* ]] || [[ $sys_name == "FreeBSD" ]]; then
473*b30d57cdSChangpeng Liu		echo "Non x86_64 and Linux platform, disable CONFIG_VFIO_USER"
474*b30d57cdSChangpeng Liu		CONFIG[VFIO_USER]="n"
475*b30d57cdSChangpeng Liu		break
476*b30d57cdSChangpeng Liu	fi
477*b30d57cdSChangpeng Liu
478*b30d57cdSChangpeng Liu	set_os_id_version
479*b30d57cdSChangpeng Liu
480*b30d57cdSChangpeng Liu	# disable tests on ubuntu16 due to lack of macro definition in pci_regs.h
481*b30d57cdSChangpeng Liu	if [[ $OSID == "ubuntu" ]] && [[ $OSVERSION == "16.04" ]]; then
482*b30d57cdSChangpeng Liu		echo "ubuntu16 OS, disable CONFIG_VFIO_USER"
483*b30d57cdSChangpeng Liu		CONFIG[VFIO_USER]="n"
484*b30d57cdSChangpeng Liu		break
485*b30d57cdSChangpeng Liu	fi
486*b30d57cdSChangpeng Liu
487*b30d57cdSChangpeng Liu	if ! hash cmake; then
488*b30d57cdSChangpeng Liu		echo "cmake not installed, disable CONFIG_VFIO_USER"
489*b30d57cdSChangpeng Liu		CONFIG[VFIO_USER]="n"
490*b30d57cdSChangpeng Liu		break
491*b30d57cdSChangpeng Liu	fi
492*b30d57cdSChangpeng Liu
493*b30d57cdSChangpeng Liu	if [[ ! -d /usr/include/json-c ]] && [[ ! -d /usr/local/include/json-c ]]; then
494*b30d57cdSChangpeng Liu		echo "json-c-devel not installed, disable CONFIG_VFIO_USER"
495*b30d57cdSChangpeng Liu		CONFIG[VFIO_USER]="n"
496*b30d57cdSChangpeng Liu		break
497*b30d57cdSChangpeng Liu	fi
498*b30d57cdSChangpeng Liu
499*b30d57cdSChangpeng Liu	if [[ ! -e /usr/include/cmocka.h ]] && [[ ! -e /usr/local/include/cmocka.h ]]; then
500*b30d57cdSChangpeng Liu		echo "libcmocka-devel not installed, disable CONFIG_VFIO_USER"
501*b30d57cdSChangpeng Liu		CONFIG[VFIO_USER]="n"
502*b30d57cdSChangpeng Liu		break
503*b30d57cdSChangpeng Liu	fi
504*b30d57cdSChangpeng Liu
505*b30d57cdSChangpeng Liufi
506*b30d57cdSChangpeng Liu
507e58e9fbdSpaul luse# IDXD uses Intel specific instructions.
508e58e9fbdSpaul luseif [[ "${CONFIG[IDXD]}" = "y" ]]; then
5092755fbdfSpaul luse	if [ $(uname -s) == "FreeBSD" ]; then
5102755fbdfSpaul luse		intel="hw.model: Intel"
5112755fbdfSpaul luse		cpu_vendor=$(sysctl -a | grep hw.model | cut -c 1-15)
5122755fbdfSpaul luse	else
513e58e9fbdSpaul luse		intel="GenuineIntel"
514e58e9fbdSpaul luse		cpu_vendor=$(grep -i 'vendor' /proc/cpuinfo  --max-count=1)
5152755fbdfSpaul luse	fi
516e58e9fbdSpaul luse	if [[ "$cpu_vendor" != *"$intel"* ]]; then
517e58e9fbdSpaul luse		echo "ERROR: IDXD cannot be used due to CPU incompatiblity."
518e58e9fbdSpaul luse		exit 1
519e58e9fbdSpaul luse	fi
520e58e9fbdSpaul lusefi
521e58e9fbdSpaul luse
5228cad9cc1SRichael Zhuang# Detect architecture and force no ISA-L if non-x86 or non-aarch64 architecture
523c510bd88SBen Walkerif [[ "${CONFIG[ISAL]}" = "y" ]]; then
5248cad9cc1SRichael Zhuang	if [[ $arch != x86_64* ]] && [[ $arch != aarch64* ]]; then
525873c8748STomasz Kulasek		echo "ERROR: ISA-L cannot be used due to CPU incompatiblity."
526873c8748STomasz Kulasek		exit 1
527552e21ccSZiye Yang	fi
528c510bd88SBen Walkerfi
529552e21ccSZiye Yang
530d9d4e40dSpaul luseif [[ "${CONFIG[ISAL]}" = "n" ]] && [[ "${CONFIG[REDUCE]}" = "y" ]]; then
531d9d4e40dSpaul luse		echo "ERROR Conflicting options: --with-reduce is not compatible with --without-isal."
532d9d4e40dSpaul luse		exit 1
533d9d4e40dSpaul lusefi
534d9d4e40dSpaul luse
535577df16aSPawel Wodkowskiif [ -z "${CONFIG[ENV]}" ]; then
536577df16aSPawel Wodkowski	CONFIG[ENV]=$rootdir/lib/env_dpdk
537577df16aSPawel Wodkowski	echo "Using default SPDK env in ${CONFIG[ENV]}"
538577df16aSPawel Wodkowski	if [ -z "${CONFIG[DPDK_DIR]}" ]; then
53938e26cf5STomasz Zawadzki		if [ ! -f "$rootdir"/dpdk/config/meson.build ]; then
540d199eb29SDaniel Verkamp			echo "DPDK not found; please specify --with-dpdk=<path> or run:"
541d199eb29SDaniel Verkamp			echo
542d199eb29SDaniel Verkamp			echo "  git submodule update --init"
543d199eb29SDaniel Verkamp			exit 1
544577df16aSPawel Wodkowski		else
545577df16aSPawel Wodkowski			CONFIG[DPDK_DIR]="${rootdir}/dpdk/build"
546577df16aSPawel Wodkowski			echo "Using default DPDK in ${CONFIG[DPDK_DIR]}"
547d199eb29SDaniel Verkamp		fi
5489dd998cdSBen Walker	fi
5497d2a2f52SBen Walkerelse
55006cc8045SBen Walker	if [ -n "${CONFIG[DPDK_DIR]}" ]; then
55106cc8045SBen Walker		echo "--with-env and --with-dpdk are mutually exclusive."
55206cc8045SBen Walker		exit 1
55306cc8045SBen Walker	fi
55406cc8045SBen Walker
555577df16aSPawel Wodkowski	if [ "${CONFIG[VHOST]}" = "y" ]; then
5567d2a2f52SBen Walker		echo "Vhost is only supported when using the default DPDK environment. Disabling it."
5577d2a2f52SBen Walker	fi
5587d2a2f52SBen Walker	# Always disable vhost, but only print the error message if the user explicitly turned it on.
559577df16aSPawel Wodkowski	CONFIG[VHOST]="n"
560577df16aSPawel Wodkowski	if [ "${CONFIG[VIRTIO]}" = "y" ]; then
5617d2a2f52SBen Walker		echo "Virtio is only supported when using the default DPDK environment. Disabling it."
5627d2a2f52SBen Walker	fi
5637d2a2f52SBen Walker	# Always disable virtio, but only print the error message if the user explicitly turned it on.
564577df16aSPawel Wodkowski	CONFIG[VIRTIO]="n"
5659dd998cdSBen Walkerfi
5669dd998cdSBen Walker
567577df16aSPawel Wodkowskiif [ "${CONFIG[VTUNE]}" = "y" ]; then
568577df16aSPawel Wodkowski	if [ -z "${CONFIG[VTUNE_DIR]}" ]; then
5695712088aSRoman Sudarikov		echo "When VTune is enabled, you must specify the VTune directory using --with-vtune=path"
5705712088aSRoman Sudarikov		exit 1
5715712088aSRoman Sudarikov	fi
5725712088aSRoman Sudarikovfi
5735712088aSRoman Sudarikov
574577df16aSPawel Wodkowskiif [ "${CONFIG[ASAN]}" = "y" -a "${CONFIG[TSAN]}" = "y" ]; then
575830912e2SBen Walker	echo "ERROR: ASAN and TSAN cannot be enabled at the same time."
576830912e2SBen Walker	exit 1
577830912e2SBen Walkerfi
578830912e2SBen Walker
5795a764955SMichal Bergerif [[ $sys_name == "FreeBSD" ]]; then
5805091cadcSPaul Luse	# FreeBSD doesn't support all configurations
581577df16aSPawel Wodkowski	if [[ "${CONFIG[COVERAGE]}" == "y" ]]; then
5825091cadcSPaul Luse		echo "ERROR: CONFIG_COVERAGE not available on FreeBSD"
5835091cadcSPaul Luse		exit 1
5845091cadcSPaul Luse	fi
5855091cadcSPaul Lusefi
5865091cadcSPaul Luse
5875a764955SMichal Bergerif [[ $sys_name == "FreeBSD" ]]; then
58827b920a2SDarek Stojaczyk	if [[ "${CONFIG[VHOST]}" == "y" ]]; then
589873c8748STomasz Kulasek		echo "Vhost is only supported on Linux."
590873c8748STomasz Kulasek		exit 1
59127b920a2SDarek Stojaczyk	fi
59227b920a2SDarek Stojaczyk	if [[ "${CONFIG[VIRTIO]}" == "y" ]]; then
593873c8748STomasz Kulasek		echo "Virtio is only supported on Linux."
594873c8748STomasz Kulasek		exit 1
59527b920a2SDarek Stojaczyk	fi
59627b920a2SDarek Stojaczykfi
59727b920a2SDarek Stojaczyk
598577df16aSPawel Wodkowskiif [ "${CONFIG[RDMA]}" = "y" ]; then
599daee62a0SAlexey Marchuk  if [[ ! "${CONFIG[RDMA_PROV]}" == "verbs" ]] && [[ ! "${CONFIG[RDMA_PROV]}" == "mlx5_dv" ]]; then
600daee62a0SAlexey Marchuk    echo "Invalid RDMA provider specified, must be \"verbs\" or \"mlx5_dv\""
601daee62a0SAlexey Marchuk    exit 1
602daee62a0SAlexey Marchuk  fi
603daee62a0SAlexey Marchuk
604eed0c6beSDarek Stojaczyk	if ! echo -e '#include <infiniband/verbs.h>\n#include <rdma/rdma_verbs.h>\n' \
605eed0c6beSDarek Stojaczyk		'int main(void) { return 0; }\n' \
60643a713f9SSeth Howell		| ${BUILD_CMD[@]} -libverbs -lrdmacm - 2>/dev/null; then
607eed0c6beSDarek Stojaczyk		echo --with-rdma requires libverbs and librdmacm.
608eed0c6beSDarek Stojaczyk		echo Please install then re-run this script.
609eed0c6beSDarek Stojaczyk		exit 1
610eed0c6beSDarek Stojaczyk	fi
611eed0c6beSDarek Stojaczyk
612eed0c6beSDarek Stojaczyk	if echo -e '#include <infiniband/verbs.h>\n' \
613eed0c6beSDarek Stojaczyk		'int main(void) { return !!IBV_WR_SEND_WITH_INV; }\n' \
61443a713f9SSeth Howell		| ${BUILD_CMD[@]} -c - 2>/dev/null; then
615577df16aSPawel Wodkowski		CONFIG[RDMA_SEND_WITH_INVAL]="y"
6167671073bSSeth Howell	else
617577df16aSPawel Wodkowski		CONFIG[RDMA_SEND_WITH_INVAL]="n"
61817a819f8SJim Harris		echo "
6197671073bSSeth Howell*******************************************************************************
6207671073bSSeth HowellWARNING: The Infiniband Verbs opcode Send With Invalidate is either not
6217671073bSSeth Howellsupported or is not functional with the current version of libibverbs installed
6227671073bSSeth Howellon this system. Please upgrade to at least version 1.1.
6237671073bSSeth Howell
6247671073bSSeth HowellBeginning with Linux kernel 4.14, the kernel NVMe-oF initiator leverages Send
6257671073bSSeth HowellWith Invalidate RDMA operations to improve performance. Failing to use the
6267671073bSSeth HowellSend With Invalidate operation on the NVMe-oF target side results in full
6277671073bSSeth Howellfunctionality, but greatly reduced performance. The SPDK NVMe-oF target will
6287671073bSSeth Howellbe unable to leverage that operation using the currently installed version
6297671073bSSeth Howellof libibverbs, so Linux kernel NVMe-oF initiators based on kernels greater
6307671073bSSeth Howellthan or equal to 4.14 will see significantly reduced performance.
63117a819f8SJim Harris*******************************************************************************"
6327671073bSSeth Howell	fi
63394966468SAlexey Marchuk
63494966468SAlexey Marchuk	if echo -e '#include <rdma/rdma_cma.h>\n' \
63594966468SAlexey Marchuk		'int main(void) { return !!RDMA_OPTION_ID_ACK_TIMEOUT; }\n' \
63694966468SAlexey Marchuk		| ${BUILD_CMD[@]} -c - 2>/dev/null; then
63794966468SAlexey Marchuk		CONFIG[RDMA_SET_ACK_TIMEOUT]="y"
63894966468SAlexey Marchuk	else
63994966468SAlexey Marchuk		CONFIG[RDMA_SET_ACK_TIMEOUT]="n"
64094966468SAlexey Marchuk		echo "RDMA_OPTION_ID_ACK_TIMEOUT is not supported"
64194966468SAlexey Marchuk	fi
64294966468SAlexey Marchuk
643daee62a0SAlexey Marchuk	if [ "${CONFIG[RDMA_PROV]}" == "mlx5_dv" ]; then
644daee62a0SAlexey Marchuk	  if ! echo -e '#include <spdk/stdinc.h>\n' \
645daee62a0SAlexey Marchuk	    '#include <infiniband/mlx5dv.h>\n' \
646daee62a0SAlexey Marchuk	    '#include <rdma/rdma_cma.h>\n' \
647daee62a0SAlexey Marchuk		  'int main(void) { return rdma_establish(NULL) || ' \
648daee62a0SAlexey Marchuk		  '!!IBV_QP_INIT_ATTR_SEND_OPS_FLAGS || !!MLX5_OPCODE_RDMA_WRITE; }\n' \
649daee62a0SAlexey Marchuk		  | ${BUILD_CMD[@]} -lmlx5 -I${rootdir}/include -c - 2>/dev/null; then
650daee62a0SAlexey Marchuk      echo "mlx5_dv provider is not supported"
651daee62a0SAlexey Marchuk		  exit 1
652daee62a0SAlexey Marchuk	  fi
653daee62a0SAlexey Marchuk	fi
654daee62a0SAlexey Marchuk
655daee62a0SAlexey Marchuk	echo "Using "${CONFIG[RDMA_PROV]}" RDMA provider"
6567671073bSSeth Howellfi
6577671073bSSeth Howell
658ed56a3d4SAnil Veerabhadrappaif [[ "${CONFIG[FC]}" = "y" ]]; then
659ed56a3d4SAnil Veerabhadrappa	if [[ -n "${CONFIG[FC_PATH]}" ]]; then
660ed56a3d4SAnil Veerabhadrappa		if [ ! -d "${CONFIG[FC_PATH]}" ]; then
661ed56a3d4SAnil Veerabhadrappa			echo "${CONFIG[FC_PATH]}: directory not found"
662ed56a3d4SAnil Veerabhadrappa			exit 1
663ed56a3d4SAnil Veerabhadrappa		fi
664ed56a3d4SAnil Veerabhadrappa	fi
665ed56a3d4SAnil Veerabhadrappafi
666ed56a3d4SAnil Veerabhadrappa
667552e21ccSZiye Yangif [[ "${CONFIG[ISAL]}" = "y" ]] || [[ "${CONFIG[CRYPTO]}" = "y" ]]; then
668325010bfSRichael Zhuang	if [[ "${HAVE_NASM}" = "n" ]] && [[ $arch == x86_64* ]]; then
66935e54647STomasz Zawadzki		echo "ERROR: ISA-L, compression & crypto require NASM version 2.14 or newer."
670873c8748STomasz Kulasek		echo "Please install or upgrade them re-run this script."
671873c8748STomasz Kulasek		exit 1
672552e21ccSZiye Yang	else
673552e21ccSZiye Yang		if [[ "${CONFIG[CRYPTO]}" = "y" ]]; then
674552e21ccSZiye Yang			CONFIG[IPSEC_MB]=y
675552e21ccSZiye Yang		fi
676552e21ccSZiye Yang	fi
677552e21ccSZiye Yangfi
678552e21ccSZiye Yang
679552e21ccSZiye Yangif [[ "${CONFIG[ISAL]}" = "y" ]]; then
680385f42ebSDarek Stojaczyk	if [ ! -f "$rootdir"/isa-l/autogen.sh ]; then
681a89dbbffSBen Walker		echo "ISA-L was not found; To install ISA-L run:"
682552e21ccSZiye Yang		echo "  git submodule update --init"
683b324f73cSPaul Luse		exit 1
6840fb1e1c5SPaul Luse	fi
685552e21ccSZiye Yang
686552e21ccSZiye Yang	cd $rootdir/isa-l
687e4aee795SAlexey Marchuk	ISAL_LOG=$rootdir/isa-l/spdk-isal.log
688552e21ccSZiye Yang	echo -n "Configuring ISA-L (logfile: $ISAL_LOG)..."
689552e21ccSZiye Yang	./autogen.sh &> $ISAL_LOG
690552e21ccSZiye Yang	./configure CFLAGS="-fPIC -g -O2" --enable-shared=no >> $ISAL_LOG 2>&1
691552e21ccSZiye Yang	echo "done."
692552e21ccSZiye Yang	cd $rootdir
693552e21ccSZiye Yangfi
6947671073bSSeth Howell
695ce711726SDarek Stojaczykif [[ "${CONFIG[PMDK]}" = "y" ]]; then
696ce711726SDarek Stojaczyk	if ! echo -e '#include <libpmemblk.h>\nint main(void) { return 0; }\n' \
69743a713f9SSeth Howell		| ${BUILD_CMD[@]} -lpmemblk - 2>/dev/null; then
698ce711726SDarek Stojaczyk		echo --with-pmdk requires libpmemblk.
699ce711726SDarek Stojaczyk		echo Please install then re-run this script.
700ce711726SDarek Stojaczyk		exit 1
701ce711726SDarek Stojaczyk	fi
702ce711726SDarek Stojaczykfi
703ce711726SDarek Stojaczyk
70497022803SJim Harrisif [[ "${CONFIG[REDUCE]}" = "y" ]]; then
705c4a3b312SDarek Stojaczyk	if ! echo -e '#include <libpmem.h>\nint main(void) { return 0; }\n' \
70643a713f9SSeth Howell		| ${BUILD_CMD[@]} -lpmem - 2>/dev/null; then
70797022803SJim Harris		echo --with-reduce requires libpmem.
70897022803SJim Harris		echo Please install then re-run this script.
70997022803SJim Harris		exit 1
71097022803SJim Harris	fi
71197022803SJim Harrisfi
71297022803SJim Harris
713805d9942STomasz Kulasekif [[ "${CONFIG[NVME_CUSE]}" = "y" ]]; then
714805d9942STomasz 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' \
715805d9942STomasz Kulasek		| ${BUILD_CMD[@]} -lfuse3 -D_FILE_OFFSET_BITS=64 - 2>/dev/null; then
716805d9942STomasz Kulasek		echo --with-cuse requires libfuse3.
717805d9942STomasz Kulasek		echo Please install then re-run this script.
718805d9942STomasz Kulasek		exit 1
719805d9942STomasz Kulasek	fi
720805d9942STomasz Kulasekfi
721805d9942STomasz Kulasek
72255bd0d3aSDarek Stojaczykif [[ "${CONFIG[RBD]}" = "y" ]]; then
72355bd0d3aSDarek Stojaczyk	if ! echo -e '#include <rbd/librbd.h>\n#include <rados/librados.h>\n' \
72455bd0d3aSDarek Stojaczyk		'int main(void) { return 0; }\n' \
72543a713f9SSeth Howell		| ${BUILD_CMD[@]} -lrados -lrbd - 2>/dev/null; then
72655bd0d3aSDarek Stojaczyk		echo --with-rbd requires librados and librbd.
72755bd0d3aSDarek Stojaczyk		echo Please install then re-run this script.
72855bd0d3aSDarek Stojaczyk		exit 1
72955bd0d3aSDarek Stojaczyk	fi
73055bd0d3aSDarek Stojaczykfi
73155bd0d3aSDarek Stojaczyk
7325cb18040SDarek Stojaczykif [[ "${CONFIG[ISCSI_INITIATOR]}" = "y" ]]; then
7335cb18040SDarek Stojaczyk	# Fedora installs libiscsi to /usr/lib64/iscsi for some reason.
7345cb18040SDarek Stojaczyk	if ! echo -e '#include <iscsi/iscsi.h>\n#include <iscsi/scsi-lowlevel.h>\n' \
7355cb18040SDarek Stojaczyk		'#if LIBISCSI_API_VERSION < 20150621\n' \
7365cb18040SDarek Stojaczyk		'#error\n' \
7375cb18040SDarek Stojaczyk		'#endif\n' \
7385cb18040SDarek Stojaczyk		'int main(void) { return 0; }\n' \
73943a713f9SSeth Howell		| ${BUILD_CMD[@]} -L/usr/lib64/iscsi -liscsi - 2>/dev/null; then
7405cb18040SDarek Stojaczyk		echo --with-iscsi-initiator requires libiscsi with
7415cb18040SDarek Stojaczyk		echo 'LIBISCSI_API_VERSION >= 20150621.'
7425cb18040SDarek Stojaczyk		echo Please install then re-run this script.
7435cb18040SDarek Stojaczyk		exit 1
7445cb18040SDarek Stojaczyk	fi
7455cb18040SDarek Stojaczykfi
7465cb18040SDarek Stojaczyk
7473674c1d3SDarek Stojaczykif [[ "${CONFIG[ASAN]}" = "y" ]]; then
7483674c1d3SDarek Stojaczyk	if ! echo -e 'int main(void) { return 0; }\n' \
74943a713f9SSeth Howell		| ${BUILD_CMD[@]} -fsanitize=address - 2>/dev/null; then
7503674c1d3SDarek Stojaczyk		echo --enable-asan requires libasan.
7513674c1d3SDarek Stojaczyk		echo Please install then re-run this script.
7523674c1d3SDarek Stojaczyk		exit 1
7533674c1d3SDarek Stojaczyk	fi
7543674c1d3SDarek Stojaczykfi
7553674c1d3SDarek Stojaczyk
7563674c1d3SDarek Stojaczykif [[ "${CONFIG[UBSAN]}" = "y" ]]; then
7573674c1d3SDarek Stojaczyk	if ! echo -e 'int main(void) { return 0; }\n' \
75843a713f9SSeth Howell		| ${BUILD_CMD[@]} -fsanitize=undefined - 2>/dev/null; then
7593674c1d3SDarek Stojaczyk		echo --enable-ubsan requires libubsan.
7603674c1d3SDarek Stojaczyk		echo Please install then re-run this script.
761fa729fd3SWANGHAILIANG		echo If installed, please check that the GCC version is at least 6.4 \
762fa729fd3SWANGHAILIANG		     and synchronize CC accordingly.
7633674c1d3SDarek Stojaczyk		exit 1
7643674c1d3SDarek Stojaczyk	fi
7653674c1d3SDarek Stojaczykfi
7663674c1d3SDarek Stojaczyk
7673674c1d3SDarek Stojaczykif [[ "${CONFIG[TSAN]}" = "y" ]]; then
7683674c1d3SDarek Stojaczyk	if ! echo -e 'int main(void) { return 0; }\n' \
76943a713f9SSeth Howell		| ${BUILD_CMD[@]} -fsanitize=thread - 2>/dev/null; then
7703674c1d3SDarek Stojaczyk		echo --enable-tsan requires libtsan.
7713674c1d3SDarek Stojaczyk		echo Please install then re-run this script.
7723674c1d3SDarek Stojaczyk		exit 1
7733674c1d3SDarek Stojaczyk	fi
7743674c1d3SDarek Stojaczykfi
7753674c1d3SDarek Stojaczyk
776d1fee489SVitaliy Mysakif [[ "${CONFIG[OCF]}" = "y" ]]; then
777d1fee489SVitaliy Mysak	# If OCF_PATH is a file, assume it is a library and use it to compile with
778d1fee489SVitaliy Mysak	if [ -f ${CONFIG[OCF_PATH]} ]; then
779d1fee489SVitaliy Mysak		CONFIG[CUSTOMOCF]=y
780d1fee489SVitaliy Mysak	else
781d1fee489SVitaliy Mysak		CONFIG[CUSTOMOCF]=n
782d1fee489SVitaliy Mysak	fi
783d1fee489SVitaliy Mysakfi
784d1fee489SVitaliy Mysak
785995d60f4SBen Walkerif [[ "${CONFIG[PGO_CAPTURE]}" = "y" && "${CONFIG[PGO_USE]}" = "y" ]]; then
786995d60f4SBen Walker	echo "ERROR: --enable-pgo-capture and --enable-pgo-use are mutually exclusive."
787995d60f4SBen Walker	exit 1
788954728e9SBen Walkerelif [[ "${CONFIG[PGO_USE]}" = "y" ]]; then
789954728e9SBen Walker	if [[ "$CC_TYPE" = "clang" ]]; then
790954728e9SBen Walker		# For clang we need to run an extra step on gathered profiling data.
791954728e9SBen Walker		echo "Generating suitable profile data"
792954728e9SBen Walker		llvm-profdata merge -output=build/pgo/default.profdata build/pgo
793954728e9SBen Walker	fi
794995d60f4SBen Walkerfi
795995d60f4SBen Walker
7968165bf71SBen Walkerif [[ "${CONFIG[URING]}" = "y" ]]; then
7978165bf71SBen Walker	if [[ -n "${CONFIG[URING_PATH]}" ]]; then
7988165bf71SBen Walker		if [ ! -d "${CONFIG[URING_PATH]}" ]; then
7998165bf71SBen Walker			echo "${CONFIG[URING_PATH]}: directory not found"
8008165bf71SBen Walker			exit 1
8018165bf71SBen Walker		fi
8028165bf71SBen Walker	fi
8038165bf71SBen Walkerfi
804995d60f4SBen Walker
8057fa15e28SXiaodong Liuif [[ "${CONFIG[FUSE]}" = "y" ]]; then
8067fa15e28SXiaodong Liu	if [[ ! -d /usr/include/fuse3 ]] && [[ ! -d /usr/local/include/fuse3 ]]; then
8077fa15e28SXiaodong Liu		echo "--with-fuse requires libfuse3."
8087fa15e28SXiaodong Liu		echo "Please install then re-run this script."
8097fa15e28SXiaodong Liu		exit 1
8107fa15e28SXiaodong Liu	fi
8117fa15e28SXiaodong Liufi
8127fa15e28SXiaodong Liu
81348f70f48SPawel Wodkowski# We are now ready to generate final configuration. But first do sanity
81448f70f48SPawel Wodkowski# check to see if all keys in CONFIG array have its reflection in CONFIG file.
815e62a3c65SSeth Howellif [ $(egrep -c "^\s*CONFIG_[[:alnum:]_]+=" $rootdir/CONFIG) -ne ${#CONFIG[@]} ]; then
81648f70f48SPawel Wodkowski	echo ""
81748f70f48SPawel Wodkowski	echo "BUG: Some configuration options are not present in CONFIG file. Please update this file."
81848f70f48SPawel Wodkowski	echo "Missing options in CONFIG (+) file and in current config (-): "
81948f70f48SPawel Wodkowski	diff -u --label "CONFIG file" --label "CONFIG[@]" \
82085bc2bbeSPawel Wodkowski		<(sed -r -e '/^\s*$/d; /^\s*#.*/d; s/(CONFIG_[[:alnum:]_]+)=.*/\1/g' CONFIG | sort) \
82148f70f48SPawel Wodkowski		<(printf "CONFIG_%s\n" ${!CONFIG[@]} | sort)
82248f70f48SPawel Wodkowski	exit 1
82348f70f48SPawel Wodkowskifi
82448f70f48SPawel Wodkowski
82585bc2bbeSPawel Wodkowskiecho -n "Creating mk/config.mk..."
826e62a3c65SSeth Howellcp -f $rootdir/CONFIG $rootdir/mk/config.mk
827577df16aSPawel Wodkowskifor key in ${!CONFIG[@]}; do
828e62a3c65SSeth Howell	sed -i.bak -r "s#^\s*CONFIG_${key}=.*#CONFIG_${key}\?=${CONFIG[$key]}#g" $rootdir/mk/config.mk
829577df16aSPawel Wodkowskidone
830577df16aSPawel Wodkowski# On FreeBSD sed -i 'SUFFIX' - SUFFIX is mandatory. So no way but to delete the backed file.
831e62a3c65SSeth Howellrm -f $rootdir/mk/config.mk.bak
832baa6eac0SDarek Stojaczykecho "done."
8339dd998cdSBen Walker
83408ec96ebSDaniel Verkamp# Environment variables
835baa6eac0SDarek Stojaczykecho -n "Creating mk/cc.flags.mk..."
836e62a3c65SSeth Howellrm -f $rootdir/mk/cc.flags.mk
837e62a3c65SSeth Howell[ -n "$CFLAGS" ] && echo "CFLAGS?=$CFLAGS" > $rootdir/mk/cc.flags.mk
838e62a3c65SSeth Howell[ -n "$CXXFLAGS" ] && echo "CXXFLAGS?=$CXXFLAGS" >> $rootdir/mk/cc.flags.mk
839e62a3c65SSeth Howell[ -n "$LDFLAGS" ] && echo "LDFLAGS?=$LDFLAGS" >> $rootdir/mk/cc.flags.mk
840e62a3c65SSeth Howell[ -n "$DESTDIR" ] && echo "DESTDIR?=$DESTDIR" >> $rootdir/mk/cc.flags.mk
8410b56a5b4SJim Harrisecho "done."
84285bc2bbeSPawel Wodkowski
843db3ebfe6SMichal Berger# Create .sh with build config for easy sourcing|lookup during the tests.
844db3ebfe6SMichal Bergerfor conf in "${!CONFIG[@]}"; do
845db3ebfe6SMichal Berger	echo "CONFIG_$conf=${CONFIG[$conf]}"
846db3ebfe6SMichal Bergerdone >"$rootdir/test/common/build_config.sh"
847db3ebfe6SMichal Berger
8485a764955SMichal Bergerif [[ $sys_name == "FreeBSD" ]]; then
849870ce250SPaul Luse	echo "Type 'gmake' to build."
850870ce250SPaul Luseelse
8510b56a5b4SJim Harris	echo "Type 'make' to build."
852870ce250SPaul Lusefi
8539dd998cdSBen Walker
8549dd998cdSBen Walkerexit 0
855