summaryrefslogtreecommitdiffstats
path: root/src/spdk/configure
diff options
context:
space:
mode:
Diffstat (limited to 'src/spdk/configure')
-rwxr-xr-xsrc/spdk/configure860
1 files changed, 860 insertions, 0 deletions
diff --git a/src/spdk/configure b/src/spdk/configure
new file mode 100755
index 000000000..4c9772adf
--- /dev/null
+++ b/src/spdk/configure
@@ -0,0 +1,860 @@
+#!/usr/bin/env bash
+
+set -e
+
+trap 'echo -e "\n\nConfiguration failed\n\n" >&2' ERR
+
+rootdir=$(readlink -f $(dirname $0))
+
+function usage()
+{
+ echo "'configure' configures SPDK to compile on supported platforms."
+ echo ""
+ echo "Usage: ./configure [OPTION]..."
+ echo ""
+ echo "Defaults for the options are specified in brackets."
+ echo ""
+ echo "General:"
+ echo " -h, --help Display this help and exit"
+ echo ""
+ echo " --prefix=path Configure installation prefix (default: /usr/local)"
+ echo " --target-arch=arch Target build architecture. Must be a valid GNU arch. Default: native"
+ echo ""
+ echo " --cross-prefix=prefix Prefix for cross compilation (default: none)"
+ echo " example: aarch64-linux-gnu"
+ echo ""
+ echo " --enable-debug Configure for debug builds"
+ echo " --enable-werror Treat compiler warnings as errors"
+ echo " --enable-asan Enable address sanitizer"
+ echo " --enable-ubsan Enable undefined behavior sanitizer"
+ echo " --enable-coverage Enable code coverage tracking"
+ echo " --enable-lto Enable link-time optimization"
+ echo " --enable-pgo-capture Enable generation of profile guided optimization data"
+ echo " --enable-pgo-use Use previously captured profile guided optimization data"
+ echo " --disable-tests Disable building of functional tests"
+ echo " --disable-unit-tests Disable building of unit tests"
+ echo " --disable-examples Disable building of examples"
+ echo ""
+ echo "Specifying Dependencies:"
+ echo "--with-DEPENDENCY[=path] Use the given dependency. Optionally, provide the"
+ echo " path."
+ echo "--without-DEPENDENCY Do not link to the given dependency. This may"
+ echo " disable features and components."
+ echo ""
+ echo "Valid dependencies are listed below."
+ echo " dpdk Build against a custom dpdk version. By default, the dpdk"
+ echo " submodule in spdk tree will be used."
+ echo " example: /usr/share/dpdk/x86_64-default-linuxapp-gcc"
+ echo " env Use an alternate environment implementation instead of DPDK."
+ echo " Implies --without-dpdk."
+ echo " igb-uio-driver Build DPDK's igb-uio driver."
+ echo " Required on some systems to use qat devices. This flag is"
+ echo " effective only with the default dpdk submodule."
+ echo " No path required"
+ echo " idxd Build the IDXD library and accel framework plug-in module."
+ echo " Disabled while experimental. Only built for x86 when enabled."
+ echo " crypto Build vbdev crypto module."
+ echo " No path required."
+ echo " fio Build fio_plugin."
+ echo " default: /usr/src/fio"
+ echo " vhost Build vhost target. Enabled by default."
+ echo " No path required."
+ echo " internal-vhost-lib Use the internal copy of rte_vhost. By default, the upstream"
+ echo " rte_vhost from DPDK will be used."
+ echo " No path required."
+ echo " virtio Build vhost initiator and virtio-pci bdev modules."
+ echo " No path required."
+ echo " pmdk Build persistent memory bdev."
+ echo " example: /usr/share/pmdk"
+ echo " reduce Build vbdev compression module."
+ echo " No path required."
+ echo " vpp Build VPP net module."
+ echo " example: /vpp_repo/build-root/rpmbuild/vpp-18.01.1.0/build-root/install-vpp-native/vpp"
+ echo " rbd Build Ceph RBD bdev module."
+ echo " No path required."
+ echo " rdma Build RDMA transport for NVMf target and initiator."
+ echo " Accepts optional RDMA provider name. Can be \"verbs\" or \"mlx5_dv\"."
+ echo " If no provider specified, \"verbs\" provider is used by default."
+ echo " fc Build FC transport for NVMf target."
+ echo " If an argument is provided, it is considered a directory containing"
+ echo " libufc.a and fc_lld.h. Otherwise the regular system paths will"
+ echo " be searched."
+ echo " shared Build spdk shared libraries."
+ echo " No path required."
+ echo " iscsi-initiator Build with iscsi bdev module."
+ echo " No path required."
+ echo " vtune Required to profile I/O under Intel VTune Amplifier XE."
+ echo " example: /opt/intel/vtune_amplifier_xe_version"
+ echo " ocf Build OCF library and bdev module."
+ echo " If argument is directory, interpret it as root of OCF repo"
+ echo " If argument is file, interpret it as compiled OCF lib"
+ echo " If no argument is specified, OCF git submodule is used by default"
+ echo " example: /usr/src/ocf/"
+ echo " isal Build with ISA-L. Enabled by default on x86 and aarch64 architectures."
+ echo " No path required."
+ echo " uring Build I/O uring bdev or socket module."
+ echo " If an argument is provided, it is considered a directory containing"
+ echo " liburing.a and io_uring.h. Otherwise the regular system paths will"
+ echo " be searched."
+ echo " fuse Build FUSE components for mounting a blobfs filesystem."
+ echo " No path required."
+ echo " nvme-cuse Build NVMe driver with support for CUSE-based character devices."
+ echo " No path required."
+ echo " raid5 Build with bdev_raid module RAID5 support."
+ echo " No path required."
+ echo ""
+ echo "Environment variables:"
+ echo ""
+ echo "CC C compiler"
+ echo "CFLAGS C compiler flags"
+ echo "CXX C++ compiler"
+ echo "CXXFLAGS C++ compiler flags"
+ echo "LD Linker"
+ echo "LDFLAGS Linker flags"
+ echo "DESTDIR Destination for 'make install'"
+ echo ""
+}
+
+# Load default values
+# Convert config to sourcable configuration file
+sed -r 's/CONFIG_([[:alnum:]_]+)=(.*)/CONFIG[\1]=\2/g' $rootdir/CONFIG > $rootdir/CONFIG.sh
+declare -A CONFIG
+source $rootdir/CONFIG.sh
+rm $rootdir/CONFIG.sh
+
+for i in "$@"; do
+ case "$i" in
+ --cross-prefix=*)
+ CONFIG[CROSS_PREFIX]="${i#*=}"
+ ;;
+ --enable-lto)
+ CONFIG[LTO]=y
+ ;;
+ --disable-lto)
+ CONFIG[LTO]=n
+ ;;
+ esac
+done
+
+# Detect the compiler toolchain
+$rootdir/scripts/detect_cc.sh --cc="$CC" --cxx="$CXX" --lto="${CONFIG[LTO]}" --ld="$LD" --cross-prefix="${CONFIG[CROSS_PREFIX]}" > $rootdir/mk/cc.mk
+
+CC=$(cat $rootdir/mk/cc.mk | grep "DEFAULT_CC=" | sed s/DEFAULT_CC=//)
+CC_TYPE=$(cat $rootdir/mk/cc.mk | grep "CC_TYPE=" | cut -d "=" -f 2)
+
+arch=$($CC -dumpmachine)
+sys_name=$(uname -s)
+
+# Sanitize default configuration. All parameters set by user explicit should fail
+# Force no ISA-L if non-x86 or non-aarch64 architecture
+if [[ "${CONFIG[ISAL]}" = "y" ]]; then
+ if [[ $arch != x86_64* ]] && [[ $arch != aarch64* ]]; then
+ CONFIG[ISAL]=n
+ echo "Notice: ISA-L not supported for ${arch}. Turning off default feature."
+ fi
+fi
+
+if [[ $sys_name == "FreeBSD" ]]; then
+ # Vhost, rte_vhost library and virtio are only supported on Linux.
+ CONFIG[VHOST]="n"
+ CONFIG[VHOST_INTERNAL_LIB]="n"
+ CONFIG[VIRTIO]="n"
+ echo "Notice: Vhost, rte_vhost library and virtio are only supported on Linux. Turning off default feature."
+fi
+
+#check nasm only on x86
+if [[ $arch == x86_64* ]]; then
+ ver=$(nasm -v 2>/dev/null | awk '{print $3}' | sed 's/[^0-9]*//g')
+ if [[ "${ver:0:1}" -le "2" ]] && [[ "${ver:0:3}" -le "213" ]] && [[ "${ver:0:5}" -lt "21303" ]]; then
+ # ISA-L, compression & crypto require NASM version 2.13.03 or newer.
+ CONFIG[ISAL]=n
+ CONFIG[CRYPTO]=n
+ CONFIG[IPSEC_MB]=n
+ CONFIG[REDUCE]=n
+ HAVE_NASM=n
+ echo "Notice: ISA-L, compression & crypto require NASM version 2.13.03 or newer. Turning off default ISA-L and crypto features."
+ else
+ HAVE_NASM=y
+ fi
+fi
+
+function check_dir() {
+ arg="$1"
+ dir="${arg#*=}"
+ if [ ! -d "$dir" ]; then
+ echo "$arg: directory not found"
+ exit 1
+ fi
+}
+
+for i in "$@"; do
+ case "$i" in
+ -h|--help)
+ usage
+ exit 0
+ ;;
+ --cross-prefix=*) ;&
+ --enable-lto) ;&
+ --disable-lto)
+ # Options handled before detecting CC.
+ ;;
+ --prefix=*)
+ CONFIG[PREFIX]="${i#*=}"
+ ;;
+ --target-arch=*)
+ CONFIG[ARCH]="${i#*=}"
+ ;;
+ --enable-debug)
+ CONFIG[DEBUG]=y
+ ;;
+ --disable-debug)
+ CONFIG[DEBUG]=n
+ ;;
+ --enable-asan)
+ CONFIG[ASAN]=y
+ ;;
+ --disable-asan)
+ CONFIG[ASAN]=n
+ ;;
+ --enable-ubsan)
+ CONFIG[UBSAN]=y
+ ;;
+ --disable-ubsan)
+ CONFIG[UBSAN]=n
+ ;;
+ --enable-tsan)
+ CONFIG[TSAN]=y
+ ;;
+ --disable-tsan)
+ CONFIG[TSAN]=n
+ ;;
+ --enable-coverage)
+ CONFIG[COVERAGE]=y
+ ;;
+ --disable-coverage)
+ CONFIG[COVERAGE]=n
+ ;;
+ --enable-pgo-capture)
+ CONFIG[PGO_CAPTURE]=y
+ ;;
+ --disable-pgo-capture)
+ CONFIG[PGO_CAPTURE]=n
+ ;;
+ --enable-pgo-use)
+ CONFIG[PGO_USE]=y
+ ;;
+ --disable-pgo-use)
+ CONFIG[PGO_USE]=n
+ ;;
+ --enable-tests)
+ CONFIG[TESTS]=y
+ ;;
+ --disable-tests)
+ CONFIG[TESTS]=n
+ ;;
+ --enable-unit-tests)
+ CONFIG[UNIT_TESTS]=y
+ ;;
+ --disable-unit-tests)
+ CONFIG[UNIT_TESTS]=n
+ ;;
+ --enable-examples)
+ CONFIG[EXAMPLES]=y
+ ;;
+ --disable-examples)
+ CONFIG[EXAMPLES]=n
+ ;;
+ --enable-werror)
+ CONFIG[WERROR]=y
+ ;;
+ --disable-werror)
+ CONFIG[WERROR]=n
+ ;;
+ --with-dpdk=*)
+ check_dir "$i"
+ CONFIG[DPDK_DIR]=$(readlink -f ${i#*=})
+ ;;
+ --without-dpdk)
+ CONFIG[DPDK_DIR]=
+ ;;
+ --with-env=*)
+ CONFIG[ENV]="${i#*=}"
+ ;;
+ --with-rbd)
+ CONFIG[RBD]=y
+ ;;
+ --without-rbd)
+ CONFIG[RBD]=n
+ ;;
+ --with-rdma=*)
+ CONFIG[RDMA]=y
+ CONFIG[RDMA_PROV]=${i#*=}
+ ;;
+ --with-rdma)
+ CONFIG[RDMA]=y
+ CONFIG[RDMA_PROV]="verbs"
+ ;;
+ --without-rdma)
+ CONFIG[RDMA]=n
+ ;;
+ --with-fc=*)
+ CONFIG[FC]=y
+ CONFIG[FC_PATH]=$(readlink -f ${i#*=})
+ ;;
+ --with-fc)
+ CONFIG[FC]=y
+ CONFIG[FC_PATH]=
+ ;;
+ --without-fc)
+ CONFIG[FC]=n
+ CONFIG[FC_PATH]=
+ ;;
+ --with-shared)
+ CONFIG[SHARED]=y
+ ;;
+ --without-shared)
+ CONFIG[SHARED]=n
+ ;;
+ --with-iscsi-initiator)
+ CONFIG[ISCSI_INITIATOR]=y
+ ;;
+ --without-iscsi-initiator)
+ CONFIG[ISCSI_INITIATOR]=n
+ ;;
+ --with-crypto)
+ CONFIG[CRYPTO]=y
+ ;;
+ --without-crypto)
+ CONFIG[CRYPTO]=n
+ ;;
+ --with-vhost)
+ CONFIG[VHOST]=y
+ ;;
+ --without-vhost)
+ CONFIG[VHOST]=n
+ ;;
+ --with-internal-vhost-lib)
+ CONFIG[VHOST_INTERNAL_LIB]=y
+ ;;
+ --without-internal-vhost-lib)
+ CONFIG[VHOST_INTERNAL_LIB]=n
+ ;;
+ --with-virtio)
+ CONFIG[VIRTIO]=y
+ ;;
+ --without-virtio)
+ CONFIG[VIRTIO]=n
+ ;;
+ --with-pmdk)
+ CONFIG[PMDK]=y
+ CONFIG[PMDK_DIR]=""
+ ;;
+ --with-pmdk=*)
+ CONFIG[PMDK]=y
+ check_dir "$i"
+ CONFIG[PMDK_DIR]=$(readlink -f ${i#*=})
+ ;;
+ --without-pmdk)
+ CONFIG[PMDK]=n
+ ;;
+ --with-reduce)
+ CONFIG[REDUCE]=y
+ ;;
+ --without-reduce)
+ CONFIG[REDUCE]=n
+ ;;
+ --with-vpp)
+ CONFIG[VPP]=y
+ ;;
+ --with-vpp=*)
+ CONFIG[VPP]=y
+ check_dir "$i"
+ CONFIG[VPP_DIR]=$(readlink -f ${i#*=})
+ ;;
+ --without-vpp)
+ CONFIG[VPP]=n
+ ;;
+ --with-fio) ;&
+ --with-fio=*)
+ if [[ ${i#*=} != "$i" ]]; then
+ CONFIG[FIO_SOURCE_DIR]=$(readlink -f "${i#*=}")
+ fi
+ check_dir "--with-fio=${CONFIG[FIO_SOURCE_DIR]}"
+ CONFIG[FIO_PLUGIN]=y
+ ;;
+ --without-fio)
+ CONFIG[FIO_PLUGIN]=n
+ ;;
+ --with-vtune=*)
+ check_dir "$i"
+ CONFIG[VTUNE_DIR]="${i#*=}"
+ CONFIG[VTUNE]=y
+ ;;
+ --without-vtune)
+ CONFIG[VTUNE_DIR]=
+ CONFIG[VTUNE]=n
+ ;;
+ --with-igb-uio-driver)
+ CONFIG[IGB_UIO_DRIVER]=y
+ ;;
+ --without-igb-uio-driver)
+ CONFIG[IGB_UIO_DRIVER]=n
+ ;;
+ --with-ocf)
+ CONFIG[OCF]=y
+ CONFIG[OCF_PATH]=$(readlink -f "./ocf")
+ ;;
+ --with-ocf=*)
+ CONFIG[OCF]=y
+ CONFIG[OCF_PATH]=$(readlink -f ${i#*=})
+ ;;
+ --without-ocf)
+ CONFIG[OCF]=n
+ CONFIG[OCF_PATH]=
+ ;;
+ --with-isal)
+ CONFIG[ISAL]=y
+ ;;
+ --without-isal)
+ CONFIG[ISAL]=n
+ ;;
+ --with-uring=*)
+ CONFIG[URING]=y
+ CONFIG[URING_PATH]=$(readlink -f ${i#*=})
+ ;;
+ --with-uring)
+ CONFIG[URING]=y
+ CONFIG[URING_PATH]=
+ ;;
+ --without-uring)
+ CONFIG[URING]=n
+ CONFIG[URING_PATH]=
+ ;;
+ --with-fuse)
+ CONFIG[FUSE]=y
+ ;;
+ --without-fuse)
+ CONFIG[FUSE]=n
+ ;;
+ --with-nvme-cuse)
+ CONFIG[NVME_CUSE]=y
+ ;;
+ --without-nvme-cuse)
+ CONFIG[NVME_CUSE]=n
+ ;;
+ --with-raid5)
+ CONFIG[RAID5]=y
+ ;;
+ --without-raid5)
+ CONFIG[RAID5]=n
+ ;;
+ --with-idxd)
+ CONFIG[IDXD]=y
+ ;;
+ --without-idxd)
+ CONFIG[IDXD]=n
+ ;;
+ --)
+ break
+ ;;
+ *)
+ echo "Unrecognized option $i"
+ usage
+ exit 1
+ esac
+done
+
+if [[ $arch == x86_64* ]]; then
+ BUILD_CMD=($CC -o /dev/null -x c $CPPFLAGS $CFLAGS $LDFLAGS -march=native)
+else
+ BUILD_CMD=($CC -o /dev/null -x c $CPPFLAGS $CFLAGS $LDFLAGS)
+fi
+BUILD_CMD+=(-I/usr/local/include -L/usr/local/lib)
+
+# IDXD uses Intel specific instructions.
+if [[ "${CONFIG[IDXD]}" = "y" ]]; then
+ if [ $(uname -s) == "FreeBSD" ]; then
+ intel="hw.model: Intel"
+ cpu_vendor=$(sysctl -a | grep hw.model | cut -c 1-15)
+ else
+ intel="GenuineIntel"
+ cpu_vendor=$(grep -i 'vendor' /proc/cpuinfo --max-count=1)
+ fi
+ if [[ "$cpu_vendor" != *"$intel"* ]]; then
+ echo "ERROR: IDXD cannot be used due to CPU incompatiblity."
+ exit 1
+ fi
+fi
+
+# Detect architecture and force no ISA-L if non-x86 or non-aarch64 architecture
+if [[ "${CONFIG[ISAL]}" = "y" ]]; then
+ if [[ $arch != x86_64* ]] && [[ $arch != aarch64* ]]; then
+ echo "ERROR: ISA-L cannot be used due to CPU incompatiblity."
+ exit 1
+ fi
+fi
+
+if [[ "${CONFIG[ISAL]}" = "n" ]] && [[ "${CONFIG[REDUCE]}" = "y" ]]; then
+ echo "ERROR Conflicting options: --with-reduce is not compatible with --without-isal."
+ exit 1
+fi
+
+if [ -z "${CONFIG[ENV]}" ]; then
+ CONFIG[ENV]=$rootdir/lib/env_dpdk
+ echo "Using default SPDK env in ${CONFIG[ENV]}"
+ if [ -z "${CONFIG[DPDK_DIR]}" ]; then
+ if [ ! -f "$rootdir"/dpdk/config/common_base ]; then
+ echo "DPDK not found; please specify --with-dpdk=<path> or run:"
+ echo
+ echo " git submodule update --init"
+ exit 1
+ else
+ CONFIG[DPDK_DIR]="${rootdir}/dpdk/build"
+ echo "Using default DPDK in ${CONFIG[DPDK_DIR]}"
+ fi
+
+ if [[ "${CONFIG[VHOST]}" = "y" ]] && [[ "${CONFIG[VHOST_INTERNAL_LIB]}" = "n" ]]; then
+ # We lookup "common_linux" file to check if DPDK version is >= 19.05.
+ # "common_linux" is available since exactly DPDK 19.05 - it was renamed
+ # from "common_linuxapp".
+ if [ ! -f "$rootdir"/dpdk/config/common_linux ]; then
+ echo "Notice: Using internal, legacy rte_vhost library due to DPDK" \
+ "version < 19.05"
+ CONFIG[VHOST_INTERNAL_LIB]=y
+ fi
+ fi
+ else
+ if [[ "${CONFIG[VHOST]}" = "y" ]] && [[ "${CONFIG[VHOST_INTERNAL_LIB]}" = "n" ]]; then
+ # DPDK must be already built, so we can simply try to use the new rte_vhost.
+ # It has a number of internal dependencies though, so don't try to link the
+ # program, just compile it
+ if ! echo -e '#include <rte_vhost.h>\n' \
+ 'int main(void) { return rte_vhost_extern_callback_register(0, NULL, NULL); }\n' \
+ | ${BUILD_CMD[@]} -c -Wno-deprecated-declarations -Werror \
+ -I"${CONFIG[DPDK_DIR]}/include" - &>/dev/null; then
+ echo "Notice: DPDK's rte_vhost not found or version < 19.05, using internal," \
+ "legacy rte_vhost library."
+ CONFIG[VHOST_INTERNAL_LIB]=y
+ fi
+ fi
+ fi
+else
+ if [ -n "${CONFIG[DPDK_DIR]}" ]; then
+ echo "--with-env and --with-dpdk are mutually exclusive."
+ exit 1
+ fi
+
+ if [ "${CONFIG[VHOST]}" = "y" ]; then
+ echo "Vhost is only supported when using the default DPDK environment. Disabling it."
+ fi
+ # Always disable vhost, but only print the error message if the user explicitly turned it on.
+ CONFIG[VHOST]="n"
+ if [ "${CONFIG[VIRTIO]}" = "y" ]; then
+ echo "Virtio is only supported when using the default DPDK environment. Disabling it."
+ fi
+ # Always disable virtio, but only print the error message if the user explicitly turned it on.
+ CONFIG[VIRTIO]="n"
+fi
+
+if [ "${CONFIG[VTUNE]}" = "y" ]; then
+ if [ -z "${CONFIG[VTUNE_DIR]}" ]; then
+ echo "When VTune is enabled, you must specify the VTune directory using --with-vtune=path"
+ exit 1
+ fi
+fi
+
+if [ "${CONFIG[ASAN]}" = "y" -a "${CONFIG[TSAN]}" = "y" ]; then
+ echo "ERROR: ASAN and TSAN cannot be enabled at the same time."
+ exit 1
+fi
+
+if [[ $sys_name == "FreeBSD" ]]; then
+ # FreeBSD doesn't support all configurations
+ if [[ "${CONFIG[COVERAGE]}" == "y" ]]; then
+ echo "ERROR: CONFIG_COVERAGE not available on FreeBSD"
+ exit 1
+ fi
+fi
+
+if [[ $sys_name == "FreeBSD" ]]; then
+ if [[ "${CONFIG[VHOST]}" == "y" ]]; then
+ echo "Vhost is only supported on Linux."
+ exit 1
+ fi
+ if [[ "${CONFIG[VHOST_INTERNAL_LIB]}" == "y" ]]; then
+ echo "Internal rte_vhost library is only supported on Linux."
+ exit 1
+ fi
+ if [[ "${CONFIG[VIRTIO]}" == "y" ]]; then
+ echo "Virtio is only supported on Linux."
+ exit 1
+ fi
+fi
+
+if [ "${CONFIG[RDMA]}" = "y" ]; then
+ if [[ ! "${CONFIG[RDMA_PROV]}" == "verbs" ]] && [[ ! "${CONFIG[RDMA_PROV]}" == "mlx5_dv" ]]; then
+ echo "Invalid RDMA provider specified, must be \"verbs\" or \"mlx5_dv\""
+ exit 1
+ fi
+
+ if ! echo -e '#include <infiniband/verbs.h>\n#include <rdma/rdma_verbs.h>\n' \
+ 'int main(void) { return 0; }\n' \
+ | ${BUILD_CMD[@]} -libverbs -lrdmacm - 2>/dev/null; then
+ echo --with-rdma requires libverbs and librdmacm.
+ echo Please install then re-run this script.
+ exit 1
+ fi
+
+ if echo -e '#include <infiniband/verbs.h>\n' \
+ 'int main(void) { return !!IBV_WR_SEND_WITH_INV; }\n' \
+ | ${BUILD_CMD[@]} -c - 2>/dev/null; then
+ CONFIG[RDMA_SEND_WITH_INVAL]="y"
+ else
+ CONFIG[RDMA_SEND_WITH_INVAL]="n"
+ echo "
+*******************************************************************************
+WARNING: The Infiniband Verbs opcode Send With Invalidate is either not
+supported or is not functional with the current version of libibverbs installed
+on this system. Please upgrade to at least version 1.1.
+
+Beginning with Linux kernel 4.14, the kernel NVMe-oF initiator leverages Send
+With Invalidate RDMA operations to improve performance. Failing to use the
+Send With Invalidate operation on the NVMe-oF target side results in full
+functionality, but greatly reduced performance. The SPDK NVMe-oF target will
+be unable to leverage that operation using the currently installed version
+of libibverbs, so Linux kernel NVMe-oF initiators based on kernels greater
+than or equal to 4.14 will see significantly reduced performance.
+*******************************************************************************"
+ fi
+
+ if echo -e '#include <rdma/rdma_cma.h>\n' \
+ 'int main(void) { return !!RDMA_OPTION_ID_ACK_TIMEOUT; }\n' \
+ | ${BUILD_CMD[@]} -c - 2>/dev/null; then
+ CONFIG[RDMA_SET_ACK_TIMEOUT]="y"
+ else
+ CONFIG[RDMA_SET_ACK_TIMEOUT]="n"
+ echo "RDMA_OPTION_ID_ACK_TIMEOUT is not supported"
+ fi
+
+ if [ "${CONFIG[RDMA_PROV]}" == "mlx5_dv" ]; then
+ if ! echo -e '#include <spdk/stdinc.h>\n' \
+ '#include <infiniband/mlx5dv.h>\n' \
+ '#include <rdma/rdma_cma.h>\n' \
+ 'int main(void) { return rdma_establish(NULL) || ' \
+ '!!IBV_QP_INIT_ATTR_SEND_OPS_FLAGS || !!MLX5_OPCODE_RDMA_WRITE; }\n' \
+ | ${BUILD_CMD[@]} -lmlx5 -I${rootdir}/include -c - 2>/dev/null; then
+ echo "mlx5_dv provider is not supported"
+ exit 1
+ fi
+ fi
+
+ echo "Using "${CONFIG[RDMA_PROV]}" RDMA provider"
+fi
+
+if [[ "${CONFIG[FC]}" = "y" ]]; then
+ if [[ -n "${CONFIG[FC_PATH]}" ]]; then
+ if [ ! -d "${CONFIG[FC_PATH]}" ]; then
+ echo "${CONFIG[FC_PATH]}: directory not found"
+ exit 1
+ fi
+ fi
+fi
+
+if [[ "${CONFIG[ISAL]}" = "y" ]] || [[ "${CONFIG[CRYPTO]}" = "y" ]]; then
+ if [[ "${HAVE_NASM}" = "n" ]] && [[ $arch == x86_64* ]]; then
+ echo "ERROR: ISA-L, compression & crypto require NASM version 2.13.03 or newer."
+ echo "Please install or upgrade them re-run this script."
+ exit 1
+ else
+ if [[ "${CONFIG[CRYPTO]}" = "y" ]]; then
+ CONFIG[IPSEC_MB]=y
+ fi
+ fi
+fi
+
+if [[ "${CONFIG[ISAL]}" = "y" ]]; then
+ if [ ! -f "$rootdir"/isa-l/autogen.sh ]; then
+ echo "ISA-L was not found; To install ISA-L run:"
+ echo " git submodule update --init"
+ exit 1
+ fi
+
+ cd $rootdir/isa-l
+ ISAL_LOG=$rootdir/isa-l/spdk-isal.log
+ echo -n "Configuring ISA-L (logfile: $ISAL_LOG)..."
+ ./autogen.sh &> $ISAL_LOG
+ ./configure CFLAGS="-fPIC -g -O2" --enable-shared=no >> $ISAL_LOG 2>&1
+ echo "done."
+ cd $rootdir
+fi
+
+if [[ "${CONFIG[PMDK]}" = "y" ]]; then
+ if ! echo -e '#include <libpmemblk.h>\nint main(void) { return 0; }\n' \
+ | ${BUILD_CMD[@]} -lpmemblk - 2>/dev/null; then
+ echo --with-pmdk requires libpmemblk.
+ echo Please install then re-run this script.
+ exit 1
+ fi
+fi
+
+if [[ "${CONFIG[REDUCE]}" = "y" ]]; then
+ if ! echo -e '#include <libpmem.h>\nint main(void) { return 0; }\n' \
+ | ${BUILD_CMD[@]} -lpmem - 2>/dev/null; then
+ echo --with-reduce requires libpmem.
+ echo Please install then re-run this script.
+ exit 1
+ fi
+fi
+
+if [[ "${CONFIG[VPP]}" = "y" ]]; then
+ if [ ! -z "${CONFIG[VPP_DIR]}" ]; then
+ VPP_CFLAGS="-L${CONFIG[VPP_DIR]}/lib -I${CONFIG[VPP_DIR]}/include"
+ fi
+ if ! echo -e '#include <vnet/session/application_interface.h>\nint main(void) { return 0; }\n' \
+ | ${BUILD_CMD[@]} ${VPP_CFLAGS} -lvppinfra -lsvm -lvlibmemoryclient - 2>/dev/null; then
+ echo --with-vpp requires installed vpp.
+ echo Please install then re-run this script.
+ exit 1
+ fi
+fi
+
+if [[ "${CONFIG[NVME_CUSE]}" = "y" ]]; then
+ 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' \
+ | ${BUILD_CMD[@]} -lfuse3 -D_FILE_OFFSET_BITS=64 - 2>/dev/null; then
+ echo --with-cuse requires libfuse3.
+ echo Please install then re-run this script.
+ exit 1
+ fi
+fi
+
+if [[ "${CONFIG[RBD]}" = "y" ]]; then
+ if ! echo -e '#include <rbd/librbd.h>\n#include <rados/librados.h>\n' \
+ 'int main(void) { return 0; }\n' \
+ | ${BUILD_CMD[@]} -lrados -lrbd - 2>/dev/null; then
+ echo --with-rbd requires librados and librbd.
+ echo Please install then re-run this script.
+ exit 1
+ fi
+fi
+
+if [[ "${CONFIG[ISCSI_INITIATOR]}" = "y" ]]; then
+ # Fedora installs libiscsi to /usr/lib64/iscsi for some reason.
+ if ! echo -e '#include <iscsi/iscsi.h>\n#include <iscsi/scsi-lowlevel.h>\n' \
+ '#if LIBISCSI_API_VERSION < 20150621\n' \
+ '#error\n' \
+ '#endif\n' \
+ 'int main(void) { return 0; }\n' \
+ | ${BUILD_CMD[@]} -L/usr/lib64/iscsi -liscsi - 2>/dev/null; then
+ echo --with-iscsi-initiator requires libiscsi with
+ echo 'LIBISCSI_API_VERSION >= 20150621.'
+ echo Please install then re-run this script.
+ exit 1
+ fi
+fi
+
+if [[ "${CONFIG[ASAN]}" = "y" ]]; then
+ if ! echo -e 'int main(void) { return 0; }\n' \
+ | ${BUILD_CMD[@]} -fsanitize=address - 2>/dev/null; then
+ echo --enable-asan requires libasan.
+ echo Please install then re-run this script.
+ exit 1
+ fi
+fi
+
+if [[ "${CONFIG[UBSAN]}" = "y" ]]; then
+ if ! echo -e 'int main(void) { return 0; }\n' \
+ | ${BUILD_CMD[@]} -fsanitize=undefined - 2>/dev/null; then
+ echo --enable-ubsan requires libubsan.
+ echo Please install then re-run this script.
+ exit 1
+ fi
+fi
+
+if [[ "${CONFIG[TSAN]}" = "y" ]]; then
+ if ! echo -e 'int main(void) { return 0; }\n' \
+ | ${BUILD_CMD[@]} -fsanitize=thread - 2>/dev/null; then
+ echo --enable-tsan requires libtsan.
+ echo Please install then re-run this script.
+ exit 1
+ fi
+fi
+
+if [[ "${CONFIG[OCF]}" = "y" ]]; then
+ # If OCF_PATH is a file, assume it is a library and use it to compile with
+ if [ -f ${CONFIG[OCF_PATH]} ]; then
+ CONFIG[CUSTOMOCF]=y
+ else
+ CONFIG[CUSTOMOCF]=n
+ fi
+fi
+
+if [[ "${CONFIG[PGO_CAPTURE]}" = "y" && "${CONFIG[PGO_USE]}" = "y" ]]; then
+ echo "ERROR: --enable-pgo-capture and --enable-pgo-use are mutually exclusive."
+ exit 1
+elif [[ "${CONFIG[PGO_USE]}" = "y" ]]; then
+ if [[ "$CC_TYPE" = "clang" ]]; then
+ # For clang we need to run an extra step on gathered profiling data.
+ echo "Generating suitable profile data"
+ llvm-profdata merge -output=build/pgo/default.profdata build/pgo
+ fi
+fi
+
+if [[ "${CONFIG[URING]}" = "y" ]]; then
+ if [[ -n "${CONFIG[URING_PATH]}" ]]; then
+ if [ ! -d "${CONFIG[URING_PATH]}" ]; then
+ echo "${CONFIG[URING_PATH]}: directory not found"
+ exit 1
+ fi
+ fi
+fi
+
+if [[ "${CONFIG[FUSE]}" = "y" ]]; then
+ if [[ ! -d /usr/include/fuse3 ]] && [[ ! -d /usr/local/include/fuse3 ]]; then
+ echo "--with-fuse requires libfuse3."
+ echo "Please install then re-run this script."
+ exit 1
+ fi
+fi
+
+# We are now ready to generate final configuration. But first do sanity
+# check to see if all keys in CONFIG array have its reflection in CONFIG file.
+if [ $(egrep -c "^\s*CONFIG_[[:alnum:]_]+=" $rootdir/CONFIG) -ne ${#CONFIG[@]} ]; then
+ echo ""
+ echo "BUG: Some configuration options are not present in CONFIG file. Please update this file."
+ echo "Missing options in CONFIG (+) file and in current config (-): "
+ diff -u --label "CONFIG file" --label "CONFIG[@]" \
+ <(sed -r -e '/^\s*$/d; /^\s*#.*/d; s/(CONFIG_[[:alnum:]_]+)=.*/\1/g' CONFIG | sort) \
+ <(printf "CONFIG_%s\n" ${!CONFIG[@]} | sort)
+ exit 1
+fi
+
+echo -n "Creating mk/config.mk..."
+cp -f $rootdir/CONFIG $rootdir/mk/config.mk
+for key in ${!CONFIG[@]}; do
+ sed -i.bak -r "s#^\s*CONFIG_${key}=.*#CONFIG_${key}\?=${CONFIG[$key]}#g" $rootdir/mk/config.mk
+done
+# On FreeBSD sed -i 'SUFFIX' - SUFFIX is mandatory. So no way but to delete the backed file.
+rm -f $rootdir/mk/config.mk.bak
+echo "done."
+
+# Environment variables
+echo -n "Creating mk/cc.flags.mk..."
+rm -f $rootdir/mk/cc.flags.mk
+[ -n "$CFLAGS" ] && echo "CFLAGS?=$CFLAGS" > $rootdir/mk/cc.flags.mk
+[ -n "$CXXFLAGS" ] && echo "CXXFLAGS?=$CXXFLAGS" >> $rootdir/mk/cc.flags.mk
+[ -n "$LDFLAGS" ] && echo "LDFLAGS?=$LDFLAGS" >> $rootdir/mk/cc.flags.mk
+[ -n "$DESTDIR" ] && echo "DESTDIR?=$DESTDIR" >> $rootdir/mk/cc.flags.mk
+echo "done."
+
+# Create .sh with build config for easy sourcing|lookup during the tests.
+for conf in "${!CONFIG[@]}"; do
+ echo "CONFIG_$conf=${CONFIG[$conf]}"
+done >"$rootdir/test/common/build_config.sh"
+
+if [[ $sys_name == "FreeBSD" ]]; then
+ echo "Type 'gmake' to build."
+else
+ echo "Type 'make' to build."
+fi
+
+exit 0