19dd998cdSBen Walker#!/usr/bin/env bash 2eb53c232Spaul luse# SPDX-License-Identifier: BSD-3-Clause 3eb53c232Spaul luse# Copyright (C) 2017 Intel Corporation 4eb53c232Spaul luse# All rights reserved. 5eb53c232Spaul luse# 69dd998cdSBen Walker 79dd998cdSBen Walkerset -e 89dd998cdSBen Walker 914bbde7bSPawel Wodkowskitrap 'echo -e "\n\nConfiguration failed\n\n" >&2' ERR 1014bbde7bSPawel Wodkowski 11e62a3c65SSeth Howellrootdir=$(readlink -f $(dirname $0)) 1265ed6034SMichal Bergersource "$rootdir/scripts/common.sh" 13e62a3c65SSeth Howell 145ccabc8fSMichal Bergerfunction usage() { 159dd998cdSBen Walker echo "'configure' configures SPDK to compile on supported platforms." 169dd998cdSBen Walker echo "" 179dd998cdSBen Walker echo "Usage: ./configure [OPTION]..." 189dd998cdSBen Walker echo "" 199dd998cdSBen Walker echo "Defaults for the options are specified in brackets." 209dd998cdSBen Walker echo "" 219dd998cdSBen Walker echo "General:" 229dd998cdSBen Walker echo " -h, --help Display this help and exit" 232e7fe8e8SDaniel Verkamp echo "" 242e7fe8e8SDaniel Verkamp echo " --prefix=path Configure installation prefix (default: /usr/local)" 250e6ddfd6SBen Walker echo " --target-arch=arch Target build architecture. Must be a valid GNU arch. Default: native" 262e7fe8e8SDaniel Verkamp echo "" 273def834cSAmelia Blachuciak echo " --cross-prefix=prefix Prefix for cross compilation (default: none)" 283def834cSAmelia Blachuciak echo " example: aarch64-linux-gnu" 29e8863cb7SMichal Berger echo " --libdir=path Configure installation path for the libraries (default: \$prefix/lib)" 303def834cSAmelia Blachuciak echo "" 319dd998cdSBen Walker echo " --enable-debug Configure for debug builds" 329dd998cdSBen Walker echo " --enable-werror Treat compiler warnings as errors" 339dd998cdSBen Walker echo " --enable-asan Enable address sanitizer" 349dd998cdSBen Walker echo " --enable-ubsan Enable undefined behavior sanitizer" 359dd998cdSBen Walker echo " --enable-coverage Enable code coverage tracking" 366d6d1161SDaniel Verkamp echo " --enable-lto Enable link-time optimization" 37995d60f4SBen Walker echo " --enable-pgo-capture Enable generation of profile guided optimization data" 38995d60f4SBen Walker echo " --enable-pgo-use Use previously captured profile guided optimization data" 3991e42257SJim Harris echo " --enable-cet Enable Intel Control-flow Enforcement Technology (CET)" 409fcb1cb0STomasz Zawadzki echo " --disable-tests Disable building of functional tests" 419fcb1cb0STomasz Zawadzki echo " --disable-unit-tests Disable building of unit tests" 429b2c6452SJacek Kalwas echo " --disable-examples Disable building of examples" 43119158cdSRajarshi Chowdhury echo " --disable-apps Disable building of apps" 449dd998cdSBen Walker echo "" 459dd998cdSBen Walker echo "Specifying Dependencies:" 469dd998cdSBen Walker echo "--with-DEPENDENCY[=path] Use the given dependency. Optionally, provide the" 479dd998cdSBen Walker echo " path." 489dd998cdSBen Walker echo "--without-DEPENDENCY Do not link to the given dependency. This may" 499dd998cdSBen Walker echo " disable features and components." 509dd998cdSBen Walker echo "" 519dd998cdSBen Walker echo "Valid dependencies are listed below." 522bc71094SMichal Berger echo " --with-dpdk[=DIR] Build against a custom dpdk version. By default, the dpdk" 532bc71094SMichal Berger echo " --without-dpdk submodule in spdk tree will be used." 549dd998cdSBen Walker echo " example: /usr/share/dpdk/x86_64-default-linuxapp-gcc" 552bc71094SMichal Berger echo " --with-env=DIR Use an alternate environment implementation instead of DPDK." 5606cc8045SBen Walker echo " Implies --without-dpdk." 572bc71094SMichal Berger echo " --with-idxd Build the IDXD library and accel framework plug-in module." 582bc71094SMichal Berger echo " --without-idxd Disabled while experimental. Only built for x86 when enabled." 592bc71094SMichal Berger echo " --with-crypto Build vbdev crypto module." 602bc71094SMichal Berger echo " --without-crypto No path required." 612bc71094SMichal Berger echo " --with-fio[=DIR] Build fio_plugin." 622bc71094SMichal Berger echo " --without-fio default: /usr/src/fio" 636f338d4bSKrishna Kanth Reddy echo " --with-xnvme Build xNVMe bdev module." 646f338d4bSKrishna Kanth Reddy echo " --without-xnvme No path required." 652bc71094SMichal Berger echo " --with-vhost Build vhost target. Enabled by default." 662bc71094SMichal Berger echo " --without-vhost No path required." 672bc71094SMichal Berger echo " --with-virtio Build vhost initiator and virtio-pci bdev modules." 682bc71094SMichal Berger echo " --without-virtio No path required." 69e50ade31SChangpeng Liu echo " --with-vfio-user[=DIR] Build custom vfio-user transport for NVMf target and vfio-user target." 70e50ade31SChangpeng Liu echo " vfio-user initiator is always built-in in Linux." 712f731c63SGangCao echo " example: /usr/src/libvfio-user" 722f731c63SGangCao echo " --without-vfio-user No path required." 73ebf077cbSyidong0635 echo " --with-pmdk[=DIR] Build persistent memory bdev. 74ebf077cbSyidong0635 example: /usr/share/pmdk" 75ebf077cbSyidong0635 echo " --without-pmdk No path required." 7619e2dc38Spaul luse echo " --with-vbdev-compress Build vbdev compression module and dependencies." 7719e2dc38Spaul luse echo " --without-vbdev-compress No path required." 782bc71094SMichal Berger echo " --with-rbd Build Ceph RBD bdev module." 792bc71094SMichal Berger echo " --without-rbd No path required." 802bc71094SMichal Berger echo " --with-rdma[=DIR] Build RDMA transport for NVMf target and initiator." 812bc71094SMichal Berger echo " --without-rdma Accepts optional RDMA provider name. Can be \"verbs\" or \"mlx5_dv\"." 82daee62a0SAlexey Marchuk echo " If no provider specified, \"verbs\" provider is used by default." 832bc71094SMichal Berger echo " --with-fc[=DIR] Build FC transport for NVMf target." 842bc71094SMichal Berger echo " --without-fc If an argument is provided, it is considered a directory containing" 85ed56a3d4SAnil Veerabhadrappa echo " libufc.a and fc_lld.h. Otherwise the regular system paths will" 86ed56a3d4SAnil Veerabhadrappa echo " be searched." 87044bb175SDenis Barakthanov echo " --with-daos[=DIR] Build DAOS bdev module." 882e283fcbS0xe0f echo " --without-daos No path required." 892bc71094SMichal Berger echo " --with-shared Build spdk shared libraries." 902bc71094SMichal Berger echo " --without-shared No path required." 912bc71094SMichal Berger echo " --with-iscsi-initiator Build with iscsi bdev module." 922bc71094SMichal Berger echo " --without-iscsi-initiator No path required." 932bc71094SMichal Berger echo " --with-vtune=DIR Required to profile I/O under Intel VTune Amplifier XE." 942bc71094SMichal Berger echo " --without-vtune example: /opt/intel/vtune_amplifier_xe_version" 952bc71094SMichal Berger echo " --with-ocf[=DIR] Build OCF library and bdev module." 962bc71094SMichal Berger echo " --without-ocf If argument is directory, interpret it as root of OCF repo" 97d1fee489SVitaliy Mysak echo " If argument is file, interpret it as compiled OCF lib" 9898d60de6SPiotr Pelplinski echo " If no argument is specified, OCF git submodule is used by default" 99d1fee489SVitaliy Mysak echo " example: /usr/src/ocf/" 1002bc71094SMichal Berger echo " --with-uring[=DIR] Build I/O uring bdev or socket module." 1012bc71094SMichal Berger echo " --without-uring If an argument is provided, it is considered a directory containing" 102161c88a0SDarek Stojaczyk echo " liburing.a and io_uring.h. Otherwise the regular system paths will" 103161c88a0SDarek Stojaczyk echo " be searched." 104958d196cSIndraneel M echo " --without-uring-zns Build I/O uring module without ZNS (zoned namespaces) support." 10534192459SBoris Glimcher echo " --with-openssl[=DIR] Build OPENSSL with custom path. Otherwise the regular system paths will" 10634192459SBoris Glimcher echo " be searched." 1072bc71094SMichal Berger echo " --with-fuse Build FUSE components for mounting a blobfs filesystem." 1082bc71094SMichal Berger echo " --without-fuse No path required." 1092bc71094SMichal Berger echo " --with-nvme-cuse Build NVMe driver with support for CUSE-based character devices." 1102bc71094SMichal Berger echo " --without-nvme-cuse No path required." 11183a4b155SArtur Paszkiewicz echo " --with-raid5f Build with bdev_raid module RAID5f support." 11283a4b155SArtur Paszkiewicz echo " --without-raid5f No path required." 1132bc71094SMichal Berger echo " --with-wpdk=DIR Build using WPDK to provide support for Windows (experimental)." 1142bc71094SMichal Berger echo " --without-wpdk The argument must be a directory containing lib and include." 1152bc71094SMichal Berger echo " --with-usdt Build with userspace DTrace probes enabled." 1162bc71094SMichal Berger echo " --without-usdt No path required." 117050565e5SJim Harris echo " --with-fuzzer Build with LLVM fuzzing enabled." 118050565e5SJim Harris echo " Path to clang_rt.fuzzer_no_main library required." 119050565e5SJim Harris echo " Requires setting CC and CXX to clang." 120050565e5SJim Harris echo " (Typically /usr/lib/llvm-VER/lib/clang/VER/lib/linux/libclang_rt.fuzzer_no_main-ARCH.a)" 121509241ceSKonrad Sztyber echo " --with-sma Generate Storage Management Agent's protobuf interface" 122509241ceSKonrad Sztyber echo " --without-sma No path required." 1239dd998cdSBen Walker echo "" 12408ec96ebSDaniel Verkamp echo "Environment variables:" 12508ec96ebSDaniel Verkamp echo "" 12673439e6fSBen Walker echo "CC C compiler" 12708ec96ebSDaniel Verkamp echo "CFLAGS C compiler flags" 12873439e6fSBen Walker echo "CXX C++ compiler" 12908ec96ebSDaniel Verkamp echo "CXXFLAGS C++ compiler flags" 13073439e6fSBen Walker echo "LD Linker" 13108ec96ebSDaniel Verkamp echo "LDFLAGS Linker flags" 13208ec96ebSDaniel Verkamp echo "DESTDIR Destination for 'make install'" 13308ec96ebSDaniel Verkamp echo "" 1349dd998cdSBen Walker} 1359dd998cdSBen Walker 136577df16aSPawel Wodkowski# Load default values 137ff238359SJosh Soref# Convert config to sourceable configuration file 138e62a3c65SSeth Howellsed -r 's/CONFIG_([[:alnum:]_]+)=(.*)/CONFIG[\1]=\2/g' $rootdir/CONFIG > $rootdir/CONFIG.sh 139577df16aSPawel Wodkowskideclare -A CONFIG 140e62a3c65SSeth Howellsource $rootdir/CONFIG.sh 141e62a3c65SSeth Howellrm $rootdir/CONFIG.sh 142577df16aSPawel Wodkowski 14311a5716dSMichal Berger# Try to expand literal ~ that might have been passed as an option via --long-opt=~/dir. 14411a5716dSMichal Bergerset -- "${@//\~/~}" 14511a5716dSMichal Berger 1464d2e26d8STomasz Zawadzkifor i in "$@"; do 1474d2e26d8STomasz Zawadzki case "$i" in 1484d2e26d8STomasz Zawadzki --cross-prefix=*) 1494d2e26d8STomasz Zawadzki CONFIG[CROSS_PREFIX]="${i#*=}" 1504d2e26d8STomasz Zawadzki ;; 1514d2e26d8STomasz Zawadzki --enable-lto) 1524d2e26d8STomasz Zawadzki CONFIG[LTO]=y 1534d2e26d8STomasz Zawadzki ;; 1544d2e26d8STomasz Zawadzki --disable-lto) 1554d2e26d8STomasz Zawadzki CONFIG[LTO]=n 1564d2e26d8STomasz Zawadzki ;; 1574d2e26d8STomasz Zawadzki esac 1584d2e26d8STomasz Zawadzkidone 1594d2e26d8STomasz Zawadzki 160873c8748STomasz Kulasek# Detect the compiler toolchain 161873c8748STomasz Kulasek$rootdir/scripts/detect_cc.sh --cc="$CC" --cxx="$CXX" --lto="${CONFIG[LTO]}" --ld="$LD" --cross-prefix="${CONFIG[CROSS_PREFIX]}" > $rootdir/mk/cc.mk 162873c8748STomasz Kulasek 163bb0f78a2SMichal BergerCC=$(grep "DEFAULT_CC=" "$rootdir/mk/cc.mk" | sed s/DEFAULT_CC=//) 164bb0f78a2SMichal BergerCC_TYPE=$(grep "CC_TYPE=" "$rootdir/mk/cc.mk" | cut -d "=" -f 2) 165873c8748STomasz Kulasek 166873c8748STomasz Kulasekarch=$($CC -dumpmachine) 1675a764955SMichal Bergersys_name=$(uname -s) 168873c8748STomasz Kulasek 1699854c138SNick Connollyif [[ $arch == *mingw* ]] || [[ $arch == *windows* ]]; then 1709854c138SNick Connolly sys_name=Windows 1719854c138SNick Connollyfi 1729854c138SNick Connolly 1732a0c2a2dSNick Connollyif [[ $sys_name != "Linux" ]]; then 174873c8748STomasz Kulasek # Vhost, rte_vhost library and virtio are only supported on Linux. 175873c8748STomasz Kulasek CONFIG[VHOST]="n" 176873c8748STomasz Kulasek CONFIG[VIRTIO]="n" 177873c8748STomasz Kulasek echo "Notice: Vhost, rte_vhost library and virtio are only supported on Linux. Turning off default feature." 178873c8748STomasz Kulasekfi 179873c8748STomasz Kulasek 1801723a800SGangCaofunction check_dir() { 1811723a800SGangCao arg="$1" 1821723a800SGangCao dir="${arg#*=}" 1831723a800SGangCao if [ ! -d "$dir" ]; then 1841723a800SGangCao echo "$arg: directory not found" 1851723a800SGangCao exit 1 1861723a800SGangCao fi 1871723a800SGangCao} 1881723a800SGangCao 1897b04eb72SYuriy Umanets# On x86_64 'clang -dumpmachine' produces x86_64-pc-linux-gnu 1907b04eb72SYuriy Umanets# whereas the dpdk might be built with gcc and its libs lie in 1917b04eb72SYuriy Umanets# x86_64-linux-gnu. Let's find the right libdir for dpdkd libs. 1927b04eb72SYuriy Umanetsfunction find_dpdk_arch_libdir() { 1937b04eb72SYuriy Umanets local dpdk_dir=$1 1947b04eb72SYuriy Umanets 1957b04eb72SYuriy Umanets # Checking first what we have with $arch, then clang 1967b04eb72SYuriy Umanets # variant of arch. 1977b04eb72SYuriy Umanets arches=("$arch" "$(echo $arch | sed 's/-pc//g')") 1987b04eb72SYuriy Umanets for a in "${arches[@]}"; do 1997b04eb72SYuriy Umanets local libdir="$dpdk_dir/lib/$a" 2007b04eb72SYuriy Umanets if [[ -d $libdir ]]; then 2017b04eb72SYuriy Umanets echo $libdir 2027b04eb72SYuriy Umanets return 2037b04eb72SYuriy Umanets fi 2047b04eb72SYuriy Umanets done 2057b04eb72SYuriy Umanets 2067b04eb72SYuriy Umanets # Fallback to the libdir without arch component 2077b04eb72SYuriy Umanets echo "$dpdk_dir/lib" 2087b04eb72SYuriy Umanets} 2097b04eb72SYuriy Umanets 210f1980244SYuriy Umanetsfunction check_IPSec_mb() { 211f1980244SYuriy Umanets local mode=$1 212f1980244SYuriy Umanets local dpdk_libdir=$2 213f1980244SYuriy Umanets local dpdk_incdir=$3 214f1980244SYuriy Umanets local have_ipsec_mb=n 215f1980244SYuriy Umanets 216f1980244SYuriy Umanets if [[ $mode = "pkg-config" ]]; then 217f1980244SYuriy Umanets local dpdk_libs 218f1980244SYuriy Umanets 219f1980244SYuriy Umanets # Request libdpdk pkg-config settings to figure out if the IPSec_MB is used 220f1980244SYuriy Umanets # as a dependency. 221f1980244SYuriy Umanets # Due to some reason pkg-config shows -lIPSec_MB only with --static option 222f13ec525SKarol Latecki dpdk_libs=$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --libs --static libdpdk) 223f1980244SYuriy Umanets if echo "$dpdk_libs" | grep "\-lIPSec_MB" > /dev/null 2>&1; then 224f1980244SYuriy Umanets have_ipsec_mb=y 225f1980244SYuriy Umanets fi 226f1980244SYuriy Umanets elif [[ $mode = "build-config" ]]; then 227f1980244SYuriy Umanets # Use dpdk build config header to check if the IPSec_MB was used. 228f1980244SYuriy Umanets if grep -F "define RTE_CRYPTO_IPSEC_MB 1" "$dpdk_incdir/rte_build_config.h" > /dev/null 2>&1; then 229f1980244SYuriy Umanets have_ipsec_mb=y 230f1980244SYuriy Umanets fi 231f1980244SYuriy Umanets else 232f1980244SYuriy Umanets echo "ERROR: Invalid IPSec_MB checking mode $mode." 233f1980244SYuriy Umanets echo "ERROR: Only \"pkg-config\" and \"build-config\" available." 234f1980244SYuriy Umanets exit 1 235f1980244SYuriy Umanets fi 236f1980244SYuriy Umanets if [[ $have_ipsec_mb = "n" ]]; then 237f1980244SYuriy Umanets CONFIG[IPSEC_MB]=n 238f1980244SYuriy Umanets return 239f1980244SYuriy Umanets fi 240f1980244SYuriy Umanets 241f1980244SYuriy Umanets # Since we don't know the library path where the IPSec_MB is located 242f1980244SYuriy Umanets # let's find it out with the ldd utility. This can be a standard location 243f1980244SYuriy Umanets # or a custom build. 244f1980244SYuriy Umanets local librte_crypto_ipsec_mb="$dpdk_libdir/librte_crypto_ipsec_mb.so" 245f1980244SYuriy Umanets if [[ -f "$librte_crypto_ipsec_mb" ]]; then 246f1980244SYuriy Umanets local ipsec_mb_libdir 247f1980244SYuriy Umanets 248f1980244SYuriy Umanets ipsec_mb_libdir=$(ldd "$librte_crypto_ipsec_mb" | grep "libIPSec_MB.so" \ 249f1980244SYuriy Umanets | sed -e 's/\s*libIPSec_MB.so.*=>\s//' -e 's/\/libIPSec_MB.so.*$//') 250f1980244SYuriy Umanets if [[ -d $ipsec_mb_libdir ]]; then 251f1980244SYuriy Umanets CONFIG[IPSEC_MB]=y 252f1980244SYuriy Umanets CONFIG[IPSEC_MB_DIR]="$ipsec_mb_libdir" 253f1980244SYuriy Umanets elif [[ $ipsec_mb_libdir = "not found" ]]; then 254f1980244SYuriy Umanets # ldconfig cache is broken, old build with refs to non-existing libs, etc. 255f1980244SYuriy Umanets echo "ERROR: Invalid IPSec_MB installation. Library is not found and/or ldconfig cache is broken!" 256f1980244SYuriy Umanets exit 1 257f1980244SYuriy Umanets else 258f1980244SYuriy Umanets # Failed to check for IPSec_MB lib path. Let's just assume it is lives 259f1980244SYuriy Umanets # in one of the standard locations (/usr/lib, etc.). 260f1980244SYuriy Umanets CONFIG[IPSEC_MB]=y 261f1980244SYuriy Umanets fi 262f1980244SYuriy Umanets else 263f1980244SYuriy Umanets # pkg-config says there is IPSec_mb and dpdk lib does not have it. Let's just 264f1980244SYuriy Umanets # assume it is installed in the system in one of the standard locations. 265f1980244SYuriy Umanets CONFIG[IPSEC_MB]=y 266f1980244SYuriy Umanets fi 267f1980244SYuriy Umanets} 268f1980244SYuriy Umanets 2699dd998cdSBen Walkerfor i in "$@"; do 2709dd998cdSBen Walker case "$i" in 2719dd998cdSBen Walker -h | --help) 2729dd998cdSBen Walker usage 2739dd998cdSBen Walker exit 0 2749dd998cdSBen Walker ;; 2754d2e26d8STomasz Zawadzki --cross-prefix=*) ;& 2764d2e26d8STomasz Zawadzki --enable-lto) ;& 2774d2e26d8STomasz Zawadzki --disable-lto) 2784d2e26d8STomasz Zawadzki # Options handled before detecting CC. 2794d2e26d8STomasz Zawadzki ;; 2802e7fe8e8SDaniel Verkamp --prefix=*) 281577df16aSPawel Wodkowski CONFIG[PREFIX]="${i#*=}" 2822e7fe8e8SDaniel Verkamp ;; 2830e6ddfd6SBen Walker --target-arch=*) 2840e6ddfd6SBen Walker CONFIG[ARCH]="${i#*=}" 2850e6ddfd6SBen Walker ;; 286e8863cb7SMichal Berger --libdir=*) 287e8863cb7SMichal Berger CONFIG[LIBDIR]="${i#*=}" 288e8863cb7SMichal Berger ;; 2899dd998cdSBen Walker --enable-debug) 290577df16aSPawel Wodkowski CONFIG[DEBUG]=y 2919dd998cdSBen Walker ;; 2929dd998cdSBen Walker --disable-debug) 293577df16aSPawel Wodkowski CONFIG[DEBUG]=n 2949dd998cdSBen Walker ;; 2959dd998cdSBen Walker --enable-asan) 296577df16aSPawel Wodkowski CONFIG[ASAN]=y 2979dd998cdSBen Walker ;; 2989dd998cdSBen Walker --disable-asan) 299577df16aSPawel Wodkowski CONFIG[ASAN]=n 3009dd998cdSBen Walker ;; 3019dd998cdSBen Walker --enable-ubsan) 302577df16aSPawel Wodkowski CONFIG[UBSAN]=y 3039dd998cdSBen Walker ;; 3049dd998cdSBen Walker --disable-ubsan) 305577df16aSPawel Wodkowski CONFIG[UBSAN]=n 3069dd998cdSBen Walker ;; 307830912e2SBen Walker --enable-tsan) 308577df16aSPawel Wodkowski CONFIG[TSAN]=y 309830912e2SBen Walker ;; 310830912e2SBen Walker --disable-tsan) 311577df16aSPawel Wodkowski CONFIG[TSAN]=n 312830912e2SBen Walker ;; 3139dd998cdSBen Walker --enable-coverage) 314577df16aSPawel Wodkowski CONFIG[COVERAGE]=y 3159dd998cdSBen Walker ;; 3169dd998cdSBen Walker --disable-coverage) 317577df16aSPawel Wodkowski CONFIG[COVERAGE]=n 3189dd998cdSBen Walker ;; 319995d60f4SBen Walker --enable-pgo-capture) 320995d60f4SBen Walker CONFIG[PGO_CAPTURE]=y 321995d60f4SBen Walker ;; 322995d60f4SBen Walker --disable-pgo-capture) 323995d60f4SBen Walker CONFIG[PGO_CAPTURE]=n 324995d60f4SBen Walker ;; 325995d60f4SBen Walker --enable-pgo-use) 326995d60f4SBen Walker CONFIG[PGO_USE]=y 327995d60f4SBen Walker ;; 328995d60f4SBen Walker --disable-pgo-use) 329995d60f4SBen Walker CONFIG[PGO_USE]=n 330995d60f4SBen Walker ;; 3319022a59eSDaniel Verkamp --enable-tests) 332577df16aSPawel Wodkowski CONFIG[TESTS]=y 3339022a59eSDaniel Verkamp ;; 3349022a59eSDaniel Verkamp --disable-tests) 335577df16aSPawel Wodkowski CONFIG[TESTS]=n 3369022a59eSDaniel Verkamp ;; 3379fcb1cb0STomasz Zawadzki --enable-unit-tests) 3389fcb1cb0STomasz Zawadzki CONFIG[UNIT_TESTS]=y 3399fcb1cb0STomasz Zawadzki ;; 3409fcb1cb0STomasz Zawadzki --disable-unit-tests) 3419fcb1cb0STomasz Zawadzki CONFIG[UNIT_TESTS]=n 3429fcb1cb0STomasz Zawadzki ;; 3439b2c6452SJacek Kalwas --enable-examples) 3449b2c6452SJacek Kalwas CONFIG[EXAMPLES]=y 3459b2c6452SJacek Kalwas ;; 3469b2c6452SJacek Kalwas --disable-examples) 3479b2c6452SJacek Kalwas CONFIG[EXAMPLES]=n 3489b2c6452SJacek Kalwas ;; 349119158cdSRajarshi Chowdhury --enable-apps) 350119158cdSRajarshi Chowdhury CONFIG[APPS]=y 351119158cdSRajarshi Chowdhury ;; 352119158cdSRajarshi Chowdhury --disable-apps) 353119158cdSRajarshi Chowdhury CONFIG[APPS]=N 354119158cdSRajarshi Chowdhury ;; 3559dd998cdSBen Walker --enable-werror) 356577df16aSPawel Wodkowski CONFIG[WERROR]=y 3579dd998cdSBen Walker ;; 3589dd998cdSBen Walker --disable-werror) 359577df16aSPawel Wodkowski CONFIG[WERROR]=n 3609dd998cdSBen Walker ;; 36191e42257SJim Harris --enable-cet) 36291e42257SJim Harris CONFIG[CET]=y 36391e42257SJim Harris ;; 36491e42257SJim Harris --disable-cet) 36591e42257SJim Harris CONFIG[CET]=n 36691e42257SJim Harris ;; 3677232c450SMichal Berger --with-dpdk) 3687b04eb72SYuriy Umanets # Can we use pkg-config? 3697b04eb72SYuriy Umanets if command -v "pkg-config" > /dev/null 2>&1 && pkg-config --exists libdpdk; then 3707b04eb72SYuriy Umanets dpdk_libdir=$(pkg-config --variable=libdir libdpdk) 3717b04eb72SYuriy Umanets dpdk_libdir=$(readlink -f $dpdk_libdir) 3727b04eb72SYuriy Umanets dpdk_incdir=$(pkg-config --variable=includedir libdpdk) 3737b04eb72SYuriy Umanets echo "Using DPDK lib dir $dpdk_libdir" 3747b04eb72SYuriy Umanets CONFIG[DPDK_LIB_DIR]=$dpdk_libdir 3757b04eb72SYuriy Umanets CONFIG[DPDK_INC_DIR]=$dpdk_incdir 3767232c450SMichal Berger CONFIG[DPDK_PKG_CONFIG]=y 3773e3fbf91SYuriy Umanets if pkg-config --print-requires libdpdk | grep "libbsd" > /dev/null 2>&1; then 3783e3fbf91SYuriy Umanets CONFIG[HAVE_LIBBSD]=y 3793e3fbf91SYuriy Umanets fi 3807232c450SMichal Berger CFLAGS="${CFLAGS:+$CFLAGS }$(pkg-config --cflags libdpdk)" 381f1980244SYuriy Umanets check_IPSec_mb "pkg-config" "$dpdk_libdir" "$dpdk_incdir" 3827232c450SMichal Berger else 3837232c450SMichal Berger echo "libdpdk.pc not found, aborting" 3847232c450SMichal Berger exit 1 3857232c450SMichal Berger fi 3867232c450SMichal Berger ;; 38706cc8045SBen Walker --with-dpdk=*) 38806cc8045SBen Walker check_dir "$i" 3897b04eb72SYuriy Umanets dpdk_dir=$(readlink -f ${i#*=}) 3907b04eb72SYuriy Umanets dpdk_libdir=$(find_dpdk_arch_libdir $dpdk_dir) 3917b04eb72SYuriy Umanets dpdk_incdir="$dpdk_dir/include" 3927b04eb72SYuriy Umanets 3937b04eb72SYuriy Umanets # Can we use pkg-config? 394f13ec525SKarol Latecki if command -v "pkg-config" > /dev/null 2>&1 && PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --exists libdpdk; then 3957b04eb72SYuriy Umanets echo "Using $dpdk_libdir/pkgconfig for additional libs..." 3961e6db5fbSTomasz Zawadzki sysroot_dir=$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --variable=pc_sysrootdir libdpdk) 397e9438453SJacek Kalwas dpdk_libdir=$(PKG_CONFIG_SYSROOT_DIR='' PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --variable=libdir libdpdk) 3981e6db5fbSTomasz Zawadzki dpdk_libdir=$(readlink -f "${sysroot_dir}$dpdk_libdir") 3997b04eb72SYuriy Umanets if ! echo $dpdk_libdir | grep $dpdk_dir > /dev/null 2>&1; then 4007b04eb72SYuriy Umanets echo "ERROR: pkg-config reported DPDK libdir $dpdk_libdir is out of the directory specified with --with-dpdk=" 4017b04eb72SYuriy Umanets echo "ERROR: do you have another DPDK installed in the system?" 4027b04eb72SYuriy Umanets exit 1 4037b04eb72SYuriy Umanets fi 404f13ec525SKarol Latecki dpdk_reqs=$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --print-requires libdpdk) 4053e3fbf91SYuriy Umanets if echo $dpdk_reqs | grep "libbsd" > /dev/null 2>&1; then 4063e3fbf91SYuriy Umanets CONFIG[HAVE_LIBBSD]=y 4073e3fbf91SYuriy Umanets fi 408f13ec525SKarol Latecki CFLAGS="${CFLAGS:+$CFLAGS }$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --cflags libdpdk)" 4091e6db5fbSTomasz Zawadzki dpdk_incdir="${sysroot_dir}$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --variable=includedir libdpdk)" 410f1980244SYuriy Umanets check_IPSec_mb "pkg-config" "$dpdk_libdir" "$dpdk_incdir" 4113e3fbf91SYuriy Umanets else 4123e3fbf91SYuriy Umanets echo "Using $dpdk_incdir/rte_build_config.h for additional libs..." 4133e3fbf91SYuriy Umanets 4143e3fbf91SYuriy Umanets if grep -F "define RTE_USE_LIBBSD 1" $dpdk_incdir/rte_build_config.h > /dev/null 2>&1; then 4153e3fbf91SYuriy Umanets CONFIG[HAVE_LIBBSD]=y 4163e3fbf91SYuriy Umanets fi 417f1980244SYuriy Umanets check_IPSec_mb "build-config" "$dpdk_libdir" "$dpdk_incdir" 4187b04eb72SYuriy Umanets fi 4197b04eb72SYuriy Umanets echo "DPDK libraries: $dpdk_libdir" 4207b04eb72SYuriy Umanets echo "DPDK includes: $dpdk_incdir" 4217b04eb72SYuriy Umanets CONFIG[DPDK_DIR]=$dpdk_dir 4227b04eb72SYuriy Umanets CONFIG[DPDK_LIB_DIR]="$dpdk_libdir" 4237b04eb72SYuriy Umanets CONFIG[DPDK_INC_DIR]="$dpdk_incdir" 4247b04eb72SYuriy Umanets CONFIG[DPDK_PKG_CONFIG]=n 42506cc8045SBen Walker ;; 42606cc8045SBen Walker --without-dpdk) 42706cc8045SBen Walker CONFIG[DPDK_DIR]= 42806cc8045SBen Walker ;; 4299854c138SNick Connolly --with-wpdk=*) 4309854c138SNick Connolly check_dir "$i" 4319854c138SNick Connolly CONFIG[WPDK_DIR]=$(readlink -f ${i#*=}) 4329854c138SNick Connolly ;; 4332bc71094SMichal Berger --without-wpdk) 4342bc71094SMichal Berger CONFIG[WPDK_DIR]= 4352bc71094SMichal Berger ;; 4369dd998cdSBen Walker --with-env=*) 437577df16aSPawel Wodkowski CONFIG[ENV]="${i#*=}" 4389dd998cdSBen Walker ;; 4399dd998cdSBen Walker --with-rbd) 440577df16aSPawel Wodkowski CONFIG[RBD]=y 4419dd998cdSBen Walker ;; 4429dd998cdSBen Walker --without-rbd) 443577df16aSPawel Wodkowski CONFIG[RBD]=n 4449dd998cdSBen Walker ;; 445daee62a0SAlexey Marchuk --with-rdma=*) 446daee62a0SAlexey Marchuk CONFIG[RDMA]=y 447daee62a0SAlexey Marchuk CONFIG[RDMA_PROV]=${i#*=} 448daee62a0SAlexey Marchuk ;; 4499dd998cdSBen Walker --with-rdma) 450577df16aSPawel Wodkowski CONFIG[RDMA]=y 451daee62a0SAlexey Marchuk CONFIG[RDMA_PROV]="verbs" 4529dd998cdSBen Walker ;; 4539dd998cdSBen Walker --without-rdma) 454577df16aSPawel Wodkowski CONFIG[RDMA]=n 4559dd998cdSBen Walker ;; 456ed56a3d4SAnil Veerabhadrappa --with-fc=*) 457ed56a3d4SAnil Veerabhadrappa CONFIG[FC]=y 458ed56a3d4SAnil Veerabhadrappa CONFIG[FC_PATH]=$(readlink -f ${i#*=}) 459ed56a3d4SAnil Veerabhadrappa ;; 460ed56a3d4SAnil Veerabhadrappa --with-fc) 461ed56a3d4SAnil Veerabhadrappa CONFIG[FC]=y 462ed56a3d4SAnil Veerabhadrappa CONFIG[FC_PATH]= 463ed56a3d4SAnil Veerabhadrappa ;; 464ed56a3d4SAnil Veerabhadrappa --without-fc) 465ed56a3d4SAnil Veerabhadrappa CONFIG[FC]=n 466ed56a3d4SAnil Veerabhadrappa CONFIG[FC_PATH]= 467ed56a3d4SAnil Veerabhadrappa ;; 4682e283fcbS0xe0f --with-daos) 4692e283fcbS0xe0f CONFIG[DAOS]=y 470044bb175SDenis Barakthanov CONFIG[DAOS_DIR]="" 471044bb175SDenis Barakthanov ;; 472044bb175SDenis Barakthanov --with-daos=*) 473044bb175SDenis Barakthanov CONFIG[DAOS]=y 474044bb175SDenis Barakthanov check_dir "$i" 475044bb175SDenis Barakthanov CONFIG[DAOS_DIR]=$(readlink -f ${i#*=}) 4762e283fcbS0xe0f ;; 4772e283fcbS0xe0f --without-daos) 4782e283fcbS0xe0f CONFIG[DAOS]=n 4792e283fcbS0xe0f ;; 4800923734cSLance Hartmann --with-shared) 481577df16aSPawel Wodkowski CONFIG[SHARED]=y 4820923734cSLance Hartmann ;; 4830923734cSLance Hartmann --without-shared) 484577df16aSPawel Wodkowski CONFIG[SHARED]=n 4850923734cSLance Hartmann ;; 4862af15344SJim Harris --with-iscsi-initiator) 487577df16aSPawel Wodkowski CONFIG[ISCSI_INITIATOR]=y 4882af15344SJim Harris ;; 4892af15344SJim Harris --without-iscsi-initiator) 490577df16aSPawel Wodkowski CONFIG[ISCSI_INITIATOR]=n 4912af15344SJim Harris ;; 4926118b853SDaniel Verkamp --with-crypto) 493577df16aSPawel Wodkowski CONFIG[CRYPTO]=y 4946118b853SDaniel Verkamp ;; 4956118b853SDaniel Verkamp --without-crypto) 496577df16aSPawel Wodkowski CONFIG[CRYPTO]=n 4976118b853SDaniel Verkamp ;; 49835260f2bSDaniel Verkamp --with-vhost) 499577df16aSPawel Wodkowski CONFIG[VHOST]=y 50035260f2bSDaniel Verkamp ;; 50135260f2bSDaniel Verkamp --without-vhost) 502577df16aSPawel Wodkowski CONFIG[VHOST]=n 50335260f2bSDaniel Verkamp ;; 5047dee96ceSDariusz Stojaczyk --with-virtio) 505577df16aSPawel Wodkowski CONFIG[VIRTIO]=y 5067dee96ceSDariusz Stojaczyk ;; 5077dee96ceSDariusz Stojaczyk --without-virtio) 508577df16aSPawel Wodkowski CONFIG[VIRTIO]=n 5097dee96ceSDariusz Stojaczyk ;; 510b30d57cdSChangpeng Liu --with-vfio-user) 511b30d57cdSChangpeng Liu CONFIG[VFIO_USER]=y 512d0b2448bSChangpeng Liu CONFIG[VFIO_USER_DIR]="" 513d0b2448bSChangpeng Liu ;; 514d0b2448bSChangpeng Liu --with-vfio-user=*) 515d0b2448bSChangpeng Liu CONFIG[VFIO_USER]=y 516d0b2448bSChangpeng Liu check_dir "$i" 517d0b2448bSChangpeng Liu CONFIG[VFIO_USER_DIR]=$(readlink -f ${i#*=}) 518b30d57cdSChangpeng Liu ;; 519b30d57cdSChangpeng Liu --without-vfio-user) 520b30d57cdSChangpeng Liu CONFIG[VFIO_USER]=n 521b30d57cdSChangpeng Liu ;; 522218dcd84SJim Harris --with-pmdk) 523577df16aSPawel Wodkowski CONFIG[PMDK]=y 524577df16aSPawel Wodkowski CONFIG[PMDK_DIR]="" 525fca11f15SPiotr Pelplinski ;; 526218dcd84SJim Harris --with-pmdk=*) 527577df16aSPawel Wodkowski CONFIG[PMDK]=y 5281723a800SGangCao check_dir "$i" 529577df16aSPawel Wodkowski CONFIG[PMDK_DIR]=$(readlink -f ${i#*=}) 530fca11f15SPiotr Pelplinski ;; 531218dcd84SJim Harris --without-pmdk) 532577df16aSPawel Wodkowski CONFIG[PMDK]=n 533fca11f15SPiotr Pelplinski ;; 53419e2dc38Spaul luse --with-vbdev-compress) 53519e2dc38Spaul luse CONFIG[VBDEV_COMPRESS]=y 53697022803SJim Harris ;; 53719e2dc38Spaul luse --without-vbdev-compress) 53819e2dc38Spaul luse CONFIG[VBDEV_COMPRESS]=n 53997022803SJim Harris ;; 5406f338d4bSKrishna Kanth Reddy --with-xnvme) 5416f338d4bSKrishna Kanth Reddy CONFIG[XNVME]=y 5426f338d4bSKrishna Kanth Reddy ;; 5436f338d4bSKrishna Kanth Reddy --without-xnvme) 5446f338d4bSKrishna Kanth Reddy CONFIG[XNVME]=n 5456f338d4bSKrishna Kanth Reddy ;; 546c3329b52SMichal Berger --with-fio) ;& 5479dd998cdSBen Walker --with-fio=*) 548c3329b52SMichal Berger if [[ ${i#*=} != "$i" ]]; then 54911a5716dSMichal Berger CONFIG[FIO_SOURCE_DIR]=${i#*=} 550c3329b52SMichal Berger fi 551c3329b52SMichal Berger check_dir "--with-fio=${CONFIG[FIO_SOURCE_DIR]}" 55211a5716dSMichal Berger CONFIG[FIO_SOURCE_DIR]=$(readlink -f "${CONFIG[FIO_SOURCE_DIR]}") 553577df16aSPawel Wodkowski CONFIG[FIO_PLUGIN]=y 5549dd998cdSBen Walker ;; 5559dd998cdSBen Walker --without-fio) 556577df16aSPawel Wodkowski CONFIG[FIO_PLUGIN]=n 5579dd998cdSBen Walker ;; 5585712088aSRoman Sudarikov --with-vtune=*) 5591723a800SGangCao check_dir "$i" 560577df16aSPawel Wodkowski CONFIG[VTUNE_DIR]="${i#*=}" 561577df16aSPawel Wodkowski CONFIG[VTUNE]=y 5625712088aSRoman Sudarikov ;; 5635712088aSRoman Sudarikov --without-vtune) 564577df16aSPawel Wodkowski CONFIG[VTUNE_DIR]= 565577df16aSPawel Wodkowski CONFIG[VTUNE]=n 5665712088aSRoman Sudarikov ;; 56798d60de6SPiotr Pelplinski --with-ocf) 56898d60de6SPiotr Pelplinski CONFIG[OCF]=y 569985d6468SKamil Godzwon CONFIG[OCF_PATH]=$(readlink -f "$rootdir/ocf") 57098d60de6SPiotr Pelplinski ;; 571d1fee489SVitaliy Mysak --with-ocf=*) 572d1fee489SVitaliy Mysak CONFIG[OCF]=y 573d1fee489SVitaliy Mysak CONFIG[OCF_PATH]=$(readlink -f ${i#*=}) 574d1fee489SVitaliy Mysak ;; 575d1fee489SVitaliy Mysak --without-ocf) 576d1fee489SVitaliy Mysak CONFIG[OCF]=n 577d1fee489SVitaliy Mysak CONFIG[OCF_PATH]= 578d1fee489SVitaliy Mysak ;; 5798165bf71SBen Walker --with-uring=*) 5808165bf71SBen Walker CONFIG[URING]=y 5818165bf71SBen Walker CONFIG[URING_PATH]=$(readlink -f ${i#*=}) 5828165bf71SBen Walker ;; 5838165bf71SBen Walker --with-uring) 5848165bf71SBen Walker CONFIG[URING]=y 585958d196cSIndraneel M CONFIG[URING_ZNS]=y 5868165bf71SBen Walker CONFIG[URING_PATH]= 5878165bf71SBen Walker ;; 5888165bf71SBen Walker --without-uring) 5898165bf71SBen Walker CONFIG[URING]=n 5908165bf71SBen Walker CONFIG[URING_PATH]= 5918165bf71SBen Walker ;; 592958d196cSIndraneel M --without-uring-zns) 593958d196cSIndraneel M CONFIG[URING_ZNS]=n 5948b840195SIndraneel M ;; 59534192459SBoris Glimcher --with-openssl=*) 59634192459SBoris Glimcher check_dir "$i" 59734192459SBoris Glimcher CONFIG[OPENSSL_PATH]=$(readlink -f ${i#*=}) 59834192459SBoris Glimcher ;; 5997fa15e28SXiaodong Liu --with-fuse) 6007fa15e28SXiaodong Liu CONFIG[FUSE]=y 6017fa15e28SXiaodong Liu ;; 6027fa15e28SXiaodong Liu --without-fuse) 6037fa15e28SXiaodong Liu CONFIG[FUSE]=n 6047fa15e28SXiaodong Liu ;; 605805d9942STomasz Kulasek --with-nvme-cuse) 606805d9942STomasz Kulasek CONFIG[NVME_CUSE]=y 607805d9942STomasz Kulasek ;; 608805d9942STomasz Kulasek --without-nvme-cuse) 609805d9942STomasz Kulasek CONFIG[NVME_CUSE]=n 610805d9942STomasz Kulasek ;; 61183a4b155SArtur Paszkiewicz --with-raid5f) 61283a4b155SArtur Paszkiewicz CONFIG[RAID5F]=y 61373763d40SArtur Paszkiewicz ;; 61483a4b155SArtur Paszkiewicz --without-raid5f) 61583a4b155SArtur Paszkiewicz CONFIG[RAID5F]=n 61673763d40SArtur Paszkiewicz ;; 617e58e9fbdSpaul luse --with-idxd) 618e58e9fbdSpaul luse CONFIG[IDXD]=y 6192ed914f8SZiye Yang CONFIG[IDXD_KERNEL]=n 620e58e9fbdSpaul luse ;; 621e58e9fbdSpaul luse --without-idxd) 622e58e9fbdSpaul luse CONFIG[IDXD]=n 623e58e9fbdSpaul luse ;; 6245a1c74bfSJim Harris --with-usdt) 6255a1c74bfSJim Harris CONFIG[USDT]=y 6265a1c74bfSJim Harris ;; 6275a1c74bfSJim Harris --without-usdt) 6285a1c74bfSJim Harris CONFIG[USDT]=n 6295a1c74bfSJim Harris ;; 630050565e5SJim Harris --with-fuzzer) 631050565e5SJim Harris echo "Must specify fuzzer library path with --with-fuzzer" 632050565e5SJim Harris usage 633050565e5SJim Harris exit 1 634050565e5SJim Harris ;; 635050565e5SJim Harris --with-fuzzer=*) 636050565e5SJim Harris CONFIG[FUZZER]=y 637050565e5SJim Harris CONFIG[FUZZER_LIB]=$(readlink -f ${i#*=}) 638050565e5SJim Harris ;; 639050565e5SJim Harris --without-fuzzer) 640050565e5SJim Harris CONFIG[FUZZER]=n 641050565e5SJim Harris CONFIG[FUZZER_LIB]= 642050565e5SJim Harris ;; 643509241ceSKonrad Sztyber --with-sma) 644509241ceSKonrad Sztyber CONFIG[SMA]=y 645509241ceSKonrad Sztyber ;; 646509241ceSKonrad Sztyber --without-sma) 647509241ceSKonrad Sztyber CONFIG[SMA]=n 648509241ceSKonrad Sztyber ;; 6499dd998cdSBen Walker --) 6509dd998cdSBen Walker break 6519dd998cdSBen Walker ;; 6529dd998cdSBen Walker *) 6539dd998cdSBen Walker echo "Unrecognized option $i" 6549dd998cdSBen Walker usage 6559dd998cdSBen Walker exit 1 6565ccabc8fSMichal Berger ;; 6579dd998cdSBen Walker esac 6589dd998cdSBen Walkerdone 6599dd998cdSBen Walker 660131c9aadSAlexey Marchukif [[ $arch == x86_64* ]]; then 66110e1c615SFélix Piédallu BUILD_CMD=($CC -o /dev/null -x c $CPPFLAGS $CFLAGS $LDFLAGS "-march=native") 662131c9aadSAlexey Marchukelse 66310e1c615SFélix Piédallu BUILD_CMD=($CC -o /dev/null -x c $CPPFLAGS $CFLAGS $LDFLAGS) 664131c9aadSAlexey Marchukfi 6656c23a6f4SMichal BergerBUILD_CMD+=(-I/usr/local/include -L/usr/local/lib) 66673439e6fSBen Walker 667b30d57cdSChangpeng Liuif [[ "${CONFIG[VFIO_USER]}" = "y" ]]; then 668421368c0SGreg Inozemtsev if ! echo -e '#include <json-c/json.h>' \ 669421368c0SGreg Inozemtsev | "${BUILD_CMD[@]}" -E - 2> /dev/null; then 6703b673b84SChangpeng Liu echo "ERROR: --with-vfio-user requires json-c-devel" 6713b673b84SChangpeng Liu echo "Please install then re-run this script" 6723b673b84SChangpeng Liu exit 1 6733b673b84SChangpeng Liu fi 674421368c0SGreg Inozemtsev if ! echo -e '#include <cmocka.h>' \ 675421368c0SGreg Inozemtsev | "${BUILD_CMD[@]}" -E - 2> /dev/null; then 6763b673b84SChangpeng Liu echo "ERROR: --with-vfio-user requires libcmocka-devel" 6773b673b84SChangpeng Liu echo "Please install then re-run this script" 6783b673b84SChangpeng Liu exit 1 679b30d57cdSChangpeng Liu fi 680b30d57cdSChangpeng Liufi 681b30d57cdSChangpeng Liu 682e58e9fbdSpaul luse# IDXD uses Intel specific instructions. 683e58e9fbdSpaul luseif [[ "${CONFIG[IDXD]}" = "y" ]]; then 6842755fbdfSpaul luse if [ $(uname -s) == "FreeBSD" ]; then 6852755fbdfSpaul luse intel="hw.model: Intel" 6862755fbdfSpaul luse cpu_vendor=$(sysctl -a | grep hw.model | cut -c 1-15) 6872755fbdfSpaul luse else 688e58e9fbdSpaul luse intel="GenuineIntel" 689e58e9fbdSpaul luse cpu_vendor=$(grep -i 'vendor' /proc/cpuinfo --max-count=1) 6902755fbdfSpaul luse fi 691e58e9fbdSpaul luse if [[ "$cpu_vendor" != *"$intel"* ]]; then 692ff238359SJosh Soref echo "ERROR: IDXD cannot be used due to CPU incompatibility." 693e58e9fbdSpaul luse exit 1 694e58e9fbdSpaul luse fi 6952ed914f8SZiye Yang if [ -e /usr/include/accel-config/libaccel_config.h ]; then 6962ed914f8SZiye Yang CONFIG[IDXD_KERNEL]=y 6972ed914f8SZiye Yang fi 6982ed914f8SZiye Yang 699e58e9fbdSpaul lusefi 700e58e9fbdSpaul luse 701577df16aSPawel Wodkowskiif [ -z "${CONFIG[ENV]}" ]; then 702577df16aSPawel Wodkowski CONFIG[ENV]=$rootdir/lib/env_dpdk 703577df16aSPawel Wodkowski echo "Using default SPDK env in ${CONFIG[ENV]}" 7047232c450SMichal Berger if [[ -z "${CONFIG[DPDK_DIR]}" && "${CONFIG[DPDK_PKG_CONFIG]}" == n ]]; then 70538e26cf5STomasz Zawadzki if [ ! -f "$rootdir"/dpdk/config/meson.build ]; then 706d199eb29SDaniel Verkamp echo "DPDK not found; please specify --with-dpdk=<path> or run:" 707d199eb29SDaniel Verkamp echo 708d199eb29SDaniel Verkamp echo " git submodule update --init" 709d199eb29SDaniel Verkamp exit 1 710577df16aSPawel Wodkowski else 711577df16aSPawel Wodkowski CONFIG[DPDK_DIR]="${rootdir}/dpdk/build" 712f1980244SYuriy Umanets # Default ipsec libs 71319518dfbSAleksey Marchuk if [[ "${CONFIG[CRYPTO]}" = "y" ]] && [[ $arch = x86_64* ]]; then 714f1980244SYuriy Umanets CONFIG[IPSEC_MB]=y 715f1980244SYuriy Umanets CONFIG[IPSEC_MB_DIR]="${rootdir}/intel-ipsec-mb/lib" 716f1980244SYuriy Umanets fi 717577df16aSPawel Wodkowski echo "Using default DPDK in ${CONFIG[DPDK_DIR]}" 718d199eb29SDaniel Verkamp fi 7199dd998cdSBen Walker fi 7207d2a2f52SBen Walkerelse 7217232c450SMichal Berger if [[ -n "${CONFIG[DPDK_DIR]}" || "${CONFIG[DPDK_PKG_CONFIG]}" == y ]]; then 72206cc8045SBen Walker echo "--with-env and --with-dpdk are mutually exclusive." 72306cc8045SBen Walker exit 1 72406cc8045SBen Walker fi 72506cc8045SBen Walker 726577df16aSPawel Wodkowski if [ "${CONFIG[VHOST]}" = "y" ]; then 7277d2a2f52SBen Walker echo "Vhost is only supported when using the default DPDK environment. Disabling it." 7287d2a2f52SBen Walker fi 7297d2a2f52SBen Walker # Always disable vhost, but only print the error message if the user explicitly turned it on. 730577df16aSPawel Wodkowski CONFIG[VHOST]="n" 731577df16aSPawel Wodkowski if [ "${CONFIG[VIRTIO]}" = "y" ]; then 7327d2a2f52SBen Walker echo "Virtio is only supported when using the default DPDK environment. Disabling it." 7337d2a2f52SBen Walker fi 7347d2a2f52SBen Walker # Always disable virtio, but only print the error message if the user explicitly turned it on. 735577df16aSPawel Wodkowski CONFIG[VIRTIO]="n" 7369dd998cdSBen Walkerfi 7379dd998cdSBen Walker 7387232c450SMichal Bergerif [[ "${CONFIG[DPDK_PKG_CONFIG]}" == y ]]; then 7397232c450SMichal Berger if [[ "${CONFIG[SHARED]}" == n ]]; then 7407232c450SMichal Berger # dpdk-devel doesn't provide static libs 7417232c450SMichal Berger echo "Build against packaged DPDK requested, enabling shared libraries" 7427232c450SMichal Berger CONFIG[SHARED]=y 7437232c450SMichal Berger fi 7447232c450SMichal Bergerfi 7457232c450SMichal Berger 7469854c138SNick Connollyif [[ $sys_name == "Windows" ]]; then 7479854c138SNick Connolly if [ -z "${CONFIG[WPDK_DIR]}" ]; then 7489854c138SNick Connolly if [ ! -f "$rootdir"/wpdk/Makefile ]; then 7499854c138SNick Connolly echo "WPDK not found; please specify --with-wpdk=<path>. See https://wpdk.github.io." 7509854c138SNick Connolly exit 1 7519854c138SNick Connolly else 7529854c138SNick Connolly CONFIG[WPDK_DIR]="${rootdir}/wpdk/build" 7539854c138SNick Connolly echo "Using default WPDK in ${CONFIG[WPDK_DIR]}" 7549854c138SNick Connolly fi 7559854c138SNick Connolly fi 7569854c138SNick Connollyelse 7579854c138SNick Connolly if [ -n "${CONFIG[WPDK_DIR]}" ]; then 7589854c138SNick Connolly echo "ERROR: --with-wpdk is only supported for Windows" 7599854c138SNick Connolly exit 1 7609854c138SNick Connolly fi 7619854c138SNick Connollyfi 7629854c138SNick Connolly 763577df16aSPawel Wodkowskiif [ "${CONFIG[VTUNE]}" = "y" ]; then 764577df16aSPawel Wodkowski if [ -z "${CONFIG[VTUNE_DIR]}" ]; then 7655712088aSRoman Sudarikov echo "When VTune is enabled, you must specify the VTune directory using --with-vtune=path" 7665712088aSRoman Sudarikov exit 1 7675712088aSRoman Sudarikov fi 7685712088aSRoman Sudarikovfi 7695712088aSRoman Sudarikov 770bb0f78a2SMichal Bergerif [[ "${CONFIG[ASAN]}" = "y" && "${CONFIG[TSAN]}" = "y" ]]; then 771830912e2SBen Walker echo "ERROR: ASAN and TSAN cannot be enabled at the same time." 772830912e2SBen Walker exit 1 773830912e2SBen Walkerfi 774830912e2SBen Walker 775ac5b53a5SJim Harrisif [[ "${CONFIG[FIO_PLUGIN]}" = "y" && "${CONFIG[EXAMPLES]}" = "n" ]]; then 776ac5b53a5SJim Harris echo "ERROR: --with-fio and --disable-examples are mutually exclusive." 777ac5b53a5SJim Harris exit 1 778ac5b53a5SJim Harrisfi 779ac5b53a5SJim Harris 7805a764955SMichal Bergerif [[ $sys_name == "FreeBSD" ]]; then 7815091cadcSPaul Luse # FreeBSD doesn't support all configurations 782577df16aSPawel Wodkowski if [[ "${CONFIG[COVERAGE]}" == "y" ]]; then 7835091cadcSPaul Luse echo "ERROR: CONFIG_COVERAGE not available on FreeBSD" 7845091cadcSPaul Luse exit 1 7855091cadcSPaul Luse fi 7865091cadcSPaul Lusefi 7875091cadcSPaul Luse 7882a0c2a2dSNick Connollyif [[ $sys_name != "Linux" ]]; then 78927b920a2SDarek Stojaczyk if [[ "${CONFIG[VHOST]}" == "y" ]]; then 790873c8748STomasz Kulasek echo "Vhost is only supported on Linux." 791873c8748STomasz Kulasek exit 1 79227b920a2SDarek Stojaczyk fi 79327b920a2SDarek Stojaczyk if [[ "${CONFIG[VIRTIO]}" == "y" ]]; then 794873c8748STomasz Kulasek echo "Virtio is only supported on Linux." 795873c8748STomasz Kulasek exit 1 79627b920a2SDarek Stojaczyk fi 79727b920a2SDarek Stojaczykfi 79827b920a2SDarek Stojaczyk 799577df16aSPawel Wodkowskiif [ "${CONFIG[RDMA]}" = "y" ]; then 800daee62a0SAlexey Marchuk if [[ ! "${CONFIG[RDMA_PROV]}" == "verbs" ]] && [[ ! "${CONFIG[RDMA_PROV]}" == "mlx5_dv" ]]; then 801daee62a0SAlexey Marchuk echo "Invalid RDMA provider specified, must be \"verbs\" or \"mlx5_dv\"" 802daee62a0SAlexey Marchuk exit 1 803daee62a0SAlexey Marchuk fi 804daee62a0SAlexey Marchuk 805eed0c6beSDarek Stojaczyk if ! echo -e '#include <infiniband/verbs.h>\n#include <rdma/rdma_verbs.h>\n' \ 806eed0c6beSDarek Stojaczyk 'int main(void) { return 0; }\n' \ 807bb0f78a2SMichal Berger | "${BUILD_CMD[@]}" -libverbs -lrdmacm - 2> /dev/null; then 808bb0f78a2SMichal Berger echo "--with-rdma requires libverbs and librdmacm." 809bb0f78a2SMichal Berger echo "Please install then re-run this script." 810eed0c6beSDarek Stojaczyk exit 1 811eed0c6beSDarek Stojaczyk fi 812eed0c6beSDarek Stojaczyk 813eed0c6beSDarek Stojaczyk if echo -e '#include <infiniband/verbs.h>\n' \ 814eed0c6beSDarek Stojaczyk 'int main(void) { return !!IBV_WR_SEND_WITH_INV; }\n' \ 815bb0f78a2SMichal Berger | "${BUILD_CMD[@]}" -c - 2> /dev/null; then 816577df16aSPawel Wodkowski CONFIG[RDMA_SEND_WITH_INVAL]="y" 8177671073bSSeth Howell else 818577df16aSPawel Wodkowski CONFIG[RDMA_SEND_WITH_INVAL]="n" 81917a819f8SJim Harris echo " 8207671073bSSeth Howell******************************************************************************* 8217671073bSSeth HowellWARNING: The Infiniband Verbs opcode Send With Invalidate is either not 8227671073bSSeth Howellsupported or is not functional with the current version of libibverbs installed 8237671073bSSeth Howellon this system. Please upgrade to at least version 1.1. 8247671073bSSeth Howell 8257671073bSSeth HowellBeginning with Linux kernel 4.14, the kernel NVMe-oF initiator leverages Send 8267671073bSSeth HowellWith Invalidate RDMA operations to improve performance. Failing to use the 8277671073bSSeth HowellSend With Invalidate operation on the NVMe-oF target side results in full 8287671073bSSeth Howellfunctionality, but greatly reduced performance. The SPDK NVMe-oF target will 8297671073bSSeth Howellbe unable to leverage that operation using the currently installed version 8307671073bSSeth Howellof libibverbs, so Linux kernel NVMe-oF initiators based on kernels greater 8317671073bSSeth Howellthan or equal to 4.14 will see significantly reduced performance. 83217a819f8SJim Harris*******************************************************************************" 8337671073bSSeth Howell fi 83494966468SAlexey Marchuk 83594966468SAlexey Marchuk if echo -e '#include <rdma/rdma_cma.h>\n' \ 83694966468SAlexey Marchuk 'int main(void) { return !!RDMA_OPTION_ID_ACK_TIMEOUT; }\n' \ 837bb0f78a2SMichal Berger | "${BUILD_CMD[@]}" -c - 2> /dev/null; then 83894966468SAlexey Marchuk CONFIG[RDMA_SET_ACK_TIMEOUT]="y" 83994966468SAlexey Marchuk else 84094966468SAlexey Marchuk CONFIG[RDMA_SET_ACK_TIMEOUT]="n" 84194966468SAlexey Marchuk echo "RDMA_OPTION_ID_ACK_TIMEOUT is not supported" 84294966468SAlexey Marchuk fi 84394966468SAlexey Marchuk 844daee62a0SAlexey Marchuk if [ "${CONFIG[RDMA_PROV]}" == "mlx5_dv" ]; then 845daee62a0SAlexey Marchuk if ! echo -e '#include <spdk/stdinc.h>\n' \ 846daee62a0SAlexey Marchuk '#include <infiniband/mlx5dv.h>\n' \ 847daee62a0SAlexey Marchuk '#include <rdma/rdma_cma.h>\n' \ 848daee62a0SAlexey Marchuk 'int main(void) { return rdma_establish(NULL) || ' \ 849daee62a0SAlexey Marchuk '!!IBV_QP_INIT_ATTR_SEND_OPS_FLAGS || !!MLX5_OPCODE_RDMA_WRITE; }\n' \ 850bb0f78a2SMichal Berger | "${BUILD_CMD[@]}" -lmlx5 -I${rootdir}/include -c - 2> /dev/null; then 851daee62a0SAlexey Marchuk echo "mlx5_dv provider is not supported" 852daee62a0SAlexey Marchuk exit 1 853daee62a0SAlexey Marchuk fi 854daee62a0SAlexey Marchuk fi 855daee62a0SAlexey Marchuk 856bb0f78a2SMichal Berger echo "Using '${CONFIG[RDMA_PROV]}' RDMA provider" 8577671073bSSeth Howellfi 8587671073bSSeth Howell 859ed56a3d4SAnil Veerabhadrappaif [[ "${CONFIG[FC]}" = "y" ]]; then 860ed56a3d4SAnil Veerabhadrappa if [[ -n "${CONFIG[FC_PATH]}" ]]; then 861*c9b4654bSTomasz Zawadzki check_dir "${CONFIG[FC_PATH]}" 862ed56a3d4SAnil Veerabhadrappa fi 863ed56a3d4SAnil Veerabhadrappafi 864ed56a3d4SAnil Veerabhadrappa 865ce711726SDarek Stojaczykif [[ "${CONFIG[PMDK]}" = "y" ]]; then 866ce711726SDarek Stojaczyk if ! echo -e '#include <libpmemblk.h>\nint main(void) { return 0; }\n' \ 867bb0f78a2SMichal Berger | "${BUILD_CMD[@]}" -lpmemblk - 2> /dev/null; then 868bb0f78a2SMichal Berger echo "--with-pmdk requires libpmemblk." 869bb0f78a2SMichal Berger echo "Please install then re-run this script." 870ce711726SDarek Stojaczyk exit 1 871ce711726SDarek Stojaczyk fi 872ce711726SDarek Stojaczykfi 873ce711726SDarek Stojaczyk 8742a6ddeb8SYuriy Umanetsfunction dpdk_version() { 8752a6ddeb8SYuriy Umanets # Check DPDK version to determine if mlx5_pci driver is supported 8762a6ddeb8SYuriy Umanets local dpdk_ver="none" 8772a6ddeb8SYuriy Umanets if [[ "${CONFIG[DPDK_DIR]}" == "$rootdir/dpdk/build" ]]; then 8782a6ddeb8SYuriy Umanets # DPDK_DIR points at our submodule so ./build may not exist yet. Use 8792a6ddeb8SYuriy Umanets # absolute path to lookup the version. 8802a6ddeb8SYuriy Umanets dpdk_ver=$(< "$rootdir/dpdk/VERSION") 8812a6ddeb8SYuriy Umanets elif [[ -f "${CONFIG[DPDK_DIR]}"/../VERSION ]]; then 8822a6ddeb8SYuriy Umanets dpdk_ver=$(< "${CONFIG[DPDK_DIR]}"/../VERSION) 8832a6ddeb8SYuriy Umanets fi 8842a6ddeb8SYuriy Umanets echo $dpdk_ver 8852a6ddeb8SYuriy Umanets} 8862a6ddeb8SYuriy Umanets 8872a6ddeb8SYuriy Umanetsfunction mlx5_build() { 8882a6ddeb8SYuriy Umanets # Check if libmlx5 exists to enable mlx5_pci compress/crypto PMD 8892a6ddeb8SYuriy Umanets if ! echo -e '#include <spdk/stdinc.h>\n' \ 8902a6ddeb8SYuriy Umanets '#include <infiniband/mlx5dv.h>\n' \ 8912a6ddeb8SYuriy Umanets '#include <infiniband/verbs.h>\n' \ 8922a6ddeb8SYuriy Umanets 'int main(void) { return 0; }\n' \ 8932a6ddeb8SYuriy Umanets | "${BUILD_CMD[@]}" -lmlx5 -libverbs -I${rootdir}/include -c - 2> /dev/null; then 8942a6ddeb8SYuriy Umanets return 1 8952a6ddeb8SYuriy Umanets fi 8962a6ddeb8SYuriy Umanets return 0 8972a6ddeb8SYuriy Umanets} 8982a6ddeb8SYuriy Umanets 89919e2dc38Spaul luseif [[ "${CONFIG[VBDEV_COMPRESS]}" = "y" ]]; then 900c4a3b312SDarek Stojaczyk if ! echo -e '#include <libpmem.h>\nint main(void) { return 0; }\n' \ 901bb0f78a2SMichal Berger | "${BUILD_CMD[@]}" -lpmem - 2> /dev/null; then 90219e2dc38Spaul luse echo "--with-vbdev-compress requires libpmem." 903bb0f78a2SMichal Berger echo "Please install then re-run this script." 90497022803SJim Harris exit 1 90597022803SJim Harris fi 9062a6ddeb8SYuriy Umanets # Try to enable mlx5 compress 90719e2dc38Spaul luse CONFIG[VBDEV_COMPRESS_MLX5]="y" 9082a6ddeb8SYuriy Umanets 909e71ae467SAlexey Marchuk # Check if libmlx5 exists to enable mlx5_pci compress PMD 9102a6ddeb8SYuriy Umanets if ! mlx5_build; then 911e71ae467SAlexey Marchuk echo "libmlx5 is not found, so disabling DPDK mlx5_pci compress PMD" 91219e2dc38Spaul luse CONFIG[VBDEV_COMPRESS_MLX5]="n" 9132a6ddeb8SYuriy Umanets else 914e71ae467SAlexey Marchuk if [[ "${CONFIG[DPDK_PKG_CONFIG]}" = "y" ]]; then 915e71ae467SAlexey Marchuk # Check if librte_compress_mlx5 exists in DPDK package 916e71ae467SAlexey Marchuk if [ ! -f "${CONFIG[DPDK_LIB_DIR]}"/librte_compress_mlx5.so ]; then 917e71ae467SAlexey Marchuk echo "librte_compress_mlx5 is not found, so disabling DPDK mlx5_pci compress PMD" 91819e2dc38Spaul luse CONFIG[VBDEV_COMPRESS_MLX5]="n" 919e71ae467SAlexey Marchuk fi 920e71ae467SAlexey Marchuk else 921e71ae467SAlexey Marchuk # Check DPDK version to determine if mlx5_pci driver is supported 9222a6ddeb8SYuriy Umanets dpdk_ver=$(dpdk_version) 9232a6ddeb8SYuriy Umanets if [[ $dpdk_ver = "none" ]]; then 924c2de56b0SMichal Berger echo "Cannot get DPDK version, so disabling DPDK mlx5_pci compress PMD" 92519e2dc38Spaul luse CONFIG[VBDEV_COMPRESS_MLX5]="n" 9262a6ddeb8SYuriy Umanets elif [[ -n $dpdk_ver ]] && lt "$dpdk_ver" 21.02.0; then 9272a6ddeb8SYuriy Umanets # mlx5_pci for compress is supported by DPDK >- 21.02.0 928c2de56b0SMichal Berger echo "DPDK version ${dpdk_ver} doesn't support mlx5_pci compress PMD" 92919e2dc38Spaul luse CONFIG[VBDEV_COMPRESS_MLX5]="n" 9302a6ddeb8SYuriy Umanets elif [[ -n ${CONFIG[DPDK_LIB_DIR]} ]] && [ ! -f "${CONFIG[DPDK_LIB_DIR]}"/librte_compress_mlx5.so ]; then 9312a6ddeb8SYuriy Umanets # This is only checked when --with-dpdk or --with-dpdk=* is used 9322a6ddeb8SYuriy Umanets echo "librte_compress_mlx5 is not found, so disabling DPDK mlx5_pci compress PMD" 93319e2dc38Spaul luse CONFIG[VBDEV_COMPRESS_MLX5]="n" 9342a6ddeb8SYuriy Umanets fi 9352a6ddeb8SYuriy Umanets fi 9362a6ddeb8SYuriy Umanets fi 9372a6ddeb8SYuriy Umanetsfi 9382a6ddeb8SYuriy Umanets 9392a6ddeb8SYuriy Umanetsif [[ "${CONFIG[CRYPTO]}" = "y" ]]; then 9402a6ddeb8SYuriy Umanets # Try to enable mlx5 crypto 9412a6ddeb8SYuriy Umanets CONFIG[CRYPTO_MLX5]="y" 9422a6ddeb8SYuriy Umanets 9432a6ddeb8SYuriy Umanets # Check if libmlx5 exists to enable mlx5_pci compress PMD 9442a6ddeb8SYuriy Umanets if ! mlx5_build; then 9452a6ddeb8SYuriy Umanets echo "libmlx5 is not found, so disabling DPDK mlx5_pci crypto PMD" 9462a6ddeb8SYuriy Umanets CONFIG[CRYPTO_MLX5]="n" 9472a6ddeb8SYuriy Umanets else 9482a6ddeb8SYuriy Umanets if [[ "${CONFIG[DPDK_PKG_CONFIG]}" = "y" ]]; then 9492a6ddeb8SYuriy Umanets # Check if librte_crypto_mlx5 exists in DPDK package 9502a6ddeb8SYuriy Umanets if [ ! -f "${CONFIG[DPDK_LIB_DIR]}"/librte_crypto_mlx5.so ]; then 9512a6ddeb8SYuriy Umanets echo "librte_crypto_mlx5 is not found, so disabling DPDK mlx5_pci crypto PMD" 9522a6ddeb8SYuriy Umanets CONFIG[CRYPTO_MLX5]="n" 9532a6ddeb8SYuriy Umanets fi 9542a6ddeb8SYuriy Umanets else 9552a6ddeb8SYuriy Umanets # Check DPDK version to determine if mlx5_pci driver is supported 9562a6ddeb8SYuriy Umanets dpdk_ver=$(dpdk_version) 9572a6ddeb8SYuriy Umanets if [[ $dpdk_ver = "none" ]]; then 9582a6ddeb8SYuriy Umanets echo "Cannot get DPDK version, so disabling DPDK mlx5_pci crypto PMD" 9592a6ddeb8SYuriy Umanets CONFIG[CRYPTO_MLX5]="n" 9608a2fc789SYuriy Umanets elif [[ -n $dpdk_ver ]] && lt "$dpdk_ver" 21.11.0; then 9618a2fc789SYuriy Umanets # mlx5_pci for crypto is supported by DPDK >- 21.11.0 9622a6ddeb8SYuriy Umanets echo "DPDK version ${dpdk_ver} doesn't support mlx5_pci crypto PMD" 9632a6ddeb8SYuriy Umanets CONFIG[CRYPTO_MLX5]="n" 9642a6ddeb8SYuriy Umanets elif [[ -n ${CONFIG[DPDK_LIB_DIR]} ]] && [ ! -f "${CONFIG[DPDK_LIB_DIR]}"/librte_crypto_mlx5.so ]; then 9652a6ddeb8SYuriy Umanets # This is only checked when --with-dpdk or --with-dpdk=* is used 9662a6ddeb8SYuriy Umanets echo "librte_crypto_mlx5 is not found, so disabling DPDK mlx5_pci crypto PMD" 9672a6ddeb8SYuriy Umanets CONFIG[CRYPTO_MLX5]="n" 9682a6ddeb8SYuriy Umanets fi 969e71ae467SAlexey Marchuk fi 970e269bf4eSAlexey Marchuk fi 97197022803SJim Harrisfi 97297022803SJim Harris 973805d9942STomasz Kulasekif [[ "${CONFIG[NVME_CUSE]}" = "y" ]]; then 974805d9942STomasz 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' \ 975bb0f78a2SMichal Berger | "${BUILD_CMD[@]}" -lfuse3 -D_FILE_OFFSET_BITS=64 - 2> /dev/null; then 976bb0f78a2SMichal Berger echo "--with-cuse requires libfuse3." 977bb0f78a2SMichal Berger echo "Please install then re-run this script." 978805d9942STomasz Kulasek exit 1 979805d9942STomasz Kulasek fi 980805d9942STomasz Kulasekfi 981805d9942STomasz Kulasek 98255bd0d3aSDarek Stojaczykif [[ "${CONFIG[RBD]}" = "y" ]]; then 98355bd0d3aSDarek Stojaczyk if ! echo -e '#include <rbd/librbd.h>\n#include <rados/librados.h>\n' \ 98455bd0d3aSDarek Stojaczyk 'int main(void) { return 0; }\n' \ 985bb0f78a2SMichal Berger | "${BUILD_CMD[@]}" -lrados -lrbd - 2> /dev/null; then 986bb0f78a2SMichal Berger echo "--with-rbd requires librados and librbd." 987bb0f78a2SMichal Berger echo "Please install then re-run this script." 98855bd0d3aSDarek Stojaczyk exit 1 98955bd0d3aSDarek Stojaczyk fi 99055bd0d3aSDarek Stojaczykfi 99155bd0d3aSDarek Stojaczyk 9925cb18040SDarek Stojaczykif [[ "${CONFIG[ISCSI_INITIATOR]}" = "y" ]]; then 9935cb18040SDarek Stojaczyk # Fedora installs libiscsi to /usr/lib64/iscsi for some reason. 9945cb18040SDarek Stojaczyk if ! echo -e '#include <iscsi/iscsi.h>\n#include <iscsi/scsi-lowlevel.h>\n' \ 9955cb18040SDarek Stojaczyk '#if LIBISCSI_API_VERSION < 20150621\n' \ 9965cb18040SDarek Stojaczyk '#error\n' \ 9975cb18040SDarek Stojaczyk '#endif\n' \ 9985cb18040SDarek Stojaczyk 'int main(void) { return 0; }\n' \ 999bb0f78a2SMichal Berger | "${BUILD_CMD[@]}" -L/usr/lib64/iscsi -liscsi - 2> /dev/null; then 1000bb0f78a2SMichal Berger echo "--with-iscsi-initiator requires libiscsi with" 1001bb0f78a2SMichal Berger echo "LIBISCSI_API_VERSION >= 20150621." 1002bb0f78a2SMichal Berger echo "Please install then re-run this script." 10035cb18040SDarek Stojaczyk exit 1 10045cb18040SDarek Stojaczyk fi 10055cb18040SDarek Stojaczykfi 10065cb18040SDarek Stojaczyk 10072e283fcbS0xe0fif [[ "${CONFIG[DAOS]}" = "y" ]]; then 1008044bb175SDenis Barakthanov daos_build_cmd=("${BUILD_CMD[@]}") 1009044bb175SDenis Barakthanov if [[ -n "${CONFIG[DAOS_DIR]}" ]]; then 1010044bb175SDenis Barakthanov daos_build_cmd+=(-I"${CONFIG[DAOS_DIR]}"/include -L"${CONFIG[DAOS_DIR]}"/lib64) 1011044bb175SDenis Barakthanov fi 10122e283fcbS0xe0f if ! echo -e '#include <daos.h>\n#include <daos_fs.h>\n' \ 10132e283fcbS0xe0f 'int main(void) { return 0; }\n' \ 1014044bb175SDenis Barakthanov | "${daos_build_cmd[@]}" -lgurt -ldaos -ldaos_common -ldfs - 2> /dev/null; then 10152e283fcbS0xe0f echo "--with-daos requires libdaos, libdaos_common, libdfs and libgurt" 10162e283fcbS0xe0f echo "Please install then re-run this script." 10172e283fcbS0xe0f exit 1 10182e283fcbS0xe0f fi 10192e283fcbS0xe0ffi 10202e283fcbS0xe0f 10213674c1d3SDarek Stojaczykif [[ "${CONFIG[ASAN]}" = "y" ]]; then 10223674c1d3SDarek Stojaczyk if ! echo -e 'int main(void) { return 0; }\n' \ 1023bb0f78a2SMichal Berger | "${BUILD_CMD[@]}" -fsanitize=address - 2> /dev/null; then 1024bb0f78a2SMichal Berger echo "--enable-asan requires libasan." 1025bb0f78a2SMichal Berger echo "Please install then re-run this script." 10263674c1d3SDarek Stojaczyk exit 1 10273674c1d3SDarek Stojaczyk fi 10283674c1d3SDarek Stojaczykfi 10293674c1d3SDarek Stojaczyk 10303674c1d3SDarek Stojaczykif [[ "${CONFIG[UBSAN]}" = "y" ]]; then 10313674c1d3SDarek Stojaczyk if ! echo -e 'int main(void) { return 0; }\n' \ 1032bb0f78a2SMichal Berger | "${BUILD_CMD[@]}" -fsanitize=undefined - 2> /dev/null; then 1033bb0f78a2SMichal Berger echo "--enable-ubsan requires libubsan." 1034bb0f78a2SMichal Berger echo "Please install then re-run this script." 1035bb0f78a2SMichal Berger echo "If installed, please check that the GCC version is at least 6.4" 1036bb0f78a2SMichal Berger echo "and synchronize CC accordingly." 10373674c1d3SDarek Stojaczyk exit 1 10383674c1d3SDarek Stojaczyk fi 10393674c1d3SDarek Stojaczykfi 10403674c1d3SDarek Stojaczyk 10413674c1d3SDarek Stojaczykif [[ "${CONFIG[TSAN]}" = "y" ]]; then 10423674c1d3SDarek Stojaczyk if ! echo -e 'int main(void) { return 0; }\n' \ 1043bb0f78a2SMichal Berger | "${BUILD_CMD[@]}" -fsanitize=thread - 2> /dev/null; then 1044bb0f78a2SMichal Berger echo "--enable-tsan requires libtsan." 1045bb0f78a2SMichal Berger echo "Please install then re-run this script." 10463674c1d3SDarek Stojaczyk exit 1 10473674c1d3SDarek Stojaczyk fi 10483674c1d3SDarek Stojaczykfi 10493674c1d3SDarek Stojaczyk 105043a3984cSJim Harrisif echo -e '#include <stdlib.h>\nint main(void) { arc4random(); return 0; }\n' \ 105143a3984cSJim Harris | "${BUILD_CMD[@]}" - 2> /dev/null; then 105243a3984cSJim Harris CONFIG[HAVE_ARC4RANDOM]="y" 105343a3984cSJim Harrisfi 105443a3984cSJim Harris 1055d1fee489SVitaliy Mysakif [[ "${CONFIG[OCF]}" = "y" ]]; then 1056d1fee489SVitaliy Mysak # If OCF_PATH is a file, assume it is a library and use it to compile with 1057d1fee489SVitaliy Mysak if [ -f ${CONFIG[OCF_PATH]} ]; then 1058d1fee489SVitaliy Mysak CONFIG[CUSTOMOCF]=y 1059d1fee489SVitaliy Mysak else 1060d1fee489SVitaliy Mysak CONFIG[CUSTOMOCF]=n 1061d1fee489SVitaliy Mysak fi 1062d1fee489SVitaliy Mysakfi 1063d1fee489SVitaliy Mysak 1064995d60f4SBen Walkerif [[ "${CONFIG[PGO_CAPTURE]}" = "y" && "${CONFIG[PGO_USE]}" = "y" ]]; then 1065995d60f4SBen Walker echo "ERROR: --enable-pgo-capture and --enable-pgo-use are mutually exclusive." 1066995d60f4SBen Walker exit 1 1067954728e9SBen Walkerelif [[ "${CONFIG[PGO_USE]}" = "y" ]]; then 1068954728e9SBen Walker if [[ "$CC_TYPE" = "clang" ]]; then 1069954728e9SBen Walker # For clang we need to run an extra step on gathered profiling data. 1070954728e9SBen Walker echo "Generating suitable profile data" 1071954728e9SBen Walker llvm-profdata merge -output=build/pgo/default.profdata build/pgo 1072954728e9SBen Walker fi 1073995d60f4SBen Walkerfi 1074995d60f4SBen Walker 10758165bf71SBen Walkerif [[ "${CONFIG[URING]}" = "y" ]]; then 10768165bf71SBen Walker if [[ -n "${CONFIG[URING_PATH]}" ]]; then 1077*c9b4654bSTomasz Zawadzki check_dir "${CONFIG[URING_PATH]}" 10784ccc9ea3SJim Harris elif ! echo -e '#include <liburing.h>\nint main(void) { return 0; }\n' \ 10794ccc9ea3SJim Harris | "${BUILD_CMD[@]}" -luring - 2> /dev/null; then 10804ccc9ea3SJim Harris echo "--with-uring requires liburing." 10814ccc9ea3SJim Harris echo "Please build and install then re-run this script." 10824ccc9ea3SJim Harris exit 1 10838165bf71SBen Walker fi 1084958d196cSIndraneel M # Support for Zoned devices is enabled by default for Uring bdev. Check appropriate support in kernel. 10858b840195SIndraneel M if [[ "${CONFIG[URING_ZNS]}" = "y" ]]; then 10868b840195SIndraneel M if ! echo -e '#include<linux/blkzoned.h>\nint main(void) { return BLK_ZONE_REP_CAPACITY; }\n' \ 10878b840195SIndraneel M | "${BUILD_CMD[@]}" -c - 2> /dev/null; then 1088958d196cSIndraneel M echo "Disabling Zoned NS support in Uring! Requires blkzoned.h from kernel >= linux-5.9." 1089958d196cSIndraneel M CONFIG[URING_ZNS]=n 1090958d196cSIndraneel M fi 10918b840195SIndraneel M fi 10928b840195SIndraneel Mfi 10938b840195SIndraneel M 10947fa15e28SXiaodong Liuif [[ "${CONFIG[FUSE]}" = "y" ]]; then 10957fa15e28SXiaodong Liu if [[ ! -d /usr/include/fuse3 ]] && [[ ! -d /usr/local/include/fuse3 ]]; then 10967fa15e28SXiaodong Liu echo "--with-fuse requires libfuse3." 10977fa15e28SXiaodong Liu echo "Please install then re-run this script." 10987fa15e28SXiaodong Liu exit 1 10997fa15e28SXiaodong Liu fi 11007fa15e28SXiaodong Liufi 11017fa15e28SXiaodong Liu 110291e42257SJim Harrisif [ "${CONFIG[CET]}" = "y" ]; then 1103bb0f78a2SMichal Berger if ! echo -e 'int main(void) { return 0; }\n' | "${BUILD_CMD[@]}" -fcf-protection - 2> /dev/null; then 1104bb0f78a2SMichal Berger echo "--enable-cet requires compiler/linker that supports CET." 1105bb0f78a2SMichal Berger echo "Please install then re-run this script." 110691e42257SJim Harris exit 1 110791e42257SJim Harris fi 110891e42257SJim Harrisfi 110991e42257SJim Harris 1110050565e5SJim Harrisif [[ "${CONFIG[FUZZER]}" = "y" && "$CC_TYPE" != "clang" ]]; then 1111050565e5SJim Harris echo "--with-fuzzer requires setting CC and CXX to clang." 1112050565e5SJim Harris exit 1 1113050565e5SJim Harrisfi 1114050565e5SJim Harris 1115dd2c08d2Spaul luseif [[ $arch == x86_64* ]] || [[ $arch == aarch64* ]]; then 1116dd2c08d2Spaul luse CONFIG[ISAL]=y 1117dd2c08d2Spaul luse # make sure the submodule is initialized 11189d2f6f86SJim Harris if [ ! -f "$rootdir"/isa-l/autogen.sh ]; then 1119dd2c08d2Spaul luse echo "ISA-L is required but was not found, please init the submodule with:" 11209d2f6f86SJim Harris echo " git submodule update --init" 1121dd2c08d2Spaul luse echo "and then re-run this script." 11229d2f6f86SJim Harris exit 1 11239d2f6f86SJim Harris fi 1124dd2c08d2Spaul luse # for x86 only, check the nasm version for ISA-L and IPSEC 1125dd2c08d2Spaul luse if [[ $arch == x86_64* ]]; then 1126dd2c08d2Spaul luse ver=$(nasm -v 2> /dev/null | awk '{print $3}' | awk -Fr '{print $1}') 1127dd2c08d2Spaul luse if lt "$ver" 2.14; then 1128dd2c08d2Spaul luse CONFIG[ISAL]=n 1129dd2c08d2Spaul luse # IPSEC has nasm requirement and DPDK crypto relies on IPSEC 1130dd2c08d2Spaul luse CONFIG[IPSEC_MB]=n 1131dd2c08d2Spaul luse echo "WARNING: ISA-L & DPDK crypto cannot be used as nasm ver must be 2.14 or newer." 1132dd2c08d2Spaul luse fi 1133dd2c08d2Spaul luse fi 1134dd2c08d2Spaul luseelse 1135dd2c08d2Spaul luse # for PPC 1136dd2c08d2Spaul luse CONFIG[ISAL]=n 1137dd2c08d2Spaul luse echo "WARNING: ISA-L cannot be used due to architecture incompatibility." 1138dd2c08d2Spaul lusefi 11399d2f6f86SJim Harris 1140dd2c08d2Spaul luse# now either configure ISA-L or disable unavailable features 1141dd2c08d2Spaul luseif [[ "${CONFIG[ISAL]}" = "y" ]]; then 11429d2f6f86SJim Harris cd $rootdir/isa-l 11439d2f6f86SJim Harris ISAL_LOG=$rootdir/isa-l/spdk-isal.log 11449d2f6f86SJim Harris if [[ -n "${CONFIG[CROSS_PREFIX]}" ]]; then 11459d2f6f86SJim Harris ISAL_OPTS=("--host=${CONFIG[CROSS_PREFIX]}") 11469d2f6f86SJim Harris else 11479d2f6f86SJim Harris ISAL_OPTS=() 11489d2f6f86SJim Harris fi 11499d2f6f86SJim Harris echo -n "Configuring ISA-L (logfile: $ISAL_LOG)..." 11509d2f6f86SJim Harris ./autogen.sh &> $ISAL_LOG 11519d2f6f86SJim Harris ./configure CFLAGS="-fPIC -g -O2" "${ISAL_OPTS[@]}" --enable-shared=no >> $ISAL_LOG 2>&1 11529d2f6f86SJim Harris echo "done." 11539d2f6f86SJim Harris cd $rootdir 1154dd2c08d2Spaul luseelse 1155dd2c08d2Spaul luse echo "Without ISA-L, there is no software support for crypto or compression," 1156dd2c08d2Spaul luse echo "so these features will be disabled." 1157dd2c08d2Spaul luse CONFIG[CRYPTO]=n 115819e2dc38Spaul luse CONFIG[VBDEV_COMPRESS]=n 11599d2f6f86SJim Harrisfi 11609d2f6f86SJim Harris 1161509241ceSKonrad Sztyberif [[ "${CONFIG[SMA]}" = "y" ]]; then 1162509241ceSKonrad Sztyber if ! python3 -c 'import grpc; import grpc_tools' 2> /dev/null; then 1163509241ceSKonrad Sztyber echo "--with-sma requires grpcio and grpcio-tools python packages." 1164509241ceSKonrad Sztyber echo "Please install then re-run this script." 1165509241ceSKonrad Sztyber exit 1 1166509241ceSKonrad Sztyber fi 1167509241ceSKonrad Sztyberfi 1168509241ceSKonrad Sztyber 1169fcc38949SRui Chang# For ARM Neoverse-N1 platform, debug build needs gcc version newer than 8.4 1170fcc38949SRui Changif [[ "${CONFIG[DEBUG]}" = "y" && $arch = aarch64* && "$CC_TYPE" = "gcc" ]]; then 1171fcc38949SRui Chang GCC_VERSION=$($CC -dumpfullversion) 1172fcc38949SRui Chang PART_NUM=$(grep -i -m 1 "CPU part" /proc/cpuinfo | awk '{print $4}') 1173fcc38949SRui Chang 1174fcc38949SRui Chang if [[ "$(printf '%s\n' "8.4.0" "$GCC_VERSION" | sort -V | head -n1)" != "8.4.0" ]]; then 1175fcc38949SRui Chang if [[ $PART_NUM = 0xd0c ]]; then 1176fcc38949SRui Chang echo "WARNING: For ARM Neoverse-N1 platform, debug build needs GCC version newer than 8.4." 1177fcc38949SRui Chang echo " Will work around this by using armv8.2-a+crypto as target architecture for now." 1178fcc38949SRui Chang CONFIG[ARCH]=armv8.2-a+crypto 1179e8f84531SSunil Shahu elif [[ $PART_NUM = 0x0b2 ]]; then 1180e8f84531SSunil Shahu echo "WARNING: For ARM octeontx2 platform, debug build needs GCC version newer than 8.4." 1181e8f84531SSunil Shahu echo " Will work around this by using armv8.2-a+crypto as target architecture for now." 1182e8f84531SSunil Shahu CONFIG[ARCH]=armv8.2-a+crypto 1183fcc38949SRui Chang fi 1184fcc38949SRui Chang fi 1185fcc38949SRui Changfi 1186fcc38949SRui Chang 118748f70f48SPawel Wodkowski# We are now ready to generate final configuration. But first do sanity 118848f70f48SPawel Wodkowski# check to see if all keys in CONFIG array have its reflection in CONFIG file. 1189bb0f78a2SMichal Bergerif (($(grep -cE "^\s*CONFIG_[[:alnum:]_]+=" "$rootdir/CONFIG") != ${#CONFIG[@]})); then 119048f70f48SPawel Wodkowski echo "" 119148f70f48SPawel Wodkowski echo "BUG: Some configuration options are not present in CONFIG file. Please update this file." 119248f70f48SPawel Wodkowski echo "Missing options in CONFIG (+) file and in current config (-): " 119348f70f48SPawel Wodkowski diff -u --label "CONFIG file" --label "CONFIG[@]" \ 1194f8d6541dSMichal Berger <(sed -r -e '/^[[:space:]]*$/d; /^[[:space:]]*#.*/d; s/(CONFIG_[[:alnum:]_]+)=.*/\1/g' CONFIG | sort) \ 1195bb0f78a2SMichal Berger <(printf "CONFIG_%s\n" "${!CONFIG[@]}" | sort) 119648f70f48SPawel Wodkowski exit 1 119748f70f48SPawel Wodkowskifi 119848f70f48SPawel Wodkowski 119985bc2bbeSPawel Wodkowskiecho -n "Creating mk/config.mk..." 1200e62a3c65SSeth Howellcp -f $rootdir/CONFIG $rootdir/mk/config.mk 120151ab849bSJim HarrisARGS=$(echo "$@" | sed 's/ /\\ /g') 120251ab849bSJim Harrissed -i.bak -r "s#__CONFIGURE_OPTIONS__#${ARGS}#g" $rootdir/mk/config.mk 1203bb0f78a2SMichal Bergerfor key in "${!CONFIG[@]}"; do 1204f8d6541dSMichal Berger sed -i.bak -r "s#[[:space:]]*CONFIG_${key}=.*#CONFIG_${key}\?=${CONFIG[$key]}#g" $rootdir/mk/config.mk 1205577df16aSPawel Wodkowskidone 1206577df16aSPawel Wodkowski# On FreeBSD sed -i 'SUFFIX' - SUFFIX is mandatory. So no way but to delete the backed file. 1207e62a3c65SSeth Howellrm -f $rootdir/mk/config.mk.bak 1208baa6eac0SDarek Stojaczykecho "done." 12099dd998cdSBen Walker 121008ec96ebSDaniel Verkamp# Environment variables 1211baa6eac0SDarek Stojaczykecho -n "Creating mk/cc.flags.mk..." 1212e62a3c65SSeth Howellrm -f $rootdir/mk/cc.flags.mk 1213e62a3c65SSeth Howell[ -n "$CFLAGS" ] && echo "CFLAGS?=$CFLAGS" > $rootdir/mk/cc.flags.mk 1214e62a3c65SSeth Howell[ -n "$CXXFLAGS" ] && echo "CXXFLAGS?=$CXXFLAGS" >> $rootdir/mk/cc.flags.mk 1215e62a3c65SSeth Howell[ -n "$LDFLAGS" ] && echo "LDFLAGS?=$LDFLAGS" >> $rootdir/mk/cc.flags.mk 1216e62a3c65SSeth Howell[ -n "$DESTDIR" ] && echo "DESTDIR?=$DESTDIR" >> $rootdir/mk/cc.flags.mk 12170b56a5b4SJim Harrisecho "done." 121885bc2bbeSPawel Wodkowski 1219db3ebfe6SMichal Berger# Create .sh with build config for easy sourcing|lookup during the tests. 1220db3ebfe6SMichal Bergerfor conf in "${!CONFIG[@]}"; do 1221db3ebfe6SMichal Berger echo "CONFIG_$conf=${CONFIG[$conf]}" 1222db3ebfe6SMichal Bergerdone > "$rootdir/test/common/build_config.sh" 1223db3ebfe6SMichal Berger 12245a764955SMichal Bergerif [[ $sys_name == "FreeBSD" ]]; then 1225870ce250SPaul Luse echo "Type 'gmake' to build." 1226870ce250SPaul Luseelse 12270b56a5b4SJim Harris echo "Type 'make' to build." 1228870ce250SPaul Lusefi 12299dd998cdSBen Walker 12309dd998cdSBen Walkerexit 0 1231