diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 18:24:20 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 18:24:20 +0000 |
commit | 483eb2f56657e8e7f419ab1a4fab8dce9ade8609 (patch) | |
tree | e5d88d25d870d5dedacb6bbdbe2a966086a0a5cf /src/spdk/configure | |
parent | Initial commit. (diff) | |
download | ceph-upstream.tar.xz ceph-upstream.zip |
Adding upstream version 14.2.21.upstream/14.2.21upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/spdk/configure')
-rwxr-xr-x | src/spdk/configure | 404 |
1 files changed, 404 insertions, 0 deletions
diff --git a/src/spdk/configure b/src/spdk/configure new file mode 100755 index 00000000..41377132 --- /dev/null +++ b/src/spdk/configure @@ -0,0 +1,404 @@ +#!/usr/bin/env bash + +set -e + +trap 'echo -e "\n\nConfiguration failed\n\n" >&2' ERR + +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 "" + echo " --enable-debug Configure for debug builds" + echo " --enable-log-bt Enable support of backtrace printing in SPDK logs (requires libunwind)." + 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 " --disable-tests Disable building of tests" + echo " --with-env=path Use an alternate environment implementation" + 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 " crypto Required to build vbdev crypto module." + echo " No path required." + echo " dpdk Optional. Uses dpdk submodule in spdk tree if not specified." + echo " example: /usr/share/dpdk/x86_64-default-linuxapp-gcc" + echo " fio Required to build fio_plugin." + echo " example: /usr/src/fio" + echo " igb-uio-driver Required on some systems to use qat devices" + echo " No path required" + echo " vhost Required to build vhost target." + echo " No path required." + echo " virtio Required to build vhost initiator (Virtio) bdev module." + echo " No path required." + echo " pmdk Required to build persistent memory bdev." + echo " example: /usr/share/pmdk" + echo " vpp Required to build VPP net module." + echo " example: /vpp_repo/build-root/install-vpp-native/vpp" + echo " rbd [disabled]" + echo " No path required." + echo " rdma [disabled]" + echo " No path required." + echo " shared Required to build spdk shared libraries." + echo " No path required." + echo " iscsi-initiator [disabled]" + 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 "" + echo "Environment variables:" + echo "" + echo "CFLAGS C compiler flags" + echo "CXXFLAGS C++ compiler flags" + 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' CONFIG > CONFIG.sh +declare -A CONFIG +source CONFIG.sh +rm CONFIG.sh + + +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 + ;; + --prefix=*) + CONFIG[PREFIX]="${i#*=}" + ;; + --enable-debug) + CONFIG[DEBUG]=y + ;; + --disable-debug) + CONFIG[DEBUG]=n + ;; + --enable-log-bt) + CONFIG[LOG_BACKTRACE]=y + ;; + --disable-log-bt) + CONFIG[LOG_BACKTRACE]=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-lto) + CONFIG[LTO]=y + ;; + --disable-lto) + CONFIG[LTO]=n + ;; + --enable-tests) + CONFIG[TESTS]=y + ;; + --disable-tests) + CONFIG[TESTS]=n + ;; + --enable-werror) + CONFIG[WERROR]=y + ;; + --disable-werror) + CONFIG[WERROR]=n + ;; + --with-env=*) + CONFIG[ENV]="${i#*=}" + ;; + --with-rbd) + CONFIG[RBD]=y + ;; + --without-rbd) + CONFIG[RBD]=n + ;; + --with-raid) + echo "--with-raid option ignored and is now deprecated. RAID module is always enabled." + ;; + --without-raid) + echo "--without-raid option ignored and is now deprecated. RAID module is always enabled." + ;; + --with-rdma) + CONFIG[RDMA]=y + ;; + --without-rdma) + CONFIG[RDMA]=n + ;; + --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-dpdk=*) + check_dir "$i" + CONFIG[DPDK_DIR]=$(readlink -f ${i#*=}) + ;; + --without-dpdk) + CONFIG[DPDK_DIR]= + ;; + --with-crypto) + CONFIG[CRYPTO]=y + ;; + --without-crypto) + CONFIG[CRYPTO]=n + ;; + --with-vhost) + CONFIG[VHOST]=y + ;; + --without-vhost) + CONFIG[VHOST]=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-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=*) + check_dir "$i" + CONFIG[FIO_SOURCE_DIR]="${i#*=}" + CONFIG[FIO_PLUGIN]=y + ;; + --without-fio) + CONFIG[FIO_SOURCE_DIR]= + 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 + ;; + --) + break + ;; + *) + echo "Unrecognized option $i" + usage + exit 1 + esac +done + +if [ -z "${CONFIG[ENV]}" ]; then + rootdir=$(readlink -f $(dirname $0)) + 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 + fi +else + 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[FIO_PLUGIN]}" = "y" ]; then + if [ -z "${CONFIG[FIO_SOURCE_DIR]}" ]; then + echo "When fio is enabled, you must specify the fio directory using --with-fio=path" + exit 1 + fi +else + CONFIG[FIO_SOURCE_DIR]= +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 [[ "$OSTYPE" == "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 [ "${CONFIG[RDMA]}" = "y" ]; then + if [ "$OSTYPE" != "FreeBSD"* ]; then + ibv_lib_file="$(readlink -f /usr/lib64/libibverbs.so)" || true + if [ -z $ibv_lib_file ]; then + ibv_lib_file="libibverbs.so.0.0.0" + fi + ibv_ver_str="$(basename $ibv_lib_file)" + ibv_maj_ver=`echo $ibv_ver_str | cut -d. -f3` + ibv_min_ver=`echo $ibv_ver_str | cut -d. -f4` + if [[ "$ibv_maj_var" > 1 || ("$ibv_maj_ver" -eq 1 && "$ibv_min_ver" -ge 1) ]]; 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 + fi +fi + +if [[ "${CONFIG[CRYPTO]}" = "y" ]]; then + if [[ $(nasm -v | sed 's/[^0-9]*//g' | awk '{print substr ($0, 0, 5)}') -lt "21202" ]]; then + echo Crypto requires NASM version 2.12.02 or newer. Please install + echo or upgrade then re-run this script. + exit 1 + else + if [[ "$(find /usr -name intel-ipsec-mb.h 2>/dev/null)" == "" ]]; then + echo "To enable crypto you must first go to the intel-ipsec-mb directory and " + echo "run 'make' then 'sudo make install' then re-run this script." + exit 1 + fi + 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:]_]+=" 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 CONFIG mk/config.mk +for key in ${!CONFIG[@]}; do + sed -i.bak -r "s#^\s*CONFIG_${key}=.*#CONFIG_${key}\?=${CONFIG[$key]}#g" mk/config.mk +done +# On FreeBSD sed -i 'SUFFIX' - SUFFIX is mandatory. So no way but to delete the backed file. +rm -f mk/config.mk.bak + +# Environment variables +[ -n "$CFLAGS" ] && echo "CFLAGS?=$CFLAGS" >> mk/config.mk +[ -n "$CXXFLAGS" ] && echo "CXXFLAGS?=$CXXFLAGS" >> mk/config.mk +[ -n "$LDFLAGS" ] && echo "LDFLAGS?=$LDFLAGS" >> mk/config.mk +[ -n "$DESTDIR" ] && echo "DESTDIR?=$DESTDIR" >> mk/config.mk + +echo "done." + +if [[ "$OSTYPE" == "freebsd"* ]]; then + echo "Type 'gmake' to build." +else + echo "Type 'make' to build." +fi + +exit 0 |