xref: /spdk/configure (revision 5a7649559bcc649f541b8f5d8f93e7afbf55128e)
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))
8e62a3c65SSeth Howell
99dd998cdSBen Walkerfunction usage()
109dd998cdSBen Walker{
119dd998cdSBen Walker	echo "'configure' configures SPDK to compile on supported platforms."
129dd998cdSBen Walker	echo ""
139dd998cdSBen Walker	echo "Usage: ./configure [OPTION]..."
149dd998cdSBen Walker	echo ""
159dd998cdSBen Walker	echo "Defaults for the options are specified in brackets."
169dd998cdSBen Walker	echo ""
179dd998cdSBen Walker	echo "General:"
189dd998cdSBen Walker	echo " -h, --help                Display this help and exit"
192e7fe8e8SDaniel Verkamp	echo ""
202e7fe8e8SDaniel Verkamp	echo " --prefix=path             Configure installation prefix (default: /usr/local)"
210e6ddfd6SBen Walker	echo " --target-arch=arch        Target build architecture. Must be a valid GNU arch. Default: native"
222e7fe8e8SDaniel Verkamp	echo ""
233def834cSAmelia Blachuciak	echo " --cross-prefix=prefix     Prefix for cross compilation (default: none)"
243def834cSAmelia Blachuciak	echo "                           example: aarch64-linux-gnu"
253def834cSAmelia Blachuciak	echo ""
269dd998cdSBen Walker	echo " --enable-debug            Configure for debug builds"
27ae2b2f64SPawel Wodkowski	echo " --enable-log-bt           Enable support of backtrace printing in SPDK logs (requires libunwind)."
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"
55161c88a0SDarek Stojaczyk	echo " crypto                    Build vbdev crypto module."
5606cc8045SBen Walker	echo "                           No path required."
57161c88a0SDarek Stojaczyk	echo " fio                       Build fio_plugin."
589dd998cdSBen Walker	echo "                           example: /usr/src/fio"
59161c88a0SDarek Stojaczyk	echo " vhost                     Build vhost target. Enabled by default."
6035260f2bSDaniel Verkamp	echo "                           No path required."
61161c88a0SDarek Stojaczyk	echo " internal-vhost-lib        Use the internal copy of rte_vhost. By default, the upstream"
62161c88a0SDarek Stojaczyk	echo "                           rte_vhost from DPDK will be used."
632b846accSDarek Stojaczyk	echo "                           No path required."
64161c88a0SDarek Stojaczyk	echo " virtio                    Build vhost initiator and virtio-pci bdev modules."
657dee96ceSDariusz Stojaczyk	echo "                           No path required."
66161c88a0SDarek Stojaczyk	echo " pmdk                      Build persistent memory bdev."
67218dcd84SJim Harris	echo "                           example: /usr/share/pmdk"
68161c88a0SDarek Stojaczyk	echo " reduce                    Build vbdev compression module."
6997022803SJim Harris	echo "                           No path required."
70161c88a0SDarek Stojaczyk	echo " vpp                       Build VPP net module."
7198516945SLiang Yan	echo "                           example: /vpp_repo/build-root/rpmbuild/vpp-18.01.1.0/build-root/install-vpp-native/vpp"
72161c88a0SDarek Stojaczyk	echo " rbd                       Build Ceph RBD bdev module."
739dd998cdSBen Walker	echo "                           No path required."
74161c88a0SDarek Stojaczyk	echo " rdma                      Build RDMA transport for NVMf target and initiator."
759dd998cdSBen Walker	echo "                           No path required."
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."
93161c88a0SDarek Stojaczyk	echo " uring                     Build I/O uring bdev."
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
123873c8748STomasz Kulasek# Detect the compiler toolchain
124873c8748STomasz Kulasek$rootdir/scripts/detect_cc.sh --cc="$CC" --cxx="$CXX" --lto="${CONFIG[LTO]}" --ld="$LD" --cross-prefix="${CONFIG[CROSS_PREFIX]}"  > $rootdir/mk/cc.mk
125873c8748STomasz Kulasek
126873c8748STomasz KulasekCC=$(cat $rootdir/mk/cc.mk | grep "DEFAULT_CC=" | cut -d "=" -f 2)
127873c8748STomasz KulasekCC_TYPE=$(cat $rootdir/mk/cc.mk | grep "CC_TYPE=" | cut -d "=" -f 2)
128873c8748STomasz Kulasek
129873c8748STomasz Kulasekarch=$($CC -dumpmachine)
130*5a764955SMichal Bergersys_name=$(uname -s)
131873c8748STomasz Kulasek
132873c8748STomasz Kulasek# Sanitize default configuration. All parameters set by user explicit should fail
133873c8748STomasz Kulasek# Force no ISA-L if non-x86 or non-aarch64 architecture
134873c8748STomasz Kulasekif [[ "${CONFIG[ISAL]}" = "y" ]]; then
135873c8748STomasz Kulasek	if [[ $arch != x86_64* ]] && [[ $arch != aarch64* ]]; then
136873c8748STomasz Kulasek		CONFIG[ISAL]=n
137873c8748STomasz Kulasek		echo "Notice: ISA-L not supported for ${arch}. Turning off default feature."
138873c8748STomasz Kulasek	fi
139873c8748STomasz Kulasekfi
140873c8748STomasz Kulasek
141*5a764955SMichal Bergerif [[ $sys_name == "FreeBSD" ]]; then
142873c8748STomasz Kulasek	# Vhost, rte_vhost library and virtio are only supported on Linux.
143873c8748STomasz Kulasek	CONFIG[VHOST]="n"
144873c8748STomasz Kulasek	CONFIG[VHOST_INTERNAL_LIB]="n"
145873c8748STomasz Kulasek	CONFIG[VIRTIO]="n"
146873c8748STomasz Kulasek	echo "Notice: Vhost, rte_vhost library and virtio are only supported on Linux. Turning off default feature."
147873c8748STomasz Kulasekfi
148873c8748STomasz Kulasek
149325010bfSRichael Zhuang#check nasm only on x86
150325010bfSRichael Zhuangif [[ $arch == x86_64* ]]; then
151873c8748STomasz Kulasek	ver=$(nasm -v 2>/dev/null | awk '{print $3}' | sed 's/[^0-9]*//g')
152873c8748STomasz Kulasek	if [[ "${ver:0:1}" -le "2" ]] && [[ "${ver:0:3}" -le "213" ]] && [[ "${ver:0:5}" -lt "21303" ]]; then
153873c8748STomasz Kulasek		# ISA-L, compression & crypto require NASM version 2.13.03 or newer.
154873c8748STomasz Kulasek		CONFIG[ISAL]=n
155873c8748STomasz Kulasek		CONFIG[CRYPTO]=n
156873c8748STomasz Kulasek		CONFIG[IPSEC_MB]=n
157873c8748STomasz Kulasek		CONFIG[REDUCE]=n
158873c8748STomasz Kulasek		HAVE_NASM=n
159873c8748STomasz Kulasek		echo "Notice: ISA-L, compression & crypto require NASM version 2.13.03 or newer. Turning off default ISA-L and crypto features."
160873c8748STomasz Kulasek	else
161873c8748STomasz Kulasek		HAVE_NASM=y
162873c8748STomasz Kulasek	fi
163325010bfSRichael Zhuangfi
164873c8748STomasz Kulasek
1651723a800SGangCaofunction check_dir() {
1661723a800SGangCao	arg="$1"
1671723a800SGangCao	dir="${arg#*=}"
1681723a800SGangCao	if [ ! -d "$dir" ]; then
1691723a800SGangCao		echo "$arg: directory not found"
1701723a800SGangCao		exit 1
1711723a800SGangCao	fi
1721723a800SGangCao}
1731723a800SGangCao
1749dd998cdSBen Walkerfor i in "$@"; do
1759dd998cdSBen Walker	case "$i" in
1769dd998cdSBen Walker		-h|--help)
1779dd998cdSBen Walker			usage
1789dd998cdSBen Walker			exit 0
1799dd998cdSBen Walker			;;
1802e7fe8e8SDaniel Verkamp		--prefix=*)
181577df16aSPawel Wodkowski			CONFIG[PREFIX]="${i#*=}"
1822e7fe8e8SDaniel Verkamp			;;
1830e6ddfd6SBen Walker		--target-arch=*)
1840e6ddfd6SBen Walker			CONFIG[ARCH]="${i#*=}"
1850e6ddfd6SBen Walker			;;
1863def834cSAmelia Blachuciak		--cross-prefix=*)
1873def834cSAmelia Blachuciak			CONFIG[CROSS_PREFIX]="${i#*=}"
1883def834cSAmelia Blachuciak			;;
1899dd998cdSBen Walker		--enable-debug)
190577df16aSPawel Wodkowski			CONFIG[DEBUG]=y
1919dd998cdSBen Walker			;;
1929dd998cdSBen Walker		--disable-debug)
193577df16aSPawel Wodkowski			CONFIG[DEBUG]=n
1949dd998cdSBen Walker			;;
195ae2b2f64SPawel Wodkowski		--enable-log-bt)
196577df16aSPawel Wodkowski			CONFIG[LOG_BACKTRACE]=y
197ae2b2f64SPawel Wodkowski			;;
198ae2b2f64SPawel Wodkowski		--disable-log-bt)
199577df16aSPawel Wodkowski			CONFIG[LOG_BACKTRACE]=n
200848daf27SPawel Wodkowski			;;
2019dd998cdSBen Walker		--enable-asan)
202577df16aSPawel Wodkowski			CONFIG[ASAN]=y
2039dd998cdSBen Walker			;;
2049dd998cdSBen Walker		--disable-asan)
205577df16aSPawel Wodkowski			CONFIG[ASAN]=n
2069dd998cdSBen Walker			;;
2079dd998cdSBen Walker		--enable-ubsan)
208577df16aSPawel Wodkowski			CONFIG[UBSAN]=y
2099dd998cdSBen Walker			;;
2109dd998cdSBen Walker		--disable-ubsan)
211577df16aSPawel Wodkowski			CONFIG[UBSAN]=n
2129dd998cdSBen Walker			;;
213830912e2SBen Walker		--enable-tsan)
214577df16aSPawel Wodkowski			CONFIG[TSAN]=y
215830912e2SBen Walker			;;
216830912e2SBen Walker		--disable-tsan)
217577df16aSPawel Wodkowski			CONFIG[TSAN]=n
218830912e2SBen Walker			;;
2199dd998cdSBen Walker		--enable-coverage)
220577df16aSPawel Wodkowski			CONFIG[COVERAGE]=y
2219dd998cdSBen Walker			;;
2229dd998cdSBen Walker		--disable-coverage)
223577df16aSPawel Wodkowski			CONFIG[COVERAGE]=n
2249dd998cdSBen Walker			;;
2256d6d1161SDaniel Verkamp		--enable-lto)
226577df16aSPawel Wodkowski			CONFIG[LTO]=y
2276d6d1161SDaniel Verkamp			;;
2286d6d1161SDaniel Verkamp		--disable-lto)
229577df16aSPawel Wodkowski			CONFIG[LTO]=n
2306d6d1161SDaniel Verkamp			;;
231995d60f4SBen Walker		--enable-pgo-capture)
232995d60f4SBen Walker			CONFIG[PGO_CAPTURE]=y
233995d60f4SBen Walker			;;
234995d60f4SBen Walker		--disable-pgo-capture)
235995d60f4SBen Walker			CONFIG[PGO_CAPTURE]=n
236995d60f4SBen Walker			;;
237995d60f4SBen Walker		--enable-pgo-use)
238995d60f4SBen Walker			CONFIG[PGO_USE]=y
239995d60f4SBen Walker			;;
240995d60f4SBen Walker		--disable-pgo-use)
241995d60f4SBen Walker			CONFIG[PGO_USE]=n
242995d60f4SBen Walker			;;
2439022a59eSDaniel Verkamp		--enable-tests)
244577df16aSPawel Wodkowski			CONFIG[TESTS]=y
2459022a59eSDaniel Verkamp			;;
2469022a59eSDaniel Verkamp		--disable-tests)
247577df16aSPawel Wodkowski			CONFIG[TESTS]=n
2489022a59eSDaniel Verkamp			;;
2499fcb1cb0STomasz Zawadzki		--enable-unit-tests)
2509fcb1cb0STomasz Zawadzki			CONFIG[UNIT_TESTS]=y
2519fcb1cb0STomasz Zawadzki			;;
2529fcb1cb0STomasz Zawadzki		--disable-unit-tests)
2539fcb1cb0STomasz Zawadzki			CONFIG[UNIT_TESTS]=n
2549fcb1cb0STomasz Zawadzki			;;
2559b2c6452SJacek Kalwas		--enable-examples)
2569b2c6452SJacek Kalwas			CONFIG[EXAMPLES]=y
2579b2c6452SJacek Kalwas			;;
2589b2c6452SJacek Kalwas		--disable-examples)
2599b2c6452SJacek Kalwas			CONFIG[EXAMPLES]=n
2609b2c6452SJacek Kalwas			;;
2619dd998cdSBen Walker		--enable-werror)
262577df16aSPawel Wodkowski			CONFIG[WERROR]=y
2639dd998cdSBen Walker			;;
2649dd998cdSBen Walker		--disable-werror)
265577df16aSPawel Wodkowski			CONFIG[WERROR]=n
2669dd998cdSBen Walker			;;
26706cc8045SBen Walker		--with-dpdk=*)
26806cc8045SBen Walker			check_dir "$i"
26906cc8045SBen Walker			CONFIG[DPDK_DIR]=$(readlink -f ${i#*=})
27006cc8045SBen Walker			;;
27106cc8045SBen Walker		--without-dpdk)
27206cc8045SBen Walker			CONFIG[DPDK_DIR]=
27306cc8045SBen Walker			;;
2749dd998cdSBen Walker		--with-env=*)
275577df16aSPawel Wodkowski			CONFIG[ENV]="${i#*=}"
2769dd998cdSBen Walker			;;
2779dd998cdSBen Walker		--with-rbd)
278577df16aSPawel Wodkowski			CONFIG[RBD]=y
2799dd998cdSBen Walker			;;
2809dd998cdSBen Walker		--without-rbd)
281577df16aSPawel Wodkowski			CONFIG[RBD]=n
2829dd998cdSBen Walker			;;
2839dd998cdSBen Walker		--with-rdma)
284577df16aSPawel Wodkowski			CONFIG[RDMA]=y
2859dd998cdSBen Walker			;;
2869dd998cdSBen Walker		--without-rdma)
287577df16aSPawel Wodkowski			CONFIG[RDMA]=n
2889dd998cdSBen Walker			;;
289ed56a3d4SAnil Veerabhadrappa		--with-fc=*)
290ed56a3d4SAnil Veerabhadrappa			CONFIG[FC]=y
291ed56a3d4SAnil Veerabhadrappa			CONFIG[FC_PATH]=$(readlink -f ${i#*=})
292ed56a3d4SAnil Veerabhadrappa			;;
293ed56a3d4SAnil Veerabhadrappa		--with-fc)
294ed56a3d4SAnil Veerabhadrappa			CONFIG[FC]=y
295ed56a3d4SAnil Veerabhadrappa			CONFIG[FC_PATH]=
296ed56a3d4SAnil Veerabhadrappa			;;
297ed56a3d4SAnil Veerabhadrappa		--without-fc)
298ed56a3d4SAnil Veerabhadrappa			CONFIG[FC]=n
299ed56a3d4SAnil Veerabhadrappa			CONFIG[FC_PATH]=
300ed56a3d4SAnil Veerabhadrappa			;;
3010923734cSLance Hartmann		--with-shared)
302577df16aSPawel Wodkowski			CONFIG[SHARED]=y
3030923734cSLance Hartmann			;;
3040923734cSLance Hartmann		--without-shared)
305577df16aSPawel Wodkowski			CONFIG[SHARED]=n
3060923734cSLance Hartmann			;;
3072af15344SJim Harris		--with-iscsi-initiator)
308577df16aSPawel Wodkowski			CONFIG[ISCSI_INITIATOR]=y
3092af15344SJim Harris			;;
3102af15344SJim Harris		--without-iscsi-initiator)
311577df16aSPawel Wodkowski			CONFIG[ISCSI_INITIATOR]=n
3122af15344SJim Harris			;;
3136118b853SDaniel Verkamp		--with-crypto)
314577df16aSPawel Wodkowski			CONFIG[CRYPTO]=y
3156118b853SDaniel Verkamp			;;
3166118b853SDaniel Verkamp		--without-crypto)
317577df16aSPawel Wodkowski			CONFIG[CRYPTO]=n
3186118b853SDaniel Verkamp			;;
31935260f2bSDaniel Verkamp		--with-vhost)
320577df16aSPawel Wodkowski			CONFIG[VHOST]=y
32135260f2bSDaniel Verkamp			;;
32235260f2bSDaniel Verkamp		--without-vhost)
323577df16aSPawel Wodkowski			CONFIG[VHOST]=n
32435260f2bSDaniel Verkamp			;;
3252b846accSDarek Stojaczyk		--with-internal-vhost-lib)
3262b846accSDarek Stojaczyk			CONFIG[VHOST_INTERNAL_LIB]=y
3272b846accSDarek Stojaczyk			;;
3282b846accSDarek Stojaczyk		--without-internal-vhost-lib)
3292b846accSDarek Stojaczyk			CONFIG[VHOST_INTERNAL_LIB]=n
3302b846accSDarek Stojaczyk			;;
3317dee96ceSDariusz Stojaczyk		--with-virtio)
332577df16aSPawel Wodkowski			CONFIG[VIRTIO]=y
3337dee96ceSDariusz Stojaczyk			;;
3347dee96ceSDariusz Stojaczyk		--without-virtio)
335577df16aSPawel Wodkowski			CONFIG[VIRTIO]=n
3367dee96ceSDariusz Stojaczyk			;;
337218dcd84SJim Harris		--with-pmdk)
338577df16aSPawel Wodkowski			CONFIG[PMDK]=y
339577df16aSPawel Wodkowski			CONFIG[PMDK_DIR]=""
340fca11f15SPiotr Pelplinski			;;
341218dcd84SJim Harris		--with-pmdk=*)
342577df16aSPawel Wodkowski			CONFIG[PMDK]=y
3431723a800SGangCao			check_dir "$i"
344577df16aSPawel Wodkowski			CONFIG[PMDK_DIR]=$(readlink -f ${i#*=})
345fca11f15SPiotr Pelplinski			;;
346218dcd84SJim Harris		--without-pmdk)
347577df16aSPawel Wodkowski			CONFIG[PMDK]=n
348fca11f15SPiotr Pelplinski			;;
34997022803SJim Harris		--with-reduce)
35097022803SJim Harris			CONFIG[REDUCE]=y
35197022803SJim Harris			;;
35297022803SJim Harris		--without-reduce)
35397022803SJim Harris			CONFIG[REDUCE]=n
35497022803SJim Harris			;;
355e793fad5STomasz Zawadzki		--with-vpp)
356577df16aSPawel Wodkowski			CONFIG[VPP]=y
357e793fad5STomasz Zawadzki			;;
358e793fad5STomasz Zawadzki		--with-vpp=*)
359577df16aSPawel Wodkowski			CONFIG[VPP]=y
360e793fad5STomasz Zawadzki			check_dir "$i"
361577df16aSPawel Wodkowski			CONFIG[VPP_DIR]=$(readlink -f ${i#*=})
362e793fad5STomasz Zawadzki			;;
363e793fad5STomasz Zawadzki		--without-vpp)
364577df16aSPawel Wodkowski			CONFIG[VPP]=n
365e793fad5STomasz Zawadzki			;;
3669dd998cdSBen Walker		--with-fio=*)
3671723a800SGangCao			check_dir "$i"
368577df16aSPawel Wodkowski			CONFIG[FIO_SOURCE_DIR]="${i#*=}"
369577df16aSPawel Wodkowski			CONFIG[FIO_PLUGIN]=y
3709dd998cdSBen Walker			;;
3719dd998cdSBen Walker		--without-fio)
372577df16aSPawel Wodkowski			CONFIG[FIO_SOURCE_DIR]=
373577df16aSPawel Wodkowski			CONFIG[FIO_PLUGIN]=n
3749dd998cdSBen Walker			;;
3755712088aSRoman Sudarikov		--with-vtune=*)
3761723a800SGangCao			check_dir "$i"
377577df16aSPawel Wodkowski			CONFIG[VTUNE_DIR]="${i#*=}"
378577df16aSPawel Wodkowski			CONFIG[VTUNE]=y
3795712088aSRoman Sudarikov			;;
3805712088aSRoman Sudarikov		--without-vtune)
381577df16aSPawel Wodkowski			CONFIG[VTUNE_DIR]=
382577df16aSPawel Wodkowski			CONFIG[VTUNE]=n
3835712088aSRoman Sudarikov			;;
3849abf7e8fSSeth Howell		--with-igb-uio-driver)
3859abf7e8fSSeth Howell			CONFIG[IGB_UIO_DRIVER]=y
3869abf7e8fSSeth Howell			;;
3879abf7e8fSSeth Howell		--without-igb-uio-driver)
3889abf7e8fSSeth Howell			CONFIG[IGB_UIO_DRIVER]=n
3899abf7e8fSSeth Howell			;;
39098d60de6SPiotr Pelplinski		--with-ocf)
39198d60de6SPiotr Pelplinski			CONFIG[OCF]=y
39298d60de6SPiotr Pelplinski			CONFIG[OCF_PATH]=$(readlink -f "./ocf")
39398d60de6SPiotr Pelplinski			;;
394d1fee489SVitaliy Mysak		--with-ocf=*)
395d1fee489SVitaliy Mysak			CONFIG[OCF]=y
396d1fee489SVitaliy Mysak			CONFIG[OCF_PATH]=$(readlink -f ${i#*=})
397d1fee489SVitaliy Mysak			;;
398d1fee489SVitaliy Mysak		--without-ocf)
399d1fee489SVitaliy Mysak			CONFIG[OCF]=n
400d1fee489SVitaliy Mysak			CONFIG[OCF_PATH]=
401d1fee489SVitaliy Mysak			;;
402552e21ccSZiye Yang		--with-isal)
403552e21ccSZiye Yang			CONFIG[ISAL]=y
404552e21ccSZiye Yang			;;
405552e21ccSZiye Yang		--without-isal)
406552e21ccSZiye Yang			CONFIG[ISAL]=n
407552e21ccSZiye Yang			;;
4088165bf71SBen Walker		--with-uring=*)
4098165bf71SBen Walker			CONFIG[URING]=y
4108165bf71SBen Walker			CONFIG[URING_PATH]=$(readlink -f ${i#*=})
4118165bf71SBen Walker			;;
4128165bf71SBen Walker		--with-uring)
4138165bf71SBen Walker			CONFIG[URING]=y
4148165bf71SBen Walker			CONFIG[URING_PATH]=
4158165bf71SBen Walker			;;
4168165bf71SBen Walker		--without-uring)
4178165bf71SBen Walker			CONFIG[URING]=n
4188165bf71SBen Walker			CONFIG[URING_PATH]=
4198165bf71SBen Walker			;;
4207fa15e28SXiaodong Liu		--with-fuse)
4217fa15e28SXiaodong Liu			CONFIG[FUSE]=y
4227fa15e28SXiaodong Liu			;;
4237fa15e28SXiaodong Liu		--without-fuse)
4247fa15e28SXiaodong Liu			CONFIG[FUSE]=n
4257fa15e28SXiaodong Liu			;;
426805d9942STomasz Kulasek		--with-nvme-cuse)
427805d9942STomasz Kulasek			CONFIG[NVME_CUSE]=y
428805d9942STomasz Kulasek			;;
429805d9942STomasz Kulasek		--without-nvme-cuse)
430805d9942STomasz Kulasek			CONFIG[NVME_CUSE]=n
431805d9942STomasz Kulasek			;;
43273763d40SArtur Paszkiewicz		--with-raid5)
43373763d40SArtur Paszkiewicz			CONFIG[RAID5]=y
43473763d40SArtur Paszkiewicz			;;
43573763d40SArtur Paszkiewicz		--without-raid5)
43673763d40SArtur Paszkiewicz			CONFIG[RAID5]=n
43773763d40SArtur Paszkiewicz			;;
4389dd998cdSBen Walker		--)
4399dd998cdSBen Walker			break
4409dd998cdSBen Walker			;;
4419dd998cdSBen Walker		*)
4429dd998cdSBen Walker			echo "Unrecognized option $i"
4439dd998cdSBen Walker			usage
4449dd998cdSBen Walker			exit 1
4459dd998cdSBen Walker	esac
4469dd998cdSBen Walkerdone
4479dd998cdSBen Walker
448131c9aadSAlexey Marchukif [[ $arch == x86_64* ]]; then
44900dd9e85SSeth Howell	BUILD_CMD=($CC -o /dev/null -x c $CPPFLAGS $CFLAGS $LDFLAGS -march=native)
450131c9aadSAlexey Marchukelse
451131c9aadSAlexey Marchuk	BUILD_CMD=($CC -o /dev/null -x c $CPPFLAGS $CFLAGS $LDFLAGS)
452131c9aadSAlexey Marchukfi
45373439e6fSBen Walker
4548cad9cc1SRichael Zhuang# Detect architecture and force no ISA-L if non-x86 or non-aarch64 architecture
455c510bd88SBen Walkerif [[ "${CONFIG[ISAL]}" = "y" ]]; then
4568cad9cc1SRichael Zhuang	if [[ $arch != x86_64* ]] && [[ $arch != aarch64* ]]; then
457873c8748STomasz Kulasek		echo "ERROR: ISA-L cannot be used due to CPU incompatiblity."
458873c8748STomasz Kulasek		exit 1
459552e21ccSZiye Yang	fi
460c510bd88SBen Walkerfi
461552e21ccSZiye Yang
462d9d4e40dSpaul luseif [[ "${CONFIG[ISAL]}" = "n" ]] && [[ "${CONFIG[REDUCE]}" = "y" ]]; then
463d9d4e40dSpaul luse		echo "ERROR Conflicting options: --with-reduce is not compatible with --without-isal."
464d9d4e40dSpaul luse		exit 1
465d9d4e40dSpaul lusefi
466d9d4e40dSpaul luse
467577df16aSPawel Wodkowskiif [ -z "${CONFIG[ENV]}" ]; then
468577df16aSPawel Wodkowski	CONFIG[ENV]=$rootdir/lib/env_dpdk
469577df16aSPawel Wodkowski	echo "Using default SPDK env in ${CONFIG[ENV]}"
470577df16aSPawel Wodkowski	if [ -z "${CONFIG[DPDK_DIR]}" ]; then
4719e655874SDarek Stojaczyk		if [ ! -f "$rootdir"/dpdk/config/common_base ]; then
472d199eb29SDaniel Verkamp			echo "DPDK not found; please specify --with-dpdk=<path> or run:"
473d199eb29SDaniel Verkamp			echo
474d199eb29SDaniel Verkamp			echo "  git submodule update --init"
475d199eb29SDaniel Verkamp			exit 1
476577df16aSPawel Wodkowski		else
477577df16aSPawel Wodkowski			CONFIG[DPDK_DIR]="${rootdir}/dpdk/build"
478577df16aSPawel Wodkowski			echo "Using default DPDK in ${CONFIG[DPDK_DIR]}"
479d199eb29SDaniel Verkamp		fi
48017e0283dSDarek Stojaczyk
48117e0283dSDarek Stojaczyk		if [[ "${CONFIG[VHOST]}" = "y" ]] && [[ "${CONFIG[VHOST_INTERNAL_LIB]}" = "n" ]]; then
48217e0283dSDarek Stojaczyk			# We lookup "common_linux" file to check if DPDK version is >= 19.05.
48317e0283dSDarek Stojaczyk			# "common_linux" is available since exactly DPDK 19.05 - it was renamed
48417e0283dSDarek Stojaczyk			# from "common_linuxapp".
48517e0283dSDarek Stojaczyk			if [ ! -f "$rootdir"/dpdk/config/common_linux ]; then
48617e0283dSDarek Stojaczyk				echo "Notice: Using internal, legacy rte_vhost library due to DPDK" \
48717e0283dSDarek Stojaczyk				     "version < 19.05"
48817e0283dSDarek Stojaczyk				CONFIG[VHOST_INTERNAL_LIB]=y
48917e0283dSDarek Stojaczyk			fi
49017e0283dSDarek Stojaczyk		fi
49117e0283dSDarek Stojaczyk	else
49217e0283dSDarek Stojaczyk		if [[ "${CONFIG[VHOST]}" = "y" ]] && [[ "${CONFIG[VHOST_INTERNAL_LIB]}" = "n" ]]; then
49317e0283dSDarek Stojaczyk			# DPDK must be already built, so we can simply try to use the new rte_vhost.
49417e0283dSDarek Stojaczyk			# It has a number of internal dependencies though, so don't try to link the
49517e0283dSDarek Stojaczyk			# program, just compile it
49617e0283dSDarek Stojaczyk			if ! echo -e '#include <rte_vhost.h>\n' \
49717e0283dSDarek Stojaczyk				'int main(void) { return rte_vhost_extern_callback_register(0, NULL, NULL); }\n' \
49843a713f9SSeth Howell				| ${BUILD_CMD[@]} -c -Wno-deprecated-declarations -Werror \
499e58dfd56SDarek Stojaczyk				-I"${CONFIG[DPDK_DIR]}/include" - &>/dev/null; then
50017e0283dSDarek Stojaczyk				echo "Notice: DPDK's rte_vhost not found or version < 19.05, using internal," \
50117e0283dSDarek Stojaczyk				     "legacy rte_vhost library."
50217e0283dSDarek Stojaczyk				CONFIG[VHOST_INTERNAL_LIB]=y
50317e0283dSDarek Stojaczyk			fi
50417e0283dSDarek Stojaczyk		fi
5059dd998cdSBen Walker	fi
5067d2a2f52SBen Walkerelse
50706cc8045SBen Walker	if [ -n "${CONFIG[DPDK_DIR]}" ]; then
50806cc8045SBen Walker		echo "--with-env and --with-dpdk are mutually exclusive."
50906cc8045SBen Walker		exit 1
51006cc8045SBen Walker	fi
51106cc8045SBen Walker
512577df16aSPawel Wodkowski	if [ "${CONFIG[VHOST]}" = "y" ]; then
5137d2a2f52SBen Walker		echo "Vhost is only supported when using the default DPDK environment. Disabling it."
5147d2a2f52SBen Walker	fi
5157d2a2f52SBen Walker	# Always disable vhost, but only print the error message if the user explicitly turned it on.
516577df16aSPawel Wodkowski	CONFIG[VHOST]="n"
517577df16aSPawel Wodkowski	if [ "${CONFIG[VIRTIO]}" = "y" ]; then
5187d2a2f52SBen Walker		echo "Virtio is only supported when using the default DPDK environment. Disabling it."
5197d2a2f52SBen Walker	fi
5207d2a2f52SBen Walker	# Always disable virtio, but only print the error message if the user explicitly turned it on.
521577df16aSPawel Wodkowski	CONFIG[VIRTIO]="n"
5229dd998cdSBen Walkerfi
5239dd998cdSBen Walker
524577df16aSPawel Wodkowskiif [ "${CONFIG[FIO_PLUGIN]}" = "y" ]; then
525577df16aSPawel Wodkowski	if [ -z "${CONFIG[FIO_SOURCE_DIR]}" ]; then
5269dd998cdSBen Walker		echo "When fio is enabled, you must specify the fio directory using --with-fio=path"
5279dd998cdSBen Walker		exit 1
5289dd998cdSBen Walker	fi
529577df16aSPawel Wodkowskielse
530577df16aSPawel Wodkowski	CONFIG[FIO_SOURCE_DIR]=
5319dd998cdSBen Walkerfi
5329dd998cdSBen Walker
533577df16aSPawel Wodkowskiif [ "${CONFIG[VTUNE]}" = "y" ]; then
534577df16aSPawel Wodkowski	if [ -z "${CONFIG[VTUNE_DIR]}" ]; then
5355712088aSRoman Sudarikov		echo "When VTune is enabled, you must specify the VTune directory using --with-vtune=path"
5365712088aSRoman Sudarikov		exit 1
5375712088aSRoman Sudarikov	fi
5385712088aSRoman Sudarikovfi
5395712088aSRoman Sudarikov
540577df16aSPawel Wodkowskiif [ "${CONFIG[ASAN]}" = "y" -a "${CONFIG[TSAN]}" = "y" ]; then
541830912e2SBen Walker	echo "ERROR: ASAN and TSAN cannot be enabled at the same time."
542830912e2SBen Walker	exit 1
543830912e2SBen Walkerfi
544830912e2SBen Walker
545*5a764955SMichal Bergerif [[ $sys_name == "FreeBSD" ]]; then
5465091cadcSPaul Luse	# FreeBSD doesn't support all configurations
547577df16aSPawel Wodkowski	if [[ "${CONFIG[COVERAGE]}" == "y" ]]; then
5485091cadcSPaul Luse		echo "ERROR: CONFIG_COVERAGE not available on FreeBSD"
5495091cadcSPaul Luse		exit 1
5505091cadcSPaul Luse	fi
5515091cadcSPaul Lusefi
5525091cadcSPaul Luse
553*5a764955SMichal Bergerif [[ $sys_name == "FreeBSD" ]]; then
55427b920a2SDarek Stojaczyk	if [[ "${CONFIG[VHOST]}" == "y" ]]; then
555873c8748STomasz Kulasek		echo "Vhost is only supported on Linux."
556873c8748STomasz Kulasek		exit 1
55727b920a2SDarek Stojaczyk	fi
558d43ee98cSTomasz Zawadzki	if [[ "${CONFIG[VHOST_INTERNAL_LIB]}" == "y" ]]; then
559873c8748STomasz Kulasek		echo "Internal rte_vhost library is only supported on Linux."
560873c8748STomasz Kulasek		exit 1
561d43ee98cSTomasz Zawadzki	fi
56227b920a2SDarek Stojaczyk	if [[ "${CONFIG[VIRTIO]}" == "y" ]]; then
563873c8748STomasz Kulasek		echo "Virtio is only supported on Linux."
564873c8748STomasz Kulasek		exit 1
56527b920a2SDarek Stojaczyk	fi
56627b920a2SDarek Stojaczykfi
56727b920a2SDarek Stojaczyk
568577df16aSPawel Wodkowskiif [ "${CONFIG[RDMA]}" = "y" ]; then
569eed0c6beSDarek Stojaczyk	if ! echo -e '#include <infiniband/verbs.h>\n#include <rdma/rdma_verbs.h>\n' \
570eed0c6beSDarek Stojaczyk		'int main(void) { return 0; }\n' \
57143a713f9SSeth Howell		| ${BUILD_CMD[@]} -libverbs -lrdmacm - 2>/dev/null; then
572eed0c6beSDarek Stojaczyk		echo --with-rdma requires libverbs and librdmacm.
573eed0c6beSDarek Stojaczyk		echo Please install then re-run this script.
574eed0c6beSDarek Stojaczyk		exit 1
575eed0c6beSDarek Stojaczyk	fi
576eed0c6beSDarek Stojaczyk
577eed0c6beSDarek Stojaczyk	if echo -e '#include <infiniband/verbs.h>\n' \
578eed0c6beSDarek Stojaczyk		'int main(void) { return !!IBV_WR_SEND_WITH_INV; }\n' \
57943a713f9SSeth Howell		| ${BUILD_CMD[@]} -c - 2>/dev/null; then
580577df16aSPawel Wodkowski		CONFIG[RDMA_SEND_WITH_INVAL]="y"
5817671073bSSeth Howell	else
582577df16aSPawel Wodkowski		CONFIG[RDMA_SEND_WITH_INVAL]="n"
58317a819f8SJim Harris		echo "
5847671073bSSeth Howell*******************************************************************************
5857671073bSSeth HowellWARNING: The Infiniband Verbs opcode Send With Invalidate is either not
5867671073bSSeth Howellsupported or is not functional with the current version of libibverbs installed
5877671073bSSeth Howellon this system. Please upgrade to at least version 1.1.
5887671073bSSeth Howell
5897671073bSSeth HowellBeginning with Linux kernel 4.14, the kernel NVMe-oF initiator leverages Send
5907671073bSSeth HowellWith Invalidate RDMA operations to improve performance. Failing to use the
5917671073bSSeth HowellSend With Invalidate operation on the NVMe-oF target side results in full
5927671073bSSeth Howellfunctionality, but greatly reduced performance. The SPDK NVMe-oF target will
5937671073bSSeth Howellbe unable to leverage that operation using the currently installed version
5947671073bSSeth Howellof libibverbs, so Linux kernel NVMe-oF initiators based on kernels greater
5957671073bSSeth Howellthan or equal to 4.14 will see significantly reduced performance.
59617a819f8SJim Harris*******************************************************************************"
5977671073bSSeth Howell	fi
59894966468SAlexey Marchuk
59994966468SAlexey Marchuk	if echo -e '#include <rdma/rdma_cma.h>\n' \
60094966468SAlexey Marchuk		'int main(void) { return !!RDMA_OPTION_ID_ACK_TIMEOUT; }\n' \
60194966468SAlexey Marchuk		| ${BUILD_CMD[@]} -c - 2>/dev/null; then
60294966468SAlexey Marchuk		CONFIG[RDMA_SET_ACK_TIMEOUT]="y"
60394966468SAlexey Marchuk	else
60494966468SAlexey Marchuk		CONFIG[RDMA_SET_ACK_TIMEOUT]="n"
60594966468SAlexey Marchuk		echo "RDMA_OPTION_ID_ACK_TIMEOUT is not supported"
60694966468SAlexey Marchuk	fi
60794966468SAlexey Marchuk
6087671073bSSeth Howellfi
6097671073bSSeth Howell
610ed56a3d4SAnil Veerabhadrappaif [[ "${CONFIG[FC]}" = "y" ]]; then
611ed56a3d4SAnil Veerabhadrappa	if [[ -n "${CONFIG[FC_PATH]}" ]]; then
612ed56a3d4SAnil Veerabhadrappa		if [ ! -d "${CONFIG[FC_PATH]}" ]; then
613ed56a3d4SAnil Veerabhadrappa			echo "${CONFIG[FC_PATH]}: directory not found"
614ed56a3d4SAnil Veerabhadrappa			exit 1
615ed56a3d4SAnil Veerabhadrappa		fi
616ed56a3d4SAnil Veerabhadrappa	fi
617ed56a3d4SAnil Veerabhadrappafi
618ed56a3d4SAnil Veerabhadrappa
619552e21ccSZiye Yangif [[ "${CONFIG[ISAL]}" = "y" ]] || [[ "${CONFIG[CRYPTO]}" = "y" ]]; then
620325010bfSRichael Zhuang	if [[ "${HAVE_NASM}" = "n" ]] && [[ $arch == x86_64* ]]; then
621873c8748STomasz Kulasek		echo "ERROR: ISA-L, compression & crypto require NASM version 2.13.03 or newer."
622873c8748STomasz Kulasek		echo "Please install or upgrade them re-run this script."
623873c8748STomasz Kulasek		exit 1
624552e21ccSZiye Yang	else
625552e21ccSZiye Yang		if [[ "${CONFIG[CRYPTO]}" = "y" ]]; then
626552e21ccSZiye Yang			CONFIG[IPSEC_MB]=y
627552e21ccSZiye Yang		fi
628552e21ccSZiye Yang	fi
629552e21ccSZiye Yangfi
630552e21ccSZiye Yang
631552e21ccSZiye Yangif [[ "${CONFIG[ISAL]}" = "y" ]]; then
632385f42ebSDarek Stojaczyk	if [ ! -f "$rootdir"/isa-l/autogen.sh ]; then
633a89dbbffSBen Walker		echo "ISA-L was not found; To install ISA-L run:"
634552e21ccSZiye Yang		echo "  git submodule update --init"
635b324f73cSPaul Luse		exit 1
6360fb1e1c5SPaul Luse	fi
637552e21ccSZiye Yang
638552e21ccSZiye Yang	cd $rootdir/isa-l
639e4aee795SAlexey Marchuk	ISAL_LOG=$rootdir/isa-l/spdk-isal.log
640552e21ccSZiye Yang	echo -n "Configuring ISA-L (logfile: $ISAL_LOG)..."
641552e21ccSZiye Yang	./autogen.sh &> $ISAL_LOG
642552e21ccSZiye Yang	./configure CFLAGS="-fPIC -g -O2" --enable-shared=no >> $ISAL_LOG 2>&1
643552e21ccSZiye Yang	echo "done."
644552e21ccSZiye Yang	cd $rootdir
645552e21ccSZiye Yangfi
6467671073bSSeth Howell
647ce711726SDarek Stojaczykif [[ "${CONFIG[PMDK]}" = "y" ]]; then
648ce711726SDarek Stojaczyk	if ! echo -e '#include <libpmemblk.h>\nint main(void) { return 0; }\n' \
64943a713f9SSeth Howell		| ${BUILD_CMD[@]} -lpmemblk - 2>/dev/null; then
650ce711726SDarek Stojaczyk		echo --with-pmdk requires libpmemblk.
651ce711726SDarek Stojaczyk		echo Please install then re-run this script.
652ce711726SDarek Stojaczyk		exit 1
653ce711726SDarek Stojaczyk	fi
654ce711726SDarek Stojaczykfi
655ce711726SDarek Stojaczyk
65697022803SJim Harrisif [[ "${CONFIG[REDUCE]}" = "y" ]]; then
657c4a3b312SDarek Stojaczyk	if ! echo -e '#include <libpmem.h>\nint main(void) { return 0; }\n' \
65843a713f9SSeth Howell		| ${BUILD_CMD[@]} -lpmem - 2>/dev/null; then
65997022803SJim Harris		echo --with-reduce requires libpmem.
66097022803SJim Harris		echo Please install then re-run this script.
66197022803SJim Harris		exit 1
66297022803SJim Harris	fi
66397022803SJim Harrisfi
66497022803SJim Harris
66514a62d67STomasz Kulasekif [[ "${CONFIG[VPP]}" = "y" ]]; then
66614a62d67STomasz Kulasek	if [ ! -z "${CONFIG[VPP_DIR]}" ]; then
66714a62d67STomasz Kulasek		VPP_CFLAGS="-L${CONFIG[VPP_DIR]}/lib -I${CONFIG[VPP_DIR]}/include"
66814a62d67STomasz Kulasek	fi
66914a62d67STomasz Kulasek	if ! echo -e '#include <vnet/session/application_interface.h>\nint main(void) { return 0; }\n' \
67043a713f9SSeth Howell		| ${BUILD_CMD[@]} ${VPP_CFLAGS} -lvppinfra -lsvm -lvlibmemoryclient - 2>/dev/null; then
67114a62d67STomasz Kulasek		echo --with-vpp requires installed vpp.
67214a62d67STomasz Kulasek		echo Please install then re-run this script.
67314a62d67STomasz Kulasek		exit 1
67414a62d67STomasz Kulasek	fi
67514a62d67STomasz Kulasekfi
67614a62d67STomasz Kulasek
677805d9942STomasz Kulasekif [[ "${CONFIG[NVME_CUSE]}" = "y" ]]; then
678805d9942STomasz 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' \
679805d9942STomasz Kulasek		| ${BUILD_CMD[@]} -lfuse3 -D_FILE_OFFSET_BITS=64 - 2>/dev/null; then
680805d9942STomasz Kulasek		echo --with-cuse requires libfuse3.
681805d9942STomasz Kulasek		echo Please install then re-run this script.
682805d9942STomasz Kulasek		exit 1
683805d9942STomasz Kulasek	fi
684805d9942STomasz Kulasekfi
685805d9942STomasz Kulasek
68655bd0d3aSDarek Stojaczykif [[ "${CONFIG[RBD]}" = "y" ]]; then
68755bd0d3aSDarek Stojaczyk	if ! echo -e '#include <rbd/librbd.h>\n#include <rados/librados.h>\n' \
68855bd0d3aSDarek Stojaczyk		'int main(void) { return 0; }\n' \
68943a713f9SSeth Howell		| ${BUILD_CMD[@]} -lrados -lrbd - 2>/dev/null; then
69055bd0d3aSDarek Stojaczyk		echo --with-rbd requires librados and librbd.
69155bd0d3aSDarek Stojaczyk		echo Please install then re-run this script.
69255bd0d3aSDarek Stojaczyk		exit 1
69355bd0d3aSDarek Stojaczyk	fi
69455bd0d3aSDarek Stojaczykfi
69555bd0d3aSDarek Stojaczyk
6965cb18040SDarek Stojaczykif [[ "${CONFIG[ISCSI_INITIATOR]}" = "y" ]]; then
6975cb18040SDarek Stojaczyk	# Fedora installs libiscsi to /usr/lib64/iscsi for some reason.
6985cb18040SDarek Stojaczyk	if ! echo -e '#include <iscsi/iscsi.h>\n#include <iscsi/scsi-lowlevel.h>\n' \
6995cb18040SDarek Stojaczyk		'#if LIBISCSI_API_VERSION < 20150621\n' \
7005cb18040SDarek Stojaczyk		'#error\n' \
7015cb18040SDarek Stojaczyk		'#endif\n' \
7025cb18040SDarek Stojaczyk		'int main(void) { return 0; }\n' \
70343a713f9SSeth Howell		| ${BUILD_CMD[@]} -L/usr/lib64/iscsi -liscsi - 2>/dev/null; then
7045cb18040SDarek Stojaczyk		echo --with-iscsi-initiator requires libiscsi with
7055cb18040SDarek Stojaczyk		echo 'LIBISCSI_API_VERSION >= 20150621.'
7065cb18040SDarek Stojaczyk		echo Please install then re-run this script.
7075cb18040SDarek Stojaczyk		exit 1
7085cb18040SDarek Stojaczyk	fi
7095cb18040SDarek Stojaczykfi
7105cb18040SDarek Stojaczyk
71102406e56SDarek Stojaczykif [[ "${CONFIG[LOG_BACKTRACE]}" = "y" ]]; then
71202406e56SDarek Stojaczyk	if ! echo -e '#include <libunwind.h>\nint main(void) { return 0; }\n' \
71343a713f9SSeth Howell		| ${BUILD_CMD[@]} -lunwind - 2>/dev/null; then
71402406e56SDarek Stojaczyk		echo --enable-log-bt requires libunwind.
71502406e56SDarek Stojaczyk		echo Please install then re-run this script.
71602406e56SDarek Stojaczyk		exit 1
71702406e56SDarek Stojaczyk	fi
71802406e56SDarek Stojaczykfi
71902406e56SDarek Stojaczyk
7203674c1d3SDarek Stojaczykif [[ "${CONFIG[ASAN]}" = "y" ]]; then
7213674c1d3SDarek Stojaczyk	if ! echo -e 'int main(void) { return 0; }\n' \
72243a713f9SSeth Howell		| ${BUILD_CMD[@]} -fsanitize=address - 2>/dev/null; then
7233674c1d3SDarek Stojaczyk		echo --enable-asan requires libasan.
7243674c1d3SDarek Stojaczyk		echo Please install then re-run this script.
7253674c1d3SDarek Stojaczyk		exit 1
7263674c1d3SDarek Stojaczyk	fi
7273674c1d3SDarek Stojaczykfi
7283674c1d3SDarek Stojaczyk
7293674c1d3SDarek Stojaczykif [[ "${CONFIG[UBSAN]}" = "y" ]]; then
7303674c1d3SDarek Stojaczyk	if ! echo -e 'int main(void) { return 0; }\n' \
73143a713f9SSeth Howell		| ${BUILD_CMD[@]} -fsanitize=undefined - 2>/dev/null; then
7323674c1d3SDarek Stojaczyk		echo --enable-ubsan requires libubsan.
7333674c1d3SDarek Stojaczyk		echo Please install then re-run this script.
7343674c1d3SDarek Stojaczyk		exit 1
7353674c1d3SDarek Stojaczyk	fi
7363674c1d3SDarek Stojaczykfi
7373674c1d3SDarek Stojaczyk
7383674c1d3SDarek Stojaczykif [[ "${CONFIG[TSAN]}" = "y" ]]; then
7393674c1d3SDarek Stojaczyk	if ! echo -e 'int main(void) { return 0; }\n' \
74043a713f9SSeth Howell		| ${BUILD_CMD[@]} -fsanitize=thread - 2>/dev/null; then
7413674c1d3SDarek Stojaczyk		echo --enable-tsan requires libtsan.
7423674c1d3SDarek Stojaczyk		echo Please install then re-run this script.
7433674c1d3SDarek Stojaczyk		exit 1
7443674c1d3SDarek Stojaczyk	fi
7453674c1d3SDarek Stojaczykfi
7463674c1d3SDarek Stojaczyk
747d1fee489SVitaliy Mysakif [[ "${CONFIG[OCF]}" = "y" ]]; then
748d1fee489SVitaliy Mysak	# If OCF_PATH is a file, assume it is a library and use it to compile with
749d1fee489SVitaliy Mysak	if [ -f ${CONFIG[OCF_PATH]} ]; then
750d1fee489SVitaliy Mysak		CONFIG[CUSTOMOCF]=y
751d1fee489SVitaliy Mysak	else
752d1fee489SVitaliy Mysak		CONFIG[CUSTOMOCF]=n
753d1fee489SVitaliy Mysak	fi
754d1fee489SVitaliy Mysakfi
755d1fee489SVitaliy Mysak
756995d60f4SBen Walkerif [[ "${CONFIG[PGO_CAPTURE]}" = "y" && "${CONFIG[PGO_USE]}" = "y" ]]; then
757995d60f4SBen Walker	echo "ERROR: --enable-pgo-capture and --enable-pgo-use are mutually exclusive."
758995d60f4SBen Walker	exit 1
759954728e9SBen Walkerelif [[ "${CONFIG[PGO_USE]}" = "y" ]]; then
760954728e9SBen Walker	if [[ "$CC_TYPE" = "clang" ]]; then
761954728e9SBen Walker		# For clang we need to run an extra step on gathered profiling data.
762954728e9SBen Walker		echo "Generating suitable profile data"
763954728e9SBen Walker		llvm-profdata merge -output=build/pgo/default.profdata build/pgo
764954728e9SBen Walker	fi
765995d60f4SBen Walkerfi
766995d60f4SBen Walker
7678165bf71SBen Walkerif [[ "${CONFIG[URING]}" = "y" ]]; then
7688165bf71SBen Walker	if [[ -n "${CONFIG[URING_PATH]}" ]]; then
7698165bf71SBen Walker		if [ ! -d "${CONFIG[URING_PATH]}" ]; then
7708165bf71SBen Walker			echo "${CONFIG[URING_PATH]}: directory not found"
7718165bf71SBen Walker			exit 1
7728165bf71SBen Walker		fi
7738165bf71SBen Walker	fi
7748165bf71SBen Walkerfi
775995d60f4SBen Walker
7767fa15e28SXiaodong Liuif [[ "${CONFIG[FUSE]}" = "y" ]]; then
7777fa15e28SXiaodong Liu	if [[ ! -d /usr/include/fuse3 ]] && [[ ! -d /usr/local/include/fuse3 ]]; then
7787fa15e28SXiaodong Liu		echo "--with-fuse requires libfuse3."
7797fa15e28SXiaodong Liu		echo "Please install then re-run this script."
7807fa15e28SXiaodong Liu		exit 1
7817fa15e28SXiaodong Liu	fi
7827fa15e28SXiaodong Liufi
7837fa15e28SXiaodong Liu
78448f70f48SPawel Wodkowski# We are now ready to generate final configuration. But first do sanity
78548f70f48SPawel Wodkowski# check to see if all keys in CONFIG array have its reflection in CONFIG file.
786e62a3c65SSeth Howellif [ $(egrep -c "^\s*CONFIG_[[:alnum:]_]+=" $rootdir/CONFIG) -ne ${#CONFIG[@]} ]; then
78748f70f48SPawel Wodkowski	echo ""
78848f70f48SPawel Wodkowski	echo "BUG: Some configuration options are not present in CONFIG file. Please update this file."
78948f70f48SPawel Wodkowski	echo "Missing options in CONFIG (+) file and in current config (-): "
79048f70f48SPawel Wodkowski	diff -u --label "CONFIG file" --label "CONFIG[@]" \
79185bc2bbeSPawel Wodkowski		<(sed -r -e '/^\s*$/d; /^\s*#.*/d; s/(CONFIG_[[:alnum:]_]+)=.*/\1/g' CONFIG | sort) \
79248f70f48SPawel Wodkowski		<(printf "CONFIG_%s\n" ${!CONFIG[@]} | sort)
79348f70f48SPawel Wodkowski	exit 1
79448f70f48SPawel Wodkowskifi
79548f70f48SPawel Wodkowski
79685bc2bbeSPawel Wodkowskiecho -n "Creating mk/config.mk..."
797e62a3c65SSeth Howellcp -f $rootdir/CONFIG $rootdir/mk/config.mk
798577df16aSPawel Wodkowskifor key in ${!CONFIG[@]}; do
799e62a3c65SSeth Howell	sed -i.bak -r "s#^\s*CONFIG_${key}=.*#CONFIG_${key}\?=${CONFIG[$key]}#g" $rootdir/mk/config.mk
800577df16aSPawel Wodkowskidone
801577df16aSPawel Wodkowski# On FreeBSD sed -i 'SUFFIX' - SUFFIX is mandatory. So no way but to delete the backed file.
802e62a3c65SSeth Howellrm -f $rootdir/mk/config.mk.bak
803baa6eac0SDarek Stojaczykecho "done."
8049dd998cdSBen Walker
80508ec96ebSDaniel Verkamp# Environment variables
806baa6eac0SDarek Stojaczykecho -n "Creating mk/cc.flags.mk..."
807e62a3c65SSeth Howellrm -f $rootdir/mk/cc.flags.mk
808e62a3c65SSeth Howell[ -n "$CFLAGS" ] && echo "CFLAGS?=$CFLAGS" > $rootdir/mk/cc.flags.mk
809e62a3c65SSeth Howell[ -n "$CXXFLAGS" ] && echo "CXXFLAGS?=$CXXFLAGS" >> $rootdir/mk/cc.flags.mk
810e62a3c65SSeth Howell[ -n "$LDFLAGS" ] && echo "LDFLAGS?=$LDFLAGS" >> $rootdir/mk/cc.flags.mk
811e62a3c65SSeth Howell[ -n "$DESTDIR" ] && echo "DESTDIR?=$DESTDIR" >> $rootdir/mk/cc.flags.mk
8120b56a5b4SJim Harrisecho "done."
81385bc2bbeSPawel Wodkowski
814*5a764955SMichal Bergerif [[ $sys_name == "FreeBSD" ]]; then
815870ce250SPaul Luse	echo "Type 'gmake' to build."
816870ce250SPaul Luseelse
8170b56a5b4SJim Harris	echo "Type 'make' to build."
818870ce250SPaul Lusefi
8199dd998cdSBen Walker
8209dd998cdSBen Walkerexit 0
821