19dd998cdSBen Walker#!/usr/bin/env bash 29dd998cdSBen Walker 39dd998cdSBen Walkerset -e 49dd998cdSBen Walker 514bbde7bSPawel Wodkowskitrap 'echo -e "\n\nConfiguration failed\n\n" >&2' ERR 614bbde7bSPawel Wodkowski 7e62a3c65SSeth Howellrootdir=$(readlink -f $(dirname $0)) 865ed6034SMichal Bergersource "$rootdir/scripts/common.sh" 9e62a3c65SSeth Howell 105ccabc8fSMichal Bergerfunction usage() { 119dd998cdSBen Walker echo "'configure' configures SPDK to compile on supported platforms." 129dd998cdSBen Walker echo "" 139dd998cdSBen Walker echo "Usage: ./configure [OPTION]..." 149dd998cdSBen Walker echo "" 159dd998cdSBen Walker echo "Defaults for the options are specified in brackets." 169dd998cdSBen Walker echo "" 179dd998cdSBen Walker echo "General:" 189dd998cdSBen Walker echo " -h, --help Display this help and exit" 192e7fe8e8SDaniel Verkamp echo "" 202e7fe8e8SDaniel Verkamp echo " --prefix=path Configure installation prefix (default: /usr/local)" 210e6ddfd6SBen Walker echo " --target-arch=arch Target build architecture. Must be a valid GNU arch. Default: native" 222e7fe8e8SDaniel Verkamp echo "" 233def834cSAmelia Blachuciak echo " --cross-prefix=prefix Prefix for cross compilation (default: none)" 243def834cSAmelia Blachuciak echo " example: aarch64-linux-gnu" 25e8863cb7SMichal Berger echo " --libdir=path Configure installation path for the libraries (default: \$prefix/lib)" 263def834cSAmelia Blachuciak echo "" 279dd998cdSBen Walker echo " --enable-debug Configure for debug builds" 289dd998cdSBen Walker echo " --enable-werror Treat compiler warnings as errors" 299dd998cdSBen Walker echo " --enable-asan Enable address sanitizer" 309dd998cdSBen Walker echo " --enable-ubsan Enable undefined behavior sanitizer" 319dd998cdSBen Walker echo " --enable-coverage Enable code coverage tracking" 326d6d1161SDaniel Verkamp echo " --enable-lto Enable link-time optimization" 33995d60f4SBen Walker echo " --enable-pgo-capture Enable generation of profile guided optimization data" 34995d60f4SBen Walker echo " --enable-pgo-use Use previously captured profile guided optimization data" 3591e42257SJim Harris echo " --enable-cet Enable Intel Control-flow Enforcement Technology (CET)" 369fcb1cb0STomasz Zawadzki echo " --disable-tests Disable building of functional tests" 379fcb1cb0STomasz Zawadzki echo " --disable-unit-tests Disable building of unit tests" 389b2c6452SJacek Kalwas echo " --disable-examples Disable building of examples" 39119158cdSRajarshi Chowdhury echo " --disable-apps Disable building of apps" 409dd998cdSBen Walker echo "" 419dd998cdSBen Walker echo "Specifying Dependencies:" 429dd998cdSBen Walker echo "--with-DEPENDENCY[=path] Use the given dependency. Optionally, provide the" 439dd998cdSBen Walker echo " path." 449dd998cdSBen Walker echo "--without-DEPENDENCY Do not link to the given dependency. This may" 459dd998cdSBen Walker echo " disable features and components." 469dd998cdSBen Walker echo "" 479dd998cdSBen Walker echo "Valid dependencies are listed below." 482bc71094SMichal Berger echo " --with-dpdk[=DIR] Build against a custom dpdk version. By default, the dpdk" 492bc71094SMichal Berger echo " --without-dpdk submodule in spdk tree will be used." 509dd998cdSBen Walker echo " example: /usr/share/dpdk/x86_64-default-linuxapp-gcc" 512bc71094SMichal Berger echo " --with-env=DIR Use an alternate environment implementation instead of DPDK." 5206cc8045SBen Walker echo " Implies --without-dpdk." 532bc71094SMichal Berger echo " --with-idxd Build the IDXD library and accel framework plug-in module." 542bc71094SMichal Berger echo " --without-idxd Disabled while experimental. Only built for x86 when enabled." 552bc71094SMichal Berger echo " --with-crypto Build vbdev crypto module." 562bc71094SMichal Berger echo " --without-crypto No path required." 572bc71094SMichal Berger echo " --with-fio[=DIR] Build fio_plugin." 582bc71094SMichal Berger echo " --without-fio default: /usr/src/fio" 596f338d4bSKrishna Kanth Reddy echo " --with-xnvme Build xNVMe bdev module." 606f338d4bSKrishna Kanth Reddy echo " --without-xnvme No path required." 612bc71094SMichal Berger echo " --with-vhost Build vhost target. Enabled by default." 622bc71094SMichal Berger echo " --without-vhost No path required." 632bc71094SMichal Berger echo " --with-virtio Build vhost initiator and virtio-pci bdev modules." 642bc71094SMichal Berger echo " --without-virtio No path required." 65e50ade31SChangpeng Liu echo " --with-vfio-user[=DIR] Build custom vfio-user transport for NVMf target and vfio-user target." 66e50ade31SChangpeng Liu echo " vfio-user initiator is always built-in in Linux." 672f731c63SGangCao echo " example: /usr/src/libvfio-user" 682f731c63SGangCao echo " --without-vfio-user No path required." 69ebf077cbSyidong0635 echo " --with-pmdk[=DIR] Build persistent memory bdev. 70ebf077cbSyidong0635 example: /usr/share/pmdk" 71ebf077cbSyidong0635 echo " --without-pmdk No path required." 722bc71094SMichal Berger echo " --with-reduce Build vbdev compression module." 732bc71094SMichal Berger echo " --without-reduce No path required." 742bc71094SMichal Berger echo " --with-rbd Build Ceph RBD bdev module." 752bc71094SMichal Berger echo " --without-rbd No path required." 762bc71094SMichal Berger echo " --with-rdma[=DIR] Build RDMA transport for NVMf target and initiator." 772bc71094SMichal Berger echo " --without-rdma Accepts optional RDMA provider name. Can be \"verbs\" or \"mlx5_dv\"." 78daee62a0SAlexey Marchuk echo " If no provider specified, \"verbs\" provider is used by default." 792bc71094SMichal Berger echo " --with-fc[=DIR] Build FC transport for NVMf target." 802bc71094SMichal Berger echo " --without-fc If an argument is provided, it is considered a directory containing" 81ed56a3d4SAnil Veerabhadrappa echo " libufc.a and fc_lld.h. Otherwise the regular system paths will" 82ed56a3d4SAnil Veerabhadrappa echo " be searched." 83044bb175SDenis Barakthanov echo " --with-daos[=DIR] Build DAOS bdev module." 842e283fcbS0xe0f echo " --without-daos No path required." 852bc71094SMichal Berger echo " --with-shared Build spdk shared libraries." 862bc71094SMichal Berger echo " --without-shared No path required." 872bc71094SMichal Berger echo " --with-iscsi-initiator Build with iscsi bdev module." 882bc71094SMichal Berger echo " --without-iscsi-initiator No path required." 892bc71094SMichal Berger echo " --with-vtune=DIR Required to profile I/O under Intel VTune Amplifier XE." 902bc71094SMichal Berger echo " --without-vtune example: /opt/intel/vtune_amplifier_xe_version" 912bc71094SMichal Berger echo " --with-ocf[=DIR] Build OCF library and bdev module." 922bc71094SMichal Berger echo " --without-ocf If argument is directory, interpret it as root of OCF repo" 93d1fee489SVitaliy Mysak echo " If argument is file, interpret it as compiled OCF lib" 9498d60de6SPiotr Pelplinski echo " If no argument is specified, OCF git submodule is used by default" 95d1fee489SVitaliy Mysak echo " example: /usr/src/ocf/" 962bc71094SMichal Berger echo " --with-uring[=DIR] Build I/O uring bdev or socket module." 972bc71094SMichal Berger echo " --without-uring If an argument is provided, it is considered a directory containing" 98161c88a0SDarek Stojaczyk echo " liburing.a and io_uring.h. Otherwise the regular system paths will" 99161c88a0SDarek Stojaczyk echo " be searched." 100958d196cSIndraneel M echo " --without-uring-zns Build I/O uring module without ZNS (zoned namespaces) support." 10134192459SBoris Glimcher echo " --with-openssl[=DIR] Build OPENSSL with custom path. Otherwise the regular system paths will" 10234192459SBoris Glimcher echo " be searched." 1032bc71094SMichal Berger echo " --with-fuse Build FUSE components for mounting a blobfs filesystem." 1042bc71094SMichal Berger echo " --without-fuse No path required." 1052bc71094SMichal Berger echo " --with-nvme-cuse Build NVMe driver with support for CUSE-based character devices." 1062bc71094SMichal Berger echo " --without-nvme-cuse No path required." 10783a4b155SArtur Paszkiewicz echo " --with-raid5f Build with bdev_raid module RAID5f support." 10883a4b155SArtur Paszkiewicz echo " --without-raid5f No path required." 1092bc71094SMichal Berger echo " --with-wpdk=DIR Build using WPDK to provide support for Windows (experimental)." 1102bc71094SMichal Berger echo " --without-wpdk The argument must be a directory containing lib and include." 1112bc71094SMichal Berger echo " --with-usdt Build with userspace DTrace probes enabled." 1122bc71094SMichal Berger echo " --without-usdt No path required." 113050565e5SJim Harris echo " --with-fuzzer Build with LLVM fuzzing enabled." 114050565e5SJim Harris echo " Path to clang_rt.fuzzer_no_main library required." 115050565e5SJim Harris echo " Requires setting CC and CXX to clang." 116050565e5SJim Harris echo " (Typically /usr/lib/llvm-VER/lib/clang/VER/lib/linux/libclang_rt.fuzzer_no_main-ARCH.a)" 117509241ceSKonrad Sztyber echo " --with-sma Generate Storage Management Agent's protobuf interface" 118509241ceSKonrad Sztyber echo " --without-sma No path required." 1199dd998cdSBen Walker echo "" 12008ec96ebSDaniel Verkamp echo "Environment variables:" 12108ec96ebSDaniel Verkamp echo "" 12273439e6fSBen Walker echo "CC C compiler" 12308ec96ebSDaniel Verkamp echo "CFLAGS C compiler flags" 12473439e6fSBen Walker echo "CXX C++ compiler" 12508ec96ebSDaniel Verkamp echo "CXXFLAGS C++ compiler flags" 12673439e6fSBen Walker echo "LD Linker" 12708ec96ebSDaniel Verkamp echo "LDFLAGS Linker flags" 12808ec96ebSDaniel Verkamp echo "DESTDIR Destination for 'make install'" 12908ec96ebSDaniel Verkamp echo "" 1309dd998cdSBen Walker} 1319dd998cdSBen Walker 132577df16aSPawel Wodkowski# Load default values 133ff238359SJosh Soref# Convert config to sourceable configuration file 134e62a3c65SSeth Howellsed -r 's/CONFIG_([[:alnum:]_]+)=(.*)/CONFIG[\1]=\2/g' $rootdir/CONFIG > $rootdir/CONFIG.sh 135577df16aSPawel Wodkowskideclare -A CONFIG 136e62a3c65SSeth Howellsource $rootdir/CONFIG.sh 137e62a3c65SSeth Howellrm $rootdir/CONFIG.sh 138577df16aSPawel Wodkowski 13911a5716dSMichal Berger# Try to expand literal ~ that might have been passed as an option via --long-opt=~/dir. 14011a5716dSMichal Bergerset -- "${@//\~/~}" 14111a5716dSMichal Berger 1424d2e26d8STomasz Zawadzkifor i in "$@"; do 1434d2e26d8STomasz Zawadzki case "$i" in 1444d2e26d8STomasz Zawadzki --cross-prefix=*) 1454d2e26d8STomasz Zawadzki CONFIG[CROSS_PREFIX]="${i#*=}" 1464d2e26d8STomasz Zawadzki ;; 1474d2e26d8STomasz Zawadzki --enable-lto) 1484d2e26d8STomasz Zawadzki CONFIG[LTO]=y 1494d2e26d8STomasz Zawadzki ;; 1504d2e26d8STomasz Zawadzki --disable-lto) 1514d2e26d8STomasz Zawadzki CONFIG[LTO]=n 1524d2e26d8STomasz Zawadzki ;; 1534d2e26d8STomasz Zawadzki esac 1544d2e26d8STomasz Zawadzkidone 1554d2e26d8STomasz Zawadzki 156873c8748STomasz Kulasek# Detect the compiler toolchain 157873c8748STomasz Kulasek$rootdir/scripts/detect_cc.sh --cc="$CC" --cxx="$CXX" --lto="${CONFIG[LTO]}" --ld="$LD" --cross-prefix="${CONFIG[CROSS_PREFIX]}" > $rootdir/mk/cc.mk 158873c8748STomasz Kulasek 159bb0f78a2SMichal BergerCC=$(grep "DEFAULT_CC=" "$rootdir/mk/cc.mk" | sed s/DEFAULT_CC=//) 160bb0f78a2SMichal BergerCC_TYPE=$(grep "CC_TYPE=" "$rootdir/mk/cc.mk" | cut -d "=" -f 2) 161873c8748STomasz Kulasek 162873c8748STomasz Kulasekarch=$($CC -dumpmachine) 1635a764955SMichal Bergersys_name=$(uname -s) 164873c8748STomasz Kulasek 1659854c138SNick Connollyif [[ $arch == *mingw* ]] || [[ $arch == *windows* ]]; then 1669854c138SNick Connolly sys_name=Windows 1679854c138SNick Connollyfi 1689854c138SNick Connolly 1692a0c2a2dSNick Connollyif [[ $sys_name != "Linux" ]]; then 170873c8748STomasz Kulasek # Vhost, rte_vhost library and virtio are only supported on Linux. 171873c8748STomasz Kulasek CONFIG[VHOST]="n" 172873c8748STomasz Kulasek CONFIG[VIRTIO]="n" 173873c8748STomasz Kulasek echo "Notice: Vhost, rte_vhost library and virtio are only supported on Linux. Turning off default feature." 174873c8748STomasz Kulasekfi 175873c8748STomasz Kulasek 1761723a800SGangCaofunction check_dir() { 1771723a800SGangCao arg="$1" 1781723a800SGangCao dir="${arg#*=}" 1791723a800SGangCao if [ ! -d "$dir" ]; then 1801723a800SGangCao echo "$arg: directory not found" 1811723a800SGangCao exit 1 1821723a800SGangCao fi 1831723a800SGangCao} 1841723a800SGangCao 1857b04eb72SYuriy Umanets# On x86_64 'clang -dumpmachine' produces x86_64-pc-linux-gnu 1867b04eb72SYuriy Umanets# whereas the dpdk might be built with gcc and its libs lie in 1877b04eb72SYuriy Umanets# x86_64-linux-gnu. Let's find the right libdir for dpdkd libs. 1887b04eb72SYuriy Umanetsfunction find_dpdk_arch_libdir() { 1897b04eb72SYuriy Umanets local dpdk_dir=$1 1907b04eb72SYuriy Umanets 1917b04eb72SYuriy Umanets # Checking first what we have with $arch, then clang 1927b04eb72SYuriy Umanets # variant of arch. 1937b04eb72SYuriy Umanets arches=("$arch" "$(echo $arch | sed 's/-pc//g')") 1947b04eb72SYuriy Umanets for a in "${arches[@]}"; do 1957b04eb72SYuriy Umanets local libdir="$dpdk_dir/lib/$a" 1967b04eb72SYuriy Umanets if [[ -d $libdir ]]; then 1977b04eb72SYuriy Umanets echo $libdir 1987b04eb72SYuriy Umanets return 1997b04eb72SYuriy Umanets fi 2007b04eb72SYuriy Umanets done 2017b04eb72SYuriy Umanets 2027b04eb72SYuriy Umanets # Fallback to the libdir without arch component 2037b04eb72SYuriy Umanets echo "$dpdk_dir/lib" 2047b04eb72SYuriy Umanets} 2057b04eb72SYuriy Umanets 206f1980244SYuriy Umanetsfunction check_IPSec_mb() { 207f1980244SYuriy Umanets local mode=$1 208f1980244SYuriy Umanets local dpdk_libdir=$2 209f1980244SYuriy Umanets local dpdk_incdir=$3 210f1980244SYuriy Umanets local have_ipsec_mb=n 211f1980244SYuriy Umanets 212f1980244SYuriy Umanets if [[ $mode = "pkg-config" ]]; then 213f1980244SYuriy Umanets local dpdk_libs 214f1980244SYuriy Umanets 215f1980244SYuriy Umanets # Request libdpdk pkg-config settings to figure out if the IPSec_MB is used 216f1980244SYuriy Umanets # as a dependency. 217f1980244SYuriy Umanets # Due to some reason pkg-config shows -lIPSec_MB only with --static option 218f13ec525SKarol Latecki dpdk_libs=$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --libs --static libdpdk) 219f1980244SYuriy Umanets if echo "$dpdk_libs" | grep "\-lIPSec_MB" > /dev/null 2>&1; then 220f1980244SYuriy Umanets have_ipsec_mb=y 221f1980244SYuriy Umanets fi 222f1980244SYuriy Umanets elif [[ $mode = "build-config" ]]; then 223f1980244SYuriy Umanets # Use dpdk build config header to check if the IPSec_MB was used. 224f1980244SYuriy Umanets if grep -F "define RTE_CRYPTO_IPSEC_MB 1" "$dpdk_incdir/rte_build_config.h" > /dev/null 2>&1; then 225f1980244SYuriy Umanets have_ipsec_mb=y 226f1980244SYuriy Umanets fi 227f1980244SYuriy Umanets else 228f1980244SYuriy Umanets echo "ERROR: Invalid IPSec_MB checking mode $mode." 229f1980244SYuriy Umanets echo "ERROR: Only \"pkg-config\" and \"build-config\" available." 230f1980244SYuriy Umanets exit 1 231f1980244SYuriy Umanets fi 232f1980244SYuriy Umanets if [[ $have_ipsec_mb = "n" ]]; then 233f1980244SYuriy Umanets CONFIG[IPSEC_MB]=n 234f1980244SYuriy Umanets return 235f1980244SYuriy Umanets fi 236f1980244SYuriy Umanets 237f1980244SYuriy Umanets # Since we don't know the library path where the IPSec_MB is located 238f1980244SYuriy Umanets # let's find it out with the ldd utility. This can be a standard location 239f1980244SYuriy Umanets # or a custom build. 240f1980244SYuriy Umanets local librte_crypto_ipsec_mb="$dpdk_libdir/librte_crypto_ipsec_mb.so" 241f1980244SYuriy Umanets if [[ -f "$librte_crypto_ipsec_mb" ]]; then 242f1980244SYuriy Umanets local ipsec_mb_libdir 243f1980244SYuriy Umanets 244f1980244SYuriy Umanets ipsec_mb_libdir=$(ldd "$librte_crypto_ipsec_mb" | grep "libIPSec_MB.so" \ 245f1980244SYuriy Umanets | sed -e 's/\s*libIPSec_MB.so.*=>\s//' -e 's/\/libIPSec_MB.so.*$//') 246f1980244SYuriy Umanets if [[ -d $ipsec_mb_libdir ]]; then 247f1980244SYuriy Umanets CONFIG[IPSEC_MB]=y 248f1980244SYuriy Umanets CONFIG[IPSEC_MB_DIR]="$ipsec_mb_libdir" 249f1980244SYuriy Umanets elif [[ $ipsec_mb_libdir = "not found" ]]; then 250f1980244SYuriy Umanets # ldconfig cache is broken, old build with refs to non-existing libs, etc. 251f1980244SYuriy Umanets echo "ERROR: Invalid IPSec_MB installation. Library is not found and/or ldconfig cache is broken!" 252f1980244SYuriy Umanets exit 1 253f1980244SYuriy Umanets else 254f1980244SYuriy Umanets # Failed to check for IPSec_MB lib path. Let's just assume it is lives 255f1980244SYuriy Umanets # in one of the standard locations (/usr/lib, etc.). 256f1980244SYuriy Umanets CONFIG[IPSEC_MB]=y 257f1980244SYuriy Umanets fi 258f1980244SYuriy Umanets else 259f1980244SYuriy Umanets # pkg-config says there is IPSec_mb and dpdk lib does not have it. Let's just 260f1980244SYuriy Umanets # assume it is installed in the system in one of the standard locations. 261f1980244SYuriy Umanets CONFIG[IPSEC_MB]=y 262f1980244SYuriy Umanets fi 263f1980244SYuriy Umanets} 264f1980244SYuriy Umanets 2659dd998cdSBen Walkerfor i in "$@"; do 2669dd998cdSBen Walker case "$i" in 2679dd998cdSBen Walker -h | --help) 2689dd998cdSBen Walker usage 2699dd998cdSBen Walker exit 0 2709dd998cdSBen Walker ;; 2714d2e26d8STomasz Zawadzki --cross-prefix=*) ;& 2724d2e26d8STomasz Zawadzki --enable-lto) ;& 2734d2e26d8STomasz Zawadzki --disable-lto) 2744d2e26d8STomasz Zawadzki # Options handled before detecting CC. 2754d2e26d8STomasz Zawadzki ;; 2762e7fe8e8SDaniel Verkamp --prefix=*) 277577df16aSPawel Wodkowski CONFIG[PREFIX]="${i#*=}" 2782e7fe8e8SDaniel Verkamp ;; 2790e6ddfd6SBen Walker --target-arch=*) 2800e6ddfd6SBen Walker CONFIG[ARCH]="${i#*=}" 2810e6ddfd6SBen Walker ;; 282e8863cb7SMichal Berger --libdir=*) 283e8863cb7SMichal Berger CONFIG[LIBDIR]="${i#*=}" 284e8863cb7SMichal Berger ;; 2859dd998cdSBen Walker --enable-debug) 286577df16aSPawel Wodkowski CONFIG[DEBUG]=y 2879dd998cdSBen Walker ;; 2889dd998cdSBen Walker --disable-debug) 289577df16aSPawel Wodkowski CONFIG[DEBUG]=n 2909dd998cdSBen Walker ;; 2919dd998cdSBen Walker --enable-asan) 292577df16aSPawel Wodkowski CONFIG[ASAN]=y 2939dd998cdSBen Walker ;; 2949dd998cdSBen Walker --disable-asan) 295577df16aSPawel Wodkowski CONFIG[ASAN]=n 2969dd998cdSBen Walker ;; 2979dd998cdSBen Walker --enable-ubsan) 298577df16aSPawel Wodkowski CONFIG[UBSAN]=y 2999dd998cdSBen Walker ;; 3009dd998cdSBen Walker --disable-ubsan) 301577df16aSPawel Wodkowski CONFIG[UBSAN]=n 3029dd998cdSBen Walker ;; 303830912e2SBen Walker --enable-tsan) 304577df16aSPawel Wodkowski CONFIG[TSAN]=y 305830912e2SBen Walker ;; 306830912e2SBen Walker --disable-tsan) 307577df16aSPawel Wodkowski CONFIG[TSAN]=n 308830912e2SBen Walker ;; 3099dd998cdSBen Walker --enable-coverage) 310577df16aSPawel Wodkowski CONFIG[COVERAGE]=y 3119dd998cdSBen Walker ;; 3129dd998cdSBen Walker --disable-coverage) 313577df16aSPawel Wodkowski CONFIG[COVERAGE]=n 3149dd998cdSBen Walker ;; 315995d60f4SBen Walker --enable-pgo-capture) 316995d60f4SBen Walker CONFIG[PGO_CAPTURE]=y 317995d60f4SBen Walker ;; 318995d60f4SBen Walker --disable-pgo-capture) 319995d60f4SBen Walker CONFIG[PGO_CAPTURE]=n 320995d60f4SBen Walker ;; 321995d60f4SBen Walker --enable-pgo-use) 322995d60f4SBen Walker CONFIG[PGO_USE]=y 323995d60f4SBen Walker ;; 324995d60f4SBen Walker --disable-pgo-use) 325995d60f4SBen Walker CONFIG[PGO_USE]=n 326995d60f4SBen Walker ;; 3279022a59eSDaniel Verkamp --enable-tests) 328577df16aSPawel Wodkowski CONFIG[TESTS]=y 3299022a59eSDaniel Verkamp ;; 3309022a59eSDaniel Verkamp --disable-tests) 331577df16aSPawel Wodkowski CONFIG[TESTS]=n 3329022a59eSDaniel Verkamp ;; 3339fcb1cb0STomasz Zawadzki --enable-unit-tests) 3349fcb1cb0STomasz Zawadzki CONFIG[UNIT_TESTS]=y 3359fcb1cb0STomasz Zawadzki ;; 3369fcb1cb0STomasz Zawadzki --disable-unit-tests) 3379fcb1cb0STomasz Zawadzki CONFIG[UNIT_TESTS]=n 3389fcb1cb0STomasz Zawadzki ;; 3399b2c6452SJacek Kalwas --enable-examples) 3409b2c6452SJacek Kalwas CONFIG[EXAMPLES]=y 3419b2c6452SJacek Kalwas ;; 3429b2c6452SJacek Kalwas --disable-examples) 3439b2c6452SJacek Kalwas CONFIG[EXAMPLES]=n 3449b2c6452SJacek Kalwas ;; 345119158cdSRajarshi Chowdhury --enable-apps) 346119158cdSRajarshi Chowdhury CONFIG[APPS]=y 347119158cdSRajarshi Chowdhury ;; 348119158cdSRajarshi Chowdhury --disable-apps) 349119158cdSRajarshi Chowdhury CONFIG[APPS]=N 350119158cdSRajarshi Chowdhury ;; 3519dd998cdSBen Walker --enable-werror) 352577df16aSPawel Wodkowski CONFIG[WERROR]=y 3539dd998cdSBen Walker ;; 3549dd998cdSBen Walker --disable-werror) 355577df16aSPawel Wodkowski CONFIG[WERROR]=n 3569dd998cdSBen Walker ;; 35791e42257SJim Harris --enable-cet) 35891e42257SJim Harris CONFIG[CET]=y 35991e42257SJim Harris ;; 36091e42257SJim Harris --disable-cet) 36191e42257SJim Harris CONFIG[CET]=n 36291e42257SJim Harris ;; 3637232c450SMichal Berger --with-dpdk) 3647b04eb72SYuriy Umanets # Can we use pkg-config? 3657b04eb72SYuriy Umanets if command -v "pkg-config" > /dev/null 2>&1 && pkg-config --exists libdpdk; then 3667b04eb72SYuriy Umanets dpdk_libdir=$(pkg-config --variable=libdir libdpdk) 3677b04eb72SYuriy Umanets dpdk_libdir=$(readlink -f $dpdk_libdir) 3687b04eb72SYuriy Umanets dpdk_incdir=$(pkg-config --variable=includedir libdpdk) 3697b04eb72SYuriy Umanets echo "Using DPDK lib dir $dpdk_libdir" 3707b04eb72SYuriy Umanets CONFIG[DPDK_LIB_DIR]=$dpdk_libdir 3717b04eb72SYuriy Umanets CONFIG[DPDK_INC_DIR]=$dpdk_incdir 3727232c450SMichal Berger CONFIG[DPDK_PKG_CONFIG]=y 3733e3fbf91SYuriy Umanets if pkg-config --print-requires libdpdk | grep "libbsd" > /dev/null 2>&1; then 3743e3fbf91SYuriy Umanets CONFIG[HAVE_LIBBSD]=y 3753e3fbf91SYuriy Umanets fi 3767232c450SMichal Berger CFLAGS="${CFLAGS:+$CFLAGS }$(pkg-config --cflags libdpdk)" 377f1980244SYuriy Umanets check_IPSec_mb "pkg-config" "$dpdk_libdir" "$dpdk_incdir" 3787232c450SMichal Berger else 3797232c450SMichal Berger echo "libdpdk.pc not found, aborting" 3807232c450SMichal Berger exit 1 3817232c450SMichal Berger fi 3827232c450SMichal Berger ;; 38306cc8045SBen Walker --with-dpdk=*) 38406cc8045SBen Walker check_dir "$i" 3857b04eb72SYuriy Umanets dpdk_dir=$(readlink -f ${i#*=}) 3867b04eb72SYuriy Umanets dpdk_libdir=$(find_dpdk_arch_libdir $dpdk_dir) 3877b04eb72SYuriy Umanets dpdk_incdir="$dpdk_dir/include" 3887b04eb72SYuriy Umanets 3897b04eb72SYuriy Umanets # Can we use pkg-config? 390f13ec525SKarol Latecki if command -v "pkg-config" > /dev/null 2>&1 && PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --exists libdpdk; then 3917b04eb72SYuriy Umanets echo "Using $dpdk_libdir/pkgconfig for additional libs..." 3921e6db5fbSTomasz Zawadzki sysroot_dir=$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --variable=pc_sysrootdir libdpdk) 393e9438453SJacek Kalwas dpdk_libdir=$(PKG_CONFIG_SYSROOT_DIR='' PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --variable=libdir libdpdk) 3941e6db5fbSTomasz Zawadzki dpdk_libdir=$(readlink -f "${sysroot_dir}$dpdk_libdir") 3957b04eb72SYuriy Umanets if ! echo $dpdk_libdir | grep $dpdk_dir > /dev/null 2>&1; then 3967b04eb72SYuriy Umanets echo "ERROR: pkg-config reported DPDK libdir $dpdk_libdir is out of the directory specified with --with-dpdk=" 3977b04eb72SYuriy Umanets echo "ERROR: do you have another DPDK installed in the system?" 3987b04eb72SYuriy Umanets exit 1 3997b04eb72SYuriy Umanets fi 400f13ec525SKarol Latecki dpdk_reqs=$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --print-requires libdpdk) 4013e3fbf91SYuriy Umanets if echo $dpdk_reqs | grep "libbsd" > /dev/null 2>&1; then 4023e3fbf91SYuriy Umanets CONFIG[HAVE_LIBBSD]=y 4033e3fbf91SYuriy Umanets fi 404f13ec525SKarol Latecki CFLAGS="${CFLAGS:+$CFLAGS }$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --cflags libdpdk)" 4051e6db5fbSTomasz Zawadzki dpdk_incdir="${sysroot_dir}$(PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dpdk_libdir/pkgconfig" pkg-config --variable=includedir libdpdk)" 406f1980244SYuriy Umanets check_IPSec_mb "pkg-config" "$dpdk_libdir" "$dpdk_incdir" 4073e3fbf91SYuriy Umanets else 4083e3fbf91SYuriy Umanets echo "Using $dpdk_incdir/rte_build_config.h for additional libs..." 4093e3fbf91SYuriy Umanets 4103e3fbf91SYuriy Umanets if grep -F "define RTE_USE_LIBBSD 1" $dpdk_incdir/rte_build_config.h > /dev/null 2>&1; then 4113e3fbf91SYuriy Umanets CONFIG[HAVE_LIBBSD]=y 4123e3fbf91SYuriy Umanets fi 413f1980244SYuriy Umanets check_IPSec_mb "build-config" "$dpdk_libdir" "$dpdk_incdir" 4147b04eb72SYuriy Umanets fi 4157b04eb72SYuriy Umanets echo "DPDK libraries: $dpdk_libdir" 4167b04eb72SYuriy Umanets echo "DPDK includes: $dpdk_incdir" 4177b04eb72SYuriy Umanets CONFIG[DPDK_DIR]=$dpdk_dir 4187b04eb72SYuriy Umanets CONFIG[DPDK_LIB_DIR]="$dpdk_libdir" 4197b04eb72SYuriy Umanets CONFIG[DPDK_INC_DIR]="$dpdk_incdir" 4207b04eb72SYuriy Umanets CONFIG[DPDK_PKG_CONFIG]=n 42106cc8045SBen Walker ;; 42206cc8045SBen Walker --without-dpdk) 42306cc8045SBen Walker CONFIG[DPDK_DIR]= 42406cc8045SBen Walker ;; 4259854c138SNick Connolly --with-wpdk=*) 4269854c138SNick Connolly check_dir "$i" 4279854c138SNick Connolly CONFIG[WPDK_DIR]=$(readlink -f ${i#*=}) 4289854c138SNick Connolly ;; 4292bc71094SMichal Berger --without-wpdk) 4302bc71094SMichal Berger CONFIG[WPDK_DIR]= 4312bc71094SMichal Berger ;; 4329dd998cdSBen Walker --with-env=*) 433577df16aSPawel Wodkowski CONFIG[ENV]="${i#*=}" 4349dd998cdSBen Walker ;; 4359dd998cdSBen Walker --with-rbd) 436577df16aSPawel Wodkowski CONFIG[RBD]=y 4379dd998cdSBen Walker ;; 4389dd998cdSBen Walker --without-rbd) 439577df16aSPawel Wodkowski CONFIG[RBD]=n 4409dd998cdSBen Walker ;; 441daee62a0SAlexey Marchuk --with-rdma=*) 442daee62a0SAlexey Marchuk CONFIG[RDMA]=y 443daee62a0SAlexey Marchuk CONFIG[RDMA_PROV]=${i#*=} 444daee62a0SAlexey Marchuk ;; 4459dd998cdSBen Walker --with-rdma) 446577df16aSPawel Wodkowski CONFIG[RDMA]=y 447daee62a0SAlexey Marchuk CONFIG[RDMA_PROV]="verbs" 4489dd998cdSBen Walker ;; 4499dd998cdSBen Walker --without-rdma) 450577df16aSPawel Wodkowski CONFIG[RDMA]=n 4519dd998cdSBen Walker ;; 452ed56a3d4SAnil Veerabhadrappa --with-fc=*) 453ed56a3d4SAnil Veerabhadrappa CONFIG[FC]=y 454ed56a3d4SAnil Veerabhadrappa CONFIG[FC_PATH]=$(readlink -f ${i#*=}) 455ed56a3d4SAnil Veerabhadrappa ;; 456ed56a3d4SAnil Veerabhadrappa --with-fc) 457ed56a3d4SAnil Veerabhadrappa CONFIG[FC]=y 458ed56a3d4SAnil Veerabhadrappa CONFIG[FC_PATH]= 459ed56a3d4SAnil Veerabhadrappa ;; 460ed56a3d4SAnil Veerabhadrappa --without-fc) 461ed56a3d4SAnil Veerabhadrappa CONFIG[FC]=n 462ed56a3d4SAnil Veerabhadrappa CONFIG[FC_PATH]= 463ed56a3d4SAnil Veerabhadrappa ;; 4642e283fcbS0xe0f --with-daos) 4652e283fcbS0xe0f CONFIG[DAOS]=y 466044bb175SDenis Barakthanov CONFIG[DAOS_DIR]="" 467044bb175SDenis Barakthanov ;; 468044bb175SDenis Barakthanov --with-daos=*) 469044bb175SDenis Barakthanov CONFIG[DAOS]=y 470044bb175SDenis Barakthanov check_dir "$i" 471044bb175SDenis Barakthanov CONFIG[DAOS_DIR]=$(readlink -f ${i#*=}) 4722e283fcbS0xe0f ;; 4732e283fcbS0xe0f --without-daos) 4742e283fcbS0xe0f CONFIG[DAOS]=n 4752e283fcbS0xe0f ;; 4760923734cSLance Hartmann --with-shared) 477577df16aSPawel Wodkowski CONFIG[SHARED]=y 4780923734cSLance Hartmann ;; 4790923734cSLance Hartmann --without-shared) 480577df16aSPawel Wodkowski CONFIG[SHARED]=n 4810923734cSLance Hartmann ;; 4822af15344SJim Harris --with-iscsi-initiator) 483577df16aSPawel Wodkowski CONFIG[ISCSI_INITIATOR]=y 4842af15344SJim Harris ;; 4852af15344SJim Harris --without-iscsi-initiator) 486577df16aSPawel Wodkowski CONFIG[ISCSI_INITIATOR]=n 4872af15344SJim Harris ;; 4886118b853SDaniel Verkamp --with-crypto) 489577df16aSPawel Wodkowski CONFIG[CRYPTO]=y 4906118b853SDaniel Verkamp ;; 4916118b853SDaniel Verkamp --without-crypto) 492577df16aSPawel Wodkowski CONFIG[CRYPTO]=n 4936118b853SDaniel Verkamp ;; 49435260f2bSDaniel Verkamp --with-vhost) 495577df16aSPawel Wodkowski CONFIG[VHOST]=y 49635260f2bSDaniel Verkamp ;; 49735260f2bSDaniel Verkamp --without-vhost) 498577df16aSPawel Wodkowski CONFIG[VHOST]=n 49935260f2bSDaniel Verkamp ;; 5007dee96ceSDariusz Stojaczyk --with-virtio) 501577df16aSPawel Wodkowski CONFIG[VIRTIO]=y 5027dee96ceSDariusz Stojaczyk ;; 5037dee96ceSDariusz Stojaczyk --without-virtio) 504577df16aSPawel Wodkowski CONFIG[VIRTIO]=n 5057dee96ceSDariusz Stojaczyk ;; 506b30d57cdSChangpeng Liu --with-vfio-user) 507b30d57cdSChangpeng Liu CONFIG[VFIO_USER]=y 508d0b2448bSChangpeng Liu CONFIG[VFIO_USER_DIR]="" 509d0b2448bSChangpeng Liu ;; 510d0b2448bSChangpeng Liu --with-vfio-user=*) 511d0b2448bSChangpeng Liu CONFIG[VFIO_USER]=y 512d0b2448bSChangpeng Liu check_dir "$i" 513d0b2448bSChangpeng Liu CONFIG[VFIO_USER_DIR]=$(readlink -f ${i#*=}) 514b30d57cdSChangpeng Liu ;; 515b30d57cdSChangpeng Liu --without-vfio-user) 516b30d57cdSChangpeng Liu CONFIG[VFIO_USER]=n 517b30d57cdSChangpeng Liu ;; 518218dcd84SJim Harris --with-pmdk) 519577df16aSPawel Wodkowski CONFIG[PMDK]=y 520577df16aSPawel Wodkowski CONFIG[PMDK_DIR]="" 521fca11f15SPiotr Pelplinski ;; 522218dcd84SJim Harris --with-pmdk=*) 523577df16aSPawel Wodkowski CONFIG[PMDK]=y 5241723a800SGangCao check_dir "$i" 525577df16aSPawel Wodkowski CONFIG[PMDK_DIR]=$(readlink -f ${i#*=}) 526fca11f15SPiotr Pelplinski ;; 527218dcd84SJim Harris --without-pmdk) 528577df16aSPawel Wodkowski CONFIG[PMDK]=n 529fca11f15SPiotr Pelplinski ;; 53097022803SJim Harris --with-reduce) 53197022803SJim Harris CONFIG[REDUCE]=y 53297022803SJim Harris ;; 53397022803SJim Harris --without-reduce) 53497022803SJim Harris CONFIG[REDUCE]=n 53597022803SJim Harris ;; 5366f338d4bSKrishna Kanth Reddy --with-xnvme) 5376f338d4bSKrishna Kanth Reddy CONFIG[XNVME]=y 5386f338d4bSKrishna Kanth Reddy ;; 5396f338d4bSKrishna Kanth Reddy --without-xnvme) 5406f338d4bSKrishna Kanth Reddy CONFIG[XNVME]=n 5416f338d4bSKrishna Kanth Reddy ;; 542c3329b52SMichal Berger --with-fio) ;& 5439dd998cdSBen Walker --with-fio=*) 544c3329b52SMichal Berger if [[ ${i#*=} != "$i" ]]; then 54511a5716dSMichal Berger CONFIG[FIO_SOURCE_DIR]=${i#*=} 546c3329b52SMichal Berger fi 547c3329b52SMichal Berger check_dir "--with-fio=${CONFIG[FIO_SOURCE_DIR]}" 54811a5716dSMichal Berger CONFIG[FIO_SOURCE_DIR]=$(readlink -f "${CONFIG[FIO_SOURCE_DIR]}") 549577df16aSPawel Wodkowski CONFIG[FIO_PLUGIN]=y 5509dd998cdSBen Walker ;; 5519dd998cdSBen Walker --without-fio) 552577df16aSPawel Wodkowski CONFIG[FIO_PLUGIN]=n 5539dd998cdSBen Walker ;; 5545712088aSRoman Sudarikov --with-vtune=*) 5551723a800SGangCao check_dir "$i" 556577df16aSPawel Wodkowski CONFIG[VTUNE_DIR]="${i#*=}" 557577df16aSPawel Wodkowski CONFIG[VTUNE]=y 5585712088aSRoman Sudarikov ;; 5595712088aSRoman Sudarikov --without-vtune) 560577df16aSPawel Wodkowski CONFIG[VTUNE_DIR]= 561577df16aSPawel Wodkowski CONFIG[VTUNE]=n 5625712088aSRoman Sudarikov ;; 56398d60de6SPiotr Pelplinski --with-ocf) 56498d60de6SPiotr Pelplinski CONFIG[OCF]=y 56598d60de6SPiotr Pelplinski CONFIG[OCF_PATH]=$(readlink -f "./ocf") 56698d60de6SPiotr Pelplinski ;; 567d1fee489SVitaliy Mysak --with-ocf=*) 568d1fee489SVitaliy Mysak CONFIG[OCF]=y 569d1fee489SVitaliy Mysak CONFIG[OCF_PATH]=$(readlink -f ${i#*=}) 570d1fee489SVitaliy Mysak ;; 571d1fee489SVitaliy Mysak --without-ocf) 572d1fee489SVitaliy Mysak CONFIG[OCF]=n 573d1fee489SVitaliy Mysak CONFIG[OCF_PATH]= 574d1fee489SVitaliy Mysak ;; 5758165bf71SBen Walker --with-uring=*) 5768165bf71SBen Walker CONFIG[URING]=y 5778165bf71SBen Walker CONFIG[URING_PATH]=$(readlink -f ${i#*=}) 5788165bf71SBen Walker ;; 5798165bf71SBen Walker --with-uring) 5808165bf71SBen Walker CONFIG[URING]=y 581958d196cSIndraneel M CONFIG[URING_ZNS]=y 5828165bf71SBen Walker CONFIG[URING_PATH]= 5838165bf71SBen Walker ;; 5848165bf71SBen Walker --without-uring) 5858165bf71SBen Walker CONFIG[URING]=n 5868165bf71SBen Walker CONFIG[URING_PATH]= 5878165bf71SBen Walker ;; 588958d196cSIndraneel M --without-uring-zns) 589958d196cSIndraneel M CONFIG[URING_ZNS]=n 5908b840195SIndraneel M ;; 59134192459SBoris Glimcher --with-openssl=*) 59234192459SBoris Glimcher check_dir "$i" 59334192459SBoris Glimcher CONFIG[OPENSSL_PATH]=$(readlink -f ${i#*=}) 59434192459SBoris Glimcher ;; 5957fa15e28SXiaodong Liu --with-fuse) 5967fa15e28SXiaodong Liu CONFIG[FUSE]=y 5977fa15e28SXiaodong Liu ;; 5987fa15e28SXiaodong Liu --without-fuse) 5997fa15e28SXiaodong Liu CONFIG[FUSE]=n 6007fa15e28SXiaodong Liu ;; 601805d9942STomasz Kulasek --with-nvme-cuse) 602805d9942STomasz Kulasek CONFIG[NVME_CUSE]=y 603805d9942STomasz Kulasek ;; 604805d9942STomasz Kulasek --without-nvme-cuse) 605805d9942STomasz Kulasek CONFIG[NVME_CUSE]=n 606805d9942STomasz Kulasek ;; 60783a4b155SArtur Paszkiewicz --with-raid5f) 60883a4b155SArtur Paszkiewicz CONFIG[RAID5F]=y 60973763d40SArtur Paszkiewicz ;; 61083a4b155SArtur Paszkiewicz --without-raid5f) 61183a4b155SArtur Paszkiewicz CONFIG[RAID5F]=n 61273763d40SArtur Paszkiewicz ;; 613e58e9fbdSpaul luse --with-idxd) 614e58e9fbdSpaul luse CONFIG[IDXD]=y 6152ed914f8SZiye Yang CONFIG[IDXD_KERNEL]=n 616e58e9fbdSpaul luse ;; 617e58e9fbdSpaul luse --without-idxd) 618e58e9fbdSpaul luse CONFIG[IDXD]=n 619e58e9fbdSpaul luse ;; 6205a1c74bfSJim Harris --with-usdt) 6215a1c74bfSJim Harris CONFIG[USDT]=y 6225a1c74bfSJim Harris ;; 6235a1c74bfSJim Harris --without-usdt) 6245a1c74bfSJim Harris CONFIG[USDT]=n 6255a1c74bfSJim Harris ;; 626050565e5SJim Harris --with-fuzzer) 627050565e5SJim Harris echo "Must specify fuzzer library path with --with-fuzzer" 628050565e5SJim Harris usage 629050565e5SJim Harris exit 1 630050565e5SJim Harris ;; 631050565e5SJim Harris --with-fuzzer=*) 632050565e5SJim Harris CONFIG[FUZZER]=y 633050565e5SJim Harris CONFIG[FUZZER_LIB]=$(readlink -f ${i#*=}) 634050565e5SJim Harris ;; 635050565e5SJim Harris --without-fuzzer) 636050565e5SJim Harris CONFIG[FUZZER]=n 637050565e5SJim Harris CONFIG[FUZZER_LIB]= 638050565e5SJim Harris ;; 639509241ceSKonrad Sztyber --with-sma) 640509241ceSKonrad Sztyber CONFIG[SMA]=y 641509241ceSKonrad Sztyber ;; 642509241ceSKonrad Sztyber --without-sma) 643509241ceSKonrad Sztyber CONFIG[SMA]=n 644509241ceSKonrad Sztyber ;; 6459dd998cdSBen Walker --) 6469dd998cdSBen Walker break 6479dd998cdSBen Walker ;; 6489dd998cdSBen Walker *) 6499dd998cdSBen Walker echo "Unrecognized option $i" 6509dd998cdSBen Walker usage 6519dd998cdSBen Walker exit 1 6525ccabc8fSMichal Berger ;; 6539dd998cdSBen Walker esac 6549dd998cdSBen Walkerdone 6559dd998cdSBen Walker 656131c9aadSAlexey Marchukif [[ $arch == x86_64* ]]; then 65710e1c615SFélix Piédallu BUILD_CMD=($CC -o /dev/null -x c $CPPFLAGS $CFLAGS $LDFLAGS "-march=native") 658131c9aadSAlexey Marchukelse 65910e1c615SFélix Piédallu BUILD_CMD=($CC -o /dev/null -x c $CPPFLAGS $CFLAGS $LDFLAGS) 660131c9aadSAlexey Marchukfi 6616c23a6f4SMichal BergerBUILD_CMD+=(-I/usr/local/include -L/usr/local/lib) 66273439e6fSBen Walker 663b30d57cdSChangpeng Liuif [[ "${CONFIG[VFIO_USER]}" = "y" ]]; then 664421368c0SGreg Inozemtsev if ! echo -e '#include <json-c/json.h>' \ 665421368c0SGreg Inozemtsev | "${BUILD_CMD[@]}" -E - 2> /dev/null; then 6663b673b84SChangpeng Liu echo "ERROR: --with-vfio-user requires json-c-devel" 6673b673b84SChangpeng Liu echo "Please install then re-run this script" 6683b673b84SChangpeng Liu exit 1 6693b673b84SChangpeng Liu fi 670421368c0SGreg Inozemtsev if ! echo -e '#include <cmocka.h>' \ 671421368c0SGreg Inozemtsev | "${BUILD_CMD[@]}" -E - 2> /dev/null; then 6723b673b84SChangpeng Liu echo "ERROR: --with-vfio-user requires libcmocka-devel" 6733b673b84SChangpeng Liu echo "Please install then re-run this script" 6743b673b84SChangpeng Liu exit 1 675b30d57cdSChangpeng Liu fi 676b30d57cdSChangpeng Liufi 677b30d57cdSChangpeng Liu 678e58e9fbdSpaul luse# IDXD uses Intel specific instructions. 679e58e9fbdSpaul luseif [[ "${CONFIG[IDXD]}" = "y" ]]; then 6802755fbdfSpaul luse if [ $(uname -s) == "FreeBSD" ]; then 6812755fbdfSpaul luse intel="hw.model: Intel" 6822755fbdfSpaul luse cpu_vendor=$(sysctl -a | grep hw.model | cut -c 1-15) 6832755fbdfSpaul luse else 684e58e9fbdSpaul luse intel="GenuineIntel" 685e58e9fbdSpaul luse cpu_vendor=$(grep -i 'vendor' /proc/cpuinfo --max-count=1) 6862755fbdfSpaul luse fi 687e58e9fbdSpaul luse if [[ "$cpu_vendor" != *"$intel"* ]]; then 688ff238359SJosh Soref echo "ERROR: IDXD cannot be used due to CPU incompatibility." 689e58e9fbdSpaul luse exit 1 690e58e9fbdSpaul luse fi 6912ed914f8SZiye Yang if [ -e /usr/include/accel-config/libaccel_config.h ]; then 6922ed914f8SZiye Yang CONFIG[IDXD_KERNEL]=y 6932ed914f8SZiye Yang fi 6942ed914f8SZiye Yang 695e58e9fbdSpaul lusefi 696e58e9fbdSpaul luse 697577df16aSPawel Wodkowskiif [ -z "${CONFIG[ENV]}" ]; then 698577df16aSPawel Wodkowski CONFIG[ENV]=$rootdir/lib/env_dpdk 699577df16aSPawel Wodkowski echo "Using default SPDK env in ${CONFIG[ENV]}" 7007232c450SMichal Berger if [[ -z "${CONFIG[DPDK_DIR]}" && "${CONFIG[DPDK_PKG_CONFIG]}" == n ]]; then 70138e26cf5STomasz Zawadzki if [ ! -f "$rootdir"/dpdk/config/meson.build ]; then 702d199eb29SDaniel Verkamp echo "DPDK not found; please specify --with-dpdk=<path> or run:" 703d199eb29SDaniel Verkamp echo 704d199eb29SDaniel Verkamp echo " git submodule update --init" 705d199eb29SDaniel Verkamp exit 1 706577df16aSPawel Wodkowski else 707577df16aSPawel Wodkowski CONFIG[DPDK_DIR]="${rootdir}/dpdk/build" 708f1980244SYuriy Umanets # Default ipsec libs 70919518dfbSAleksey Marchuk if [[ "${CONFIG[CRYPTO]}" = "y" ]] && [[ $arch = x86_64* ]]; then 710f1980244SYuriy Umanets CONFIG[IPSEC_MB]=y 711f1980244SYuriy Umanets CONFIG[IPSEC_MB_DIR]="${rootdir}/intel-ipsec-mb/lib" 712f1980244SYuriy Umanets fi 713577df16aSPawel Wodkowski echo "Using default DPDK in ${CONFIG[DPDK_DIR]}" 714d199eb29SDaniel Verkamp fi 7159dd998cdSBen Walker fi 7167d2a2f52SBen Walkerelse 7177232c450SMichal Berger if [[ -n "${CONFIG[DPDK_DIR]}" || "${CONFIG[DPDK_PKG_CONFIG]}" == y ]]; then 71806cc8045SBen Walker echo "--with-env and --with-dpdk are mutually exclusive." 71906cc8045SBen Walker exit 1 72006cc8045SBen Walker fi 72106cc8045SBen Walker 722577df16aSPawel Wodkowski if [ "${CONFIG[VHOST]}" = "y" ]; then 7237d2a2f52SBen Walker echo "Vhost is only supported when using the default DPDK environment. Disabling it." 7247d2a2f52SBen Walker fi 7257d2a2f52SBen Walker # Always disable vhost, but only print the error message if the user explicitly turned it on. 726577df16aSPawel Wodkowski CONFIG[VHOST]="n" 727577df16aSPawel Wodkowski if [ "${CONFIG[VIRTIO]}" = "y" ]; then 7287d2a2f52SBen Walker echo "Virtio is only supported when using the default DPDK environment. Disabling it." 7297d2a2f52SBen Walker fi 7307d2a2f52SBen Walker # Always disable virtio, but only print the error message if the user explicitly turned it on. 731577df16aSPawel Wodkowski CONFIG[VIRTIO]="n" 7329dd998cdSBen Walkerfi 7339dd998cdSBen Walker 7347232c450SMichal Bergerif [[ "${CONFIG[DPDK_PKG_CONFIG]}" == y ]]; then 7357232c450SMichal Berger if [[ "${CONFIG[SHARED]}" == n ]]; then 7367232c450SMichal Berger # dpdk-devel doesn't provide static libs 7377232c450SMichal Berger echo "Build against packaged DPDK requested, enabling shared libraries" 7387232c450SMichal Berger CONFIG[SHARED]=y 7397232c450SMichal Berger fi 7407232c450SMichal Bergerfi 7417232c450SMichal Berger 7429854c138SNick Connollyif [[ $sys_name == "Windows" ]]; then 7439854c138SNick Connolly if [ -z "${CONFIG[WPDK_DIR]}" ]; then 7449854c138SNick Connolly if [ ! -f "$rootdir"/wpdk/Makefile ]; then 7459854c138SNick Connolly echo "WPDK not found; please specify --with-wpdk=<path>. See https://wpdk.github.io." 7469854c138SNick Connolly exit 1 7479854c138SNick Connolly else 7489854c138SNick Connolly CONFIG[WPDK_DIR]="${rootdir}/wpdk/build" 7499854c138SNick Connolly echo "Using default WPDK in ${CONFIG[WPDK_DIR]}" 7509854c138SNick Connolly fi 7519854c138SNick Connolly fi 7529854c138SNick Connollyelse 7539854c138SNick Connolly if [ -n "${CONFIG[WPDK_DIR]}" ]; then 7549854c138SNick Connolly echo "ERROR: --with-wpdk is only supported for Windows" 7559854c138SNick Connolly exit 1 7569854c138SNick Connolly fi 7579854c138SNick Connollyfi 7589854c138SNick Connolly 759577df16aSPawel Wodkowskiif [ "${CONFIG[VTUNE]}" = "y" ]; then 760577df16aSPawel Wodkowski if [ -z "${CONFIG[VTUNE_DIR]}" ]; then 7615712088aSRoman Sudarikov echo "When VTune is enabled, you must specify the VTune directory using --with-vtune=path" 7625712088aSRoman Sudarikov exit 1 7635712088aSRoman Sudarikov fi 7645712088aSRoman Sudarikovfi 7655712088aSRoman Sudarikov 766bb0f78a2SMichal Bergerif [[ "${CONFIG[ASAN]}" = "y" && "${CONFIG[TSAN]}" = "y" ]]; then 767830912e2SBen Walker echo "ERROR: ASAN and TSAN cannot be enabled at the same time." 768830912e2SBen Walker exit 1 769830912e2SBen Walkerfi 770830912e2SBen Walker 771ac5b53a5SJim Harrisif [[ "${CONFIG[FIO_PLUGIN]}" = "y" && "${CONFIG[EXAMPLES]}" = "n" ]]; then 772ac5b53a5SJim Harris echo "ERROR: --with-fio and --disable-examples are mutually exclusive." 773ac5b53a5SJim Harris exit 1 774ac5b53a5SJim Harrisfi 775ac5b53a5SJim Harris 7765a764955SMichal Bergerif [[ $sys_name == "FreeBSD" ]]; then 7775091cadcSPaul Luse # FreeBSD doesn't support all configurations 778577df16aSPawel Wodkowski if [[ "${CONFIG[COVERAGE]}" == "y" ]]; then 7795091cadcSPaul Luse echo "ERROR: CONFIG_COVERAGE not available on FreeBSD" 7805091cadcSPaul Luse exit 1 7815091cadcSPaul Luse fi 7825091cadcSPaul Lusefi 7835091cadcSPaul Luse 7842a0c2a2dSNick Connollyif [[ $sys_name != "Linux" ]]; then 78527b920a2SDarek Stojaczyk if [[ "${CONFIG[VHOST]}" == "y" ]]; then 786873c8748STomasz Kulasek echo "Vhost is only supported on Linux." 787873c8748STomasz Kulasek exit 1 78827b920a2SDarek Stojaczyk fi 78927b920a2SDarek Stojaczyk if [[ "${CONFIG[VIRTIO]}" == "y" ]]; then 790873c8748STomasz Kulasek echo "Virtio is only supported on Linux." 791873c8748STomasz Kulasek exit 1 79227b920a2SDarek Stojaczyk fi 79327b920a2SDarek Stojaczykfi 79427b920a2SDarek Stojaczyk 795577df16aSPawel Wodkowskiif [ "${CONFIG[RDMA]}" = "y" ]; then 796daee62a0SAlexey Marchuk if [[ ! "${CONFIG[RDMA_PROV]}" == "verbs" ]] && [[ ! "${CONFIG[RDMA_PROV]}" == "mlx5_dv" ]]; then 797daee62a0SAlexey Marchuk echo "Invalid RDMA provider specified, must be \"verbs\" or \"mlx5_dv\"" 798daee62a0SAlexey Marchuk exit 1 799daee62a0SAlexey Marchuk fi 800daee62a0SAlexey Marchuk 801eed0c6beSDarek Stojaczyk if ! echo -e '#include <infiniband/verbs.h>\n#include <rdma/rdma_verbs.h>\n' \ 802eed0c6beSDarek Stojaczyk 'int main(void) { return 0; }\n' \ 803bb0f78a2SMichal Berger | "${BUILD_CMD[@]}" -libverbs -lrdmacm - 2> /dev/null; then 804bb0f78a2SMichal Berger echo "--with-rdma requires libverbs and librdmacm." 805bb0f78a2SMichal Berger echo "Please install then re-run this script." 806eed0c6beSDarek Stojaczyk exit 1 807eed0c6beSDarek Stojaczyk fi 808eed0c6beSDarek Stojaczyk 809eed0c6beSDarek Stojaczyk if echo -e '#include <infiniband/verbs.h>\n' \ 810eed0c6beSDarek Stojaczyk 'int main(void) { return !!IBV_WR_SEND_WITH_INV; }\n' \ 811bb0f78a2SMichal Berger | "${BUILD_CMD[@]}" -c - 2> /dev/null; then 812577df16aSPawel Wodkowski CONFIG[RDMA_SEND_WITH_INVAL]="y" 8137671073bSSeth Howell else 814577df16aSPawel Wodkowski CONFIG[RDMA_SEND_WITH_INVAL]="n" 81517a819f8SJim Harris echo " 8167671073bSSeth Howell******************************************************************************* 8177671073bSSeth HowellWARNING: The Infiniband Verbs opcode Send With Invalidate is either not 8187671073bSSeth Howellsupported or is not functional with the current version of libibverbs installed 8197671073bSSeth Howellon this system. Please upgrade to at least version 1.1. 8207671073bSSeth Howell 8217671073bSSeth HowellBeginning with Linux kernel 4.14, the kernel NVMe-oF initiator leverages Send 8227671073bSSeth HowellWith Invalidate RDMA operations to improve performance. Failing to use the 8237671073bSSeth HowellSend With Invalidate operation on the NVMe-oF target side results in full 8247671073bSSeth Howellfunctionality, but greatly reduced performance. The SPDK NVMe-oF target will 8257671073bSSeth Howellbe unable to leverage that operation using the currently installed version 8267671073bSSeth Howellof libibverbs, so Linux kernel NVMe-oF initiators based on kernels greater 8277671073bSSeth Howellthan or equal to 4.14 will see significantly reduced performance. 82817a819f8SJim Harris*******************************************************************************" 8297671073bSSeth Howell fi 83094966468SAlexey Marchuk 83194966468SAlexey Marchuk if echo -e '#include <rdma/rdma_cma.h>\n' \ 83294966468SAlexey Marchuk 'int main(void) { return !!RDMA_OPTION_ID_ACK_TIMEOUT; }\n' \ 833bb0f78a2SMichal Berger | "${BUILD_CMD[@]}" -c - 2> /dev/null; then 83494966468SAlexey Marchuk CONFIG[RDMA_SET_ACK_TIMEOUT]="y" 83594966468SAlexey Marchuk else 83694966468SAlexey Marchuk CONFIG[RDMA_SET_ACK_TIMEOUT]="n" 83794966468SAlexey Marchuk echo "RDMA_OPTION_ID_ACK_TIMEOUT is not supported" 83894966468SAlexey Marchuk fi 83994966468SAlexey Marchuk 840daee62a0SAlexey Marchuk if [ "${CONFIG[RDMA_PROV]}" == "mlx5_dv" ]; then 841daee62a0SAlexey Marchuk if ! echo -e '#include <spdk/stdinc.h>\n' \ 842daee62a0SAlexey Marchuk '#include <infiniband/mlx5dv.h>\n' \ 843daee62a0SAlexey Marchuk '#include <rdma/rdma_cma.h>\n' \ 844daee62a0SAlexey Marchuk 'int main(void) { return rdma_establish(NULL) || ' \ 845daee62a0SAlexey Marchuk '!!IBV_QP_INIT_ATTR_SEND_OPS_FLAGS || !!MLX5_OPCODE_RDMA_WRITE; }\n' \ 846bb0f78a2SMichal Berger | "${BUILD_CMD[@]}" -lmlx5 -I${rootdir}/include -c - 2> /dev/null; then 847daee62a0SAlexey Marchuk echo "mlx5_dv provider is not supported" 848daee62a0SAlexey Marchuk exit 1 849daee62a0SAlexey Marchuk fi 850daee62a0SAlexey Marchuk fi 851daee62a0SAlexey Marchuk 852bb0f78a2SMichal Berger echo "Using '${CONFIG[RDMA_PROV]}' RDMA provider" 8537671073bSSeth Howellfi 8547671073bSSeth Howell 855ed56a3d4SAnil Veerabhadrappaif [[ "${CONFIG[FC]}" = "y" ]]; then 856ed56a3d4SAnil Veerabhadrappa if [[ -n "${CONFIG[FC_PATH]}" ]]; then 857ed56a3d4SAnil Veerabhadrappa if [ ! -d "${CONFIG[FC_PATH]}" ]; then 858ed56a3d4SAnil Veerabhadrappa echo "${CONFIG[FC_PATH]}: directory not found" 859ed56a3d4SAnil Veerabhadrappa exit 1 860ed56a3d4SAnil Veerabhadrappa fi 861ed56a3d4SAnil Veerabhadrappa fi 862ed56a3d4SAnil Veerabhadrappafi 863ed56a3d4SAnil Veerabhadrappa 864ce711726SDarek Stojaczykif [[ "${CONFIG[PMDK]}" = "y" ]]; then 865ce711726SDarek Stojaczyk if ! echo -e '#include <libpmemblk.h>\nint main(void) { return 0; }\n' \ 866bb0f78a2SMichal Berger | "${BUILD_CMD[@]}" -lpmemblk - 2> /dev/null; then 867bb0f78a2SMichal Berger echo "--with-pmdk requires libpmemblk." 868bb0f78a2SMichal Berger echo "Please install then re-run this script." 869ce711726SDarek Stojaczyk exit 1 870ce711726SDarek Stojaczyk fi 871ce711726SDarek Stojaczykfi 872ce711726SDarek Stojaczyk 8732a6ddeb8SYuriy Umanetsfunction dpdk_version() { 8742a6ddeb8SYuriy Umanets # Check DPDK version to determine if mlx5_pci driver is supported 8752a6ddeb8SYuriy Umanets local dpdk_ver="none" 8762a6ddeb8SYuriy Umanets if [[ "${CONFIG[DPDK_DIR]}" == "$rootdir/dpdk/build" ]]; then 8772a6ddeb8SYuriy Umanets # DPDK_DIR points at our submodule so ./build may not exist yet. Use 8782a6ddeb8SYuriy Umanets # absolute path to lookup the version. 8792a6ddeb8SYuriy Umanets dpdk_ver=$(< "$rootdir/dpdk/VERSION") 8802a6ddeb8SYuriy Umanets elif [[ -f "${CONFIG[DPDK_DIR]}"/../VERSION ]]; then 8812a6ddeb8SYuriy Umanets dpdk_ver=$(< "${CONFIG[DPDK_DIR]}"/../VERSION) 8822a6ddeb8SYuriy Umanets fi 8832a6ddeb8SYuriy Umanets echo $dpdk_ver 8842a6ddeb8SYuriy Umanets} 8852a6ddeb8SYuriy Umanets 8862a6ddeb8SYuriy Umanetsfunction mlx5_build() { 8872a6ddeb8SYuriy Umanets # Check if libmlx5 exists to enable mlx5_pci compress/crypto PMD 8882a6ddeb8SYuriy Umanets if ! echo -e '#include <spdk/stdinc.h>\n' \ 8892a6ddeb8SYuriy Umanets '#include <infiniband/mlx5dv.h>\n' \ 8902a6ddeb8SYuriy Umanets '#include <infiniband/verbs.h>\n' \ 8912a6ddeb8SYuriy Umanets 'int main(void) { return 0; }\n' \ 8922a6ddeb8SYuriy Umanets | "${BUILD_CMD[@]}" -lmlx5 -libverbs -I${rootdir}/include -c - 2> /dev/null; then 8932a6ddeb8SYuriy Umanets return 1 8942a6ddeb8SYuriy Umanets fi 8952a6ddeb8SYuriy Umanets return 0 8962a6ddeb8SYuriy Umanets} 8972a6ddeb8SYuriy Umanets 89897022803SJim Harrisif [[ "${CONFIG[REDUCE]}" = "y" ]]; then 899c4a3b312SDarek Stojaczyk if ! echo -e '#include <libpmem.h>\nint main(void) { return 0; }\n' \ 900bb0f78a2SMichal Berger | "${BUILD_CMD[@]}" -lpmem - 2> /dev/null; then 901bb0f78a2SMichal Berger echo "--with-reduce requires libpmem." 902bb0f78a2SMichal Berger echo "Please install then re-run this script." 90397022803SJim Harris exit 1 90497022803SJim Harris fi 9052a6ddeb8SYuriy Umanets # Try to enable mlx5 compress 906e71ae467SAlexey Marchuk CONFIG[REDUCE_MLX5]="y" 9072a6ddeb8SYuriy Umanets 908e71ae467SAlexey Marchuk # Check if libmlx5 exists to enable mlx5_pci compress PMD 9092a6ddeb8SYuriy Umanets if ! mlx5_build; then 910e71ae467SAlexey Marchuk echo "libmlx5 is not found, so disabling DPDK mlx5_pci compress PMD" 911e71ae467SAlexey Marchuk CONFIG[REDUCE_MLX5]="n" 9122a6ddeb8SYuriy Umanets else 913e71ae467SAlexey Marchuk if [[ "${CONFIG[DPDK_PKG_CONFIG]}" = "y" ]]; then 914e71ae467SAlexey Marchuk # Check if librte_compress_mlx5 exists in DPDK package 915e71ae467SAlexey Marchuk if [ ! -f "${CONFIG[DPDK_LIB_DIR]}"/librte_compress_mlx5.so ]; then 916e71ae467SAlexey Marchuk echo "librte_compress_mlx5 is not found, so disabling DPDK mlx5_pci compress PMD" 917e71ae467SAlexey Marchuk CONFIG[REDUCE_MLX5]="n" 918e71ae467SAlexey Marchuk fi 919e71ae467SAlexey Marchuk else 920e71ae467SAlexey Marchuk # Check DPDK version to determine if mlx5_pci driver is supported 9212a6ddeb8SYuriy Umanets dpdk_ver=$(dpdk_version) 9222a6ddeb8SYuriy Umanets if [[ $dpdk_ver = "none" ]]; then 923c2de56b0SMichal Berger echo "Cannot get DPDK version, so disabling DPDK mlx5_pci compress PMD" 924e71ae467SAlexey Marchuk CONFIG[REDUCE_MLX5]="n" 9252a6ddeb8SYuriy Umanets elif [[ -n $dpdk_ver ]] && lt "$dpdk_ver" 21.02.0; then 9262a6ddeb8SYuriy Umanets # mlx5_pci for compress is supported by DPDK >- 21.02.0 927c2de56b0SMichal Berger echo "DPDK version ${dpdk_ver} doesn't support mlx5_pci compress PMD" 928c2de56b0SMichal Berger CONFIG[REDUCE_MLX5]="n" 9292a6ddeb8SYuriy Umanets elif [[ -n ${CONFIG[DPDK_LIB_DIR]} ]] && [ ! -f "${CONFIG[DPDK_LIB_DIR]}"/librte_compress_mlx5.so ]; then 9302a6ddeb8SYuriy Umanets # This is only checked when --with-dpdk or --with-dpdk=* is used 9312a6ddeb8SYuriy Umanets echo "librte_compress_mlx5 is not found, so disabling DPDK mlx5_pci compress PMD" 9322a6ddeb8SYuriy Umanets CONFIG[REDUCE_MLX5]="n" 9332a6ddeb8SYuriy Umanets fi 9342a6ddeb8SYuriy Umanets fi 9352a6ddeb8SYuriy Umanets fi 9362a6ddeb8SYuriy Umanetsfi 9372a6ddeb8SYuriy Umanets 9382a6ddeb8SYuriy Umanetsif [[ "${CONFIG[CRYPTO]}" = "y" ]]; then 9392a6ddeb8SYuriy Umanets # Try to enable mlx5 crypto 9402a6ddeb8SYuriy Umanets CONFIG[CRYPTO_MLX5]="y" 9412a6ddeb8SYuriy Umanets 9422a6ddeb8SYuriy Umanets # Check if libmlx5 exists to enable mlx5_pci compress PMD 9432a6ddeb8SYuriy Umanets if ! mlx5_build; then 9442a6ddeb8SYuriy Umanets echo "libmlx5 is not found, so disabling DPDK mlx5_pci crypto PMD" 9452a6ddeb8SYuriy Umanets CONFIG[CRYPTO_MLX5]="n" 9462a6ddeb8SYuriy Umanets else 9472a6ddeb8SYuriy Umanets if [[ "${CONFIG[DPDK_PKG_CONFIG]}" = "y" ]]; then 9482a6ddeb8SYuriy Umanets # Check if librte_crypto_mlx5 exists in DPDK package 9492a6ddeb8SYuriy Umanets if [ ! -f "${CONFIG[DPDK_LIB_DIR]}"/librte_crypto_mlx5.so ]; then 9502a6ddeb8SYuriy Umanets echo "librte_crypto_mlx5 is not found, so disabling DPDK mlx5_pci crypto PMD" 9512a6ddeb8SYuriy Umanets CONFIG[CRYPTO_MLX5]="n" 9522a6ddeb8SYuriy Umanets fi 9532a6ddeb8SYuriy Umanets else 9542a6ddeb8SYuriy Umanets # Check DPDK version to determine if mlx5_pci driver is supported 9552a6ddeb8SYuriy Umanets dpdk_ver=$(dpdk_version) 9562a6ddeb8SYuriy Umanets if [[ $dpdk_ver = "none" ]]; then 9572a6ddeb8SYuriy Umanets echo "Cannot get DPDK version, so disabling DPDK mlx5_pci crypto PMD" 9582a6ddeb8SYuriy Umanets CONFIG[CRYPTO_MLX5]="n" 9598a2fc789SYuriy Umanets elif [[ -n $dpdk_ver ]] && lt "$dpdk_ver" 21.11.0; then 9608a2fc789SYuriy Umanets # mlx5_pci for crypto is supported by DPDK >- 21.11.0 9612a6ddeb8SYuriy Umanets echo "DPDK version ${dpdk_ver} doesn't support mlx5_pci crypto PMD" 9622a6ddeb8SYuriy Umanets CONFIG[CRYPTO_MLX5]="n" 9632a6ddeb8SYuriy Umanets elif [[ -n ${CONFIG[DPDK_LIB_DIR]} ]] && [ ! -f "${CONFIG[DPDK_LIB_DIR]}"/librte_crypto_mlx5.so ]; then 9642a6ddeb8SYuriy Umanets # This is only checked when --with-dpdk or --with-dpdk=* is used 9652a6ddeb8SYuriy Umanets echo "librte_crypto_mlx5 is not found, so disabling DPDK mlx5_pci crypto PMD" 9662a6ddeb8SYuriy Umanets CONFIG[CRYPTO_MLX5]="n" 9672a6ddeb8SYuriy Umanets fi 968e71ae467SAlexey Marchuk fi 969e269bf4eSAlexey Marchuk fi 97097022803SJim Harrisfi 97197022803SJim Harris 972805d9942STomasz Kulasekif [[ "${CONFIG[NVME_CUSE]}" = "y" ]]; then 973805d9942STomasz 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' \ 974bb0f78a2SMichal Berger | "${BUILD_CMD[@]}" -lfuse3 -D_FILE_OFFSET_BITS=64 - 2> /dev/null; then 975bb0f78a2SMichal Berger echo "--with-cuse requires libfuse3." 976bb0f78a2SMichal Berger echo "Please install then re-run this script." 977805d9942STomasz Kulasek exit 1 978805d9942STomasz Kulasek fi 979805d9942STomasz Kulasekfi 980805d9942STomasz Kulasek 98155bd0d3aSDarek Stojaczykif [[ "${CONFIG[RBD]}" = "y" ]]; then 98255bd0d3aSDarek Stojaczyk if ! echo -e '#include <rbd/librbd.h>\n#include <rados/librados.h>\n' \ 98355bd0d3aSDarek Stojaczyk 'int main(void) { return 0; }\n' \ 984bb0f78a2SMichal Berger | "${BUILD_CMD[@]}" -lrados -lrbd - 2> /dev/null; then 985bb0f78a2SMichal Berger echo "--with-rbd requires librados and librbd." 986bb0f78a2SMichal Berger echo "Please install then re-run this script." 98755bd0d3aSDarek Stojaczyk exit 1 98855bd0d3aSDarek Stojaczyk fi 98955bd0d3aSDarek Stojaczykfi 99055bd0d3aSDarek Stojaczyk 9915cb18040SDarek Stojaczykif [[ "${CONFIG[ISCSI_INITIATOR]}" = "y" ]]; then 9925cb18040SDarek Stojaczyk # Fedora installs libiscsi to /usr/lib64/iscsi for some reason. 9935cb18040SDarek Stojaczyk if ! echo -e '#include <iscsi/iscsi.h>\n#include <iscsi/scsi-lowlevel.h>\n' \ 9945cb18040SDarek Stojaczyk '#if LIBISCSI_API_VERSION < 20150621\n' \ 9955cb18040SDarek Stojaczyk '#error\n' \ 9965cb18040SDarek Stojaczyk '#endif\n' \ 9975cb18040SDarek Stojaczyk 'int main(void) { return 0; }\n' \ 998bb0f78a2SMichal Berger | "${BUILD_CMD[@]}" -L/usr/lib64/iscsi -liscsi - 2> /dev/null; then 999bb0f78a2SMichal Berger echo "--with-iscsi-initiator requires libiscsi with" 1000bb0f78a2SMichal Berger echo "LIBISCSI_API_VERSION >= 20150621." 1001bb0f78a2SMichal Berger echo "Please install then re-run this script." 10025cb18040SDarek Stojaczyk exit 1 10035cb18040SDarek Stojaczyk fi 10045cb18040SDarek Stojaczykfi 10055cb18040SDarek Stojaczyk 10062e283fcbS0xe0fif [[ "${CONFIG[DAOS]}" = "y" ]]; then 1007044bb175SDenis Barakthanov daos_build_cmd=("${BUILD_CMD[@]}") 1008044bb175SDenis Barakthanov if [[ -n "${CONFIG[DAOS_DIR]}" ]]; then 1009044bb175SDenis Barakthanov daos_build_cmd+=(-I"${CONFIG[DAOS_DIR]}"/include -L"${CONFIG[DAOS_DIR]}"/lib64) 1010044bb175SDenis Barakthanov fi 10112e283fcbS0xe0f if ! echo -e '#include <daos.h>\n#include <daos_fs.h>\n' \ 10122e283fcbS0xe0f 'int main(void) { return 0; }\n' \ 1013044bb175SDenis Barakthanov | "${daos_build_cmd[@]}" -lgurt -ldaos -ldaos_common -ldfs - 2> /dev/null; then 10142e283fcbS0xe0f echo "--with-daos requires libdaos, libdaos_common, libdfs and libgurt" 10152e283fcbS0xe0f echo "Please install then re-run this script." 10162e283fcbS0xe0f exit 1 10172e283fcbS0xe0f fi 10182e283fcbS0xe0ffi 10192e283fcbS0xe0f 10203674c1d3SDarek Stojaczykif [[ "${CONFIG[ASAN]}" = "y" ]]; then 10213674c1d3SDarek Stojaczyk if ! echo -e 'int main(void) { return 0; }\n' \ 1022bb0f78a2SMichal Berger | "${BUILD_CMD[@]}" -fsanitize=address - 2> /dev/null; then 1023bb0f78a2SMichal Berger echo "--enable-asan requires libasan." 1024bb0f78a2SMichal Berger echo "Please install then re-run this script." 10253674c1d3SDarek Stojaczyk exit 1 10263674c1d3SDarek Stojaczyk fi 10273674c1d3SDarek Stojaczykfi 10283674c1d3SDarek Stojaczyk 10293674c1d3SDarek Stojaczykif [[ "${CONFIG[UBSAN]}" = "y" ]]; then 10303674c1d3SDarek Stojaczyk if ! echo -e 'int main(void) { return 0; }\n' \ 1031bb0f78a2SMichal Berger | "${BUILD_CMD[@]}" -fsanitize=undefined - 2> /dev/null; then 1032bb0f78a2SMichal Berger echo "--enable-ubsan requires libubsan." 1033bb0f78a2SMichal Berger echo "Please install then re-run this script." 1034bb0f78a2SMichal Berger echo "If installed, please check that the GCC version is at least 6.4" 1035bb0f78a2SMichal Berger echo "and synchronize CC accordingly." 10363674c1d3SDarek Stojaczyk exit 1 10373674c1d3SDarek Stojaczyk fi 10383674c1d3SDarek Stojaczykfi 10393674c1d3SDarek Stojaczyk 10403674c1d3SDarek Stojaczykif [[ "${CONFIG[TSAN]}" = "y" ]]; then 10413674c1d3SDarek Stojaczyk if ! echo -e 'int main(void) { return 0; }\n' \ 1042bb0f78a2SMichal Berger | "${BUILD_CMD[@]}" -fsanitize=thread - 2> /dev/null; then 1043bb0f78a2SMichal Berger echo "--enable-tsan requires libtsan." 1044bb0f78a2SMichal Berger echo "Please install then re-run this script." 10453674c1d3SDarek Stojaczyk exit 1 10463674c1d3SDarek Stojaczyk fi 10473674c1d3SDarek Stojaczykfi 10483674c1d3SDarek Stojaczyk 104943a3984cSJim Harrisif echo -e '#include <stdlib.h>\nint main(void) { arc4random(); return 0; }\n' \ 105043a3984cSJim Harris | "${BUILD_CMD[@]}" - 2> /dev/null; then 105143a3984cSJim Harris CONFIG[HAVE_ARC4RANDOM]="y" 105243a3984cSJim Harrisfi 105343a3984cSJim Harris 1054d1fee489SVitaliy Mysakif [[ "${CONFIG[OCF]}" = "y" ]]; then 1055d1fee489SVitaliy Mysak # If OCF_PATH is a file, assume it is a library and use it to compile with 1056d1fee489SVitaliy Mysak if [ -f ${CONFIG[OCF_PATH]} ]; then 1057d1fee489SVitaliy Mysak CONFIG[CUSTOMOCF]=y 1058d1fee489SVitaliy Mysak else 1059d1fee489SVitaliy Mysak CONFIG[CUSTOMOCF]=n 1060d1fee489SVitaliy Mysak fi 1061d1fee489SVitaliy Mysakfi 1062d1fee489SVitaliy Mysak 1063995d60f4SBen Walkerif [[ "${CONFIG[PGO_CAPTURE]}" = "y" && "${CONFIG[PGO_USE]}" = "y" ]]; then 1064995d60f4SBen Walker echo "ERROR: --enable-pgo-capture and --enable-pgo-use are mutually exclusive." 1065995d60f4SBen Walker exit 1 1066954728e9SBen Walkerelif [[ "${CONFIG[PGO_USE]}" = "y" ]]; then 1067954728e9SBen Walker if [[ "$CC_TYPE" = "clang" ]]; then 1068954728e9SBen Walker # For clang we need to run an extra step on gathered profiling data. 1069954728e9SBen Walker echo "Generating suitable profile data" 1070954728e9SBen Walker llvm-profdata merge -output=build/pgo/default.profdata build/pgo 1071954728e9SBen Walker fi 1072995d60f4SBen Walkerfi 1073995d60f4SBen Walker 10748165bf71SBen Walkerif [[ "${CONFIG[URING]}" = "y" ]]; then 10758165bf71SBen Walker if [[ -n "${CONFIG[URING_PATH]}" ]]; then 10768165bf71SBen Walker if [ ! -d "${CONFIG[URING_PATH]}" ]; then 10778165bf71SBen Walker echo "${CONFIG[URING_PATH]}: directory not found" 10788165bf71SBen Walker exit 1 10798165bf71SBen Walker fi 10804ccc9ea3SJim Harris elif ! echo -e '#include <liburing.h>\nint main(void) { return 0; }\n' \ 10814ccc9ea3SJim Harris | "${BUILD_CMD[@]}" -luring - 2> /dev/null; then 10824ccc9ea3SJim Harris echo "--with-uring requires liburing." 10834ccc9ea3SJim Harris echo "Please build and install then re-run this script." 10844ccc9ea3SJim Harris exit 1 10858165bf71SBen Walker fi 1086958d196cSIndraneel M # Support for Zoned devices is enabled by default for Uring bdev. Check appropriate support in kernel. 10878b840195SIndraneel M if [[ "${CONFIG[URING_ZNS]}" = "y" ]]; then 10888b840195SIndraneel M if ! echo -e '#include<linux/blkzoned.h>\nint main(void) { return BLK_ZONE_REP_CAPACITY; }\n' \ 10898b840195SIndraneel M | "${BUILD_CMD[@]}" -c - 2> /dev/null; then 1090958d196cSIndraneel M echo "Disabling Zoned NS support in Uring! Requires blkzoned.h from kernel >= linux-5.9." 1091958d196cSIndraneel M CONFIG[URING_ZNS]=n 1092958d196cSIndraneel M fi 10938b840195SIndraneel M fi 10948b840195SIndraneel Mfi 10958b840195SIndraneel M 10967fa15e28SXiaodong Liuif [[ "${CONFIG[FUSE]}" = "y" ]]; then 10977fa15e28SXiaodong Liu if [[ ! -d /usr/include/fuse3 ]] && [[ ! -d /usr/local/include/fuse3 ]]; then 10987fa15e28SXiaodong Liu echo "--with-fuse requires libfuse3." 10997fa15e28SXiaodong Liu echo "Please install then re-run this script." 11007fa15e28SXiaodong Liu exit 1 11017fa15e28SXiaodong Liu fi 11027fa15e28SXiaodong Liufi 11037fa15e28SXiaodong Liu 110491e42257SJim Harrisif [ "${CONFIG[CET]}" = "y" ]; then 1105bb0f78a2SMichal Berger if ! echo -e 'int main(void) { return 0; }\n' | "${BUILD_CMD[@]}" -fcf-protection - 2> /dev/null; then 1106bb0f78a2SMichal Berger echo "--enable-cet requires compiler/linker that supports CET." 1107bb0f78a2SMichal Berger echo "Please install then re-run this script." 110891e42257SJim Harris exit 1 110991e42257SJim Harris fi 111091e42257SJim Harrisfi 111191e42257SJim Harris 1112050565e5SJim Harrisif [[ "${CONFIG[FUZZER]}" = "y" && "$CC_TYPE" != "clang" ]]; then 1113050565e5SJim Harris echo "--with-fuzzer requires setting CC and CXX to clang." 1114050565e5SJim Harris exit 1 1115050565e5SJim Harrisfi 1116050565e5SJim Harris 1117dd2c08d2Spaul luseif [[ $arch == x86_64* ]] || [[ $arch == aarch64* ]]; then 1118dd2c08d2Spaul luse CONFIG[ISAL]=y 1119dd2c08d2Spaul luse # make sure the submodule is initialized 11209d2f6f86SJim Harris if [ ! -f "$rootdir"/isa-l/autogen.sh ]; then 1121dd2c08d2Spaul luse echo "ISA-L is required but was not found, please init the submodule with:" 11229d2f6f86SJim Harris echo " git submodule update --init" 1123dd2c08d2Spaul luse echo "and then re-run this script." 11249d2f6f86SJim Harris exit 1 11259d2f6f86SJim Harris fi 1126dd2c08d2Spaul luse # for x86 only, check the nasm version for ISA-L and IPSEC 1127dd2c08d2Spaul luse if [[ $arch == x86_64* ]]; then 1128dd2c08d2Spaul luse ver=$(nasm -v 2> /dev/null | awk '{print $3}' | awk -Fr '{print $1}') 1129dd2c08d2Spaul luse if lt "$ver" 2.14; then 1130dd2c08d2Spaul luse CONFIG[ISAL]=n 1131dd2c08d2Spaul luse # IPSEC has nasm requirement and DPDK crypto relies on IPSEC 1132dd2c08d2Spaul luse CONFIG[IPSEC_MB]=n 1133dd2c08d2Spaul luse echo "WARNING: ISA-L & DPDK crypto cannot be used as nasm ver must be 2.14 or newer." 1134dd2c08d2Spaul luse fi 1135dd2c08d2Spaul luse fi 1136dd2c08d2Spaul luseelse 1137dd2c08d2Spaul luse # for PPC 1138dd2c08d2Spaul luse CONFIG[ISAL]=n 1139dd2c08d2Spaul luse echo "WARNING: ISA-L cannot be used due to architecture incompatibility." 1140dd2c08d2Spaul lusefi 11419d2f6f86SJim Harris 1142dd2c08d2Spaul luse# now either configure ISA-L or disable unavailable features 1143dd2c08d2Spaul luseif [[ "${CONFIG[ISAL]}" = "y" ]]; then 11449d2f6f86SJim Harris cd $rootdir/isa-l 11459d2f6f86SJim Harris ISAL_LOG=$rootdir/isa-l/spdk-isal.log 11469d2f6f86SJim Harris if [[ -n "${CONFIG[CROSS_PREFIX]}" ]]; then 11479d2f6f86SJim Harris ISAL_OPTS=("--host=${CONFIG[CROSS_PREFIX]}") 11489d2f6f86SJim Harris else 11499d2f6f86SJim Harris ISAL_OPTS=() 11509d2f6f86SJim Harris fi 11519d2f6f86SJim Harris echo -n "Configuring ISA-L (logfile: $ISAL_LOG)..." 11529d2f6f86SJim Harris ./autogen.sh &> $ISAL_LOG 11539d2f6f86SJim Harris ./configure CFLAGS="-fPIC -g -O2" "${ISAL_OPTS[@]}" --enable-shared=no >> $ISAL_LOG 2>&1 11549d2f6f86SJim Harris echo "done." 11559d2f6f86SJim Harris cd $rootdir 1156dd2c08d2Spaul luseelse 1157dd2c08d2Spaul luse echo "Without ISA-L, there is no software support for crypto or compression," 1158dd2c08d2Spaul luse echo "so these features will be disabled." 1159dd2c08d2Spaul luse CONFIG[CRYPTO]=n 1160dd2c08d2Spaul luse CONFIG[REDUCE]=n 11619d2f6f86SJim Harrisfi 11629d2f6f86SJim Harris 1163509241ceSKonrad Sztyberif [[ "${CONFIG[SMA]}" = "y" ]]; then 1164509241ceSKonrad Sztyber if ! python3 -c 'import grpc; import grpc_tools' 2> /dev/null; then 1165509241ceSKonrad Sztyber echo "--with-sma requires grpcio and grpcio-tools python packages." 1166509241ceSKonrad Sztyber echo "Please install then re-run this script." 1167509241ceSKonrad Sztyber exit 1 1168509241ceSKonrad Sztyber fi 1169509241ceSKonrad Sztyberfi 1170509241ceSKonrad Sztyber 1171fcc38949SRui Chang# For ARM Neoverse-N1 platform, debug build needs gcc version newer than 8.4 1172fcc38949SRui Changif [[ "${CONFIG[DEBUG]}" = "y" && $arch = aarch64* && "$CC_TYPE" = "gcc" ]]; then 1173fcc38949SRui Chang GCC_VERSION=$($CC -dumpfullversion) 1174fcc38949SRui Chang PART_NUM=$(grep -i -m 1 "CPU part" /proc/cpuinfo | awk '{print $4}') 1175fcc38949SRui Chang 1176fcc38949SRui Chang if [[ "$(printf '%s\n' "8.4.0" "$GCC_VERSION" | sort -V | head -n1)" != "8.4.0" ]]; then 1177fcc38949SRui Chang if [[ $PART_NUM = 0xd0c ]]; then 1178fcc38949SRui Chang echo "WARNING: For ARM Neoverse-N1 platform, debug build needs GCC version newer than 8.4." 1179fcc38949SRui Chang echo " Will work around this by using armv8.2-a+crypto as target architecture for now." 1180fcc38949SRui Chang CONFIG[ARCH]=armv8.2-a+crypto 1181*e8f84531SSunil Shahu elif [[ $PART_NUM = 0x0b2 ]]; then 1182*e8f84531SSunil Shahu echo "WARNING: For ARM octeontx2 platform, debug build needs GCC version newer than 8.4." 1183*e8f84531SSunil Shahu echo " Will work around this by using armv8.2-a+crypto as target architecture for now." 1184*e8f84531SSunil Shahu CONFIG[ARCH]=armv8.2-a+crypto 1185fcc38949SRui Chang fi 1186fcc38949SRui Chang fi 1187fcc38949SRui Changfi 1188fcc38949SRui Chang 118948f70f48SPawel Wodkowski# We are now ready to generate final configuration. But first do sanity 119048f70f48SPawel Wodkowski# check to see if all keys in CONFIG array have its reflection in CONFIG file. 1191bb0f78a2SMichal Bergerif (($(grep -cE "^\s*CONFIG_[[:alnum:]_]+=" "$rootdir/CONFIG") != ${#CONFIG[@]})); then 119248f70f48SPawel Wodkowski echo "" 119348f70f48SPawel Wodkowski echo "BUG: Some configuration options are not present in CONFIG file. Please update this file." 119448f70f48SPawel Wodkowski echo "Missing options in CONFIG (+) file and in current config (-): " 119548f70f48SPawel Wodkowski diff -u --label "CONFIG file" --label "CONFIG[@]" \ 1196f8d6541dSMichal Berger <(sed -r -e '/^[[:space:]]*$/d; /^[[:space:]]*#.*/d; s/(CONFIG_[[:alnum:]_]+)=.*/\1/g' CONFIG | sort) \ 1197bb0f78a2SMichal Berger <(printf "CONFIG_%s\n" "${!CONFIG[@]}" | sort) 119848f70f48SPawel Wodkowski exit 1 119948f70f48SPawel Wodkowskifi 120048f70f48SPawel Wodkowski 120185bc2bbeSPawel Wodkowskiecho -n "Creating mk/config.mk..." 1202e62a3c65SSeth Howellcp -f $rootdir/CONFIG $rootdir/mk/config.mk 120351ab849bSJim HarrisARGS=$(echo "$@" | sed 's/ /\\ /g') 120451ab849bSJim Harrissed -i.bak -r "s#__CONFIGURE_OPTIONS__#${ARGS}#g" $rootdir/mk/config.mk 1205bb0f78a2SMichal Bergerfor key in "${!CONFIG[@]}"; do 1206f8d6541dSMichal Berger sed -i.bak -r "s#[[:space:]]*CONFIG_${key}=.*#CONFIG_${key}\?=${CONFIG[$key]}#g" $rootdir/mk/config.mk 1207577df16aSPawel Wodkowskidone 1208577df16aSPawel Wodkowski# On FreeBSD sed -i 'SUFFIX' - SUFFIX is mandatory. So no way but to delete the backed file. 1209e62a3c65SSeth Howellrm -f $rootdir/mk/config.mk.bak 1210baa6eac0SDarek Stojaczykecho "done." 12119dd998cdSBen Walker 121208ec96ebSDaniel Verkamp# Environment variables 1213baa6eac0SDarek Stojaczykecho -n "Creating mk/cc.flags.mk..." 1214e62a3c65SSeth Howellrm -f $rootdir/mk/cc.flags.mk 1215e62a3c65SSeth Howell[ -n "$CFLAGS" ] && echo "CFLAGS?=$CFLAGS" > $rootdir/mk/cc.flags.mk 1216e62a3c65SSeth Howell[ -n "$CXXFLAGS" ] && echo "CXXFLAGS?=$CXXFLAGS" >> $rootdir/mk/cc.flags.mk 1217e62a3c65SSeth Howell[ -n "$LDFLAGS" ] && echo "LDFLAGS?=$LDFLAGS" >> $rootdir/mk/cc.flags.mk 1218e62a3c65SSeth Howell[ -n "$DESTDIR" ] && echo "DESTDIR?=$DESTDIR" >> $rootdir/mk/cc.flags.mk 12190b56a5b4SJim Harrisecho "done." 122085bc2bbeSPawel Wodkowski 1221db3ebfe6SMichal Berger# Create .sh with build config for easy sourcing|lookup during the tests. 1222db3ebfe6SMichal Bergerfor conf in "${!CONFIG[@]}"; do 1223db3ebfe6SMichal Berger echo "CONFIG_$conf=${CONFIG[$conf]}" 1224db3ebfe6SMichal Bergerdone > "$rootdir/test/common/build_config.sh" 1225db3ebfe6SMichal Berger 12265a764955SMichal Bergerif [[ $sys_name == "FreeBSD" ]]; then 1227870ce250SPaul Luse echo "Type 'gmake' to build." 1228870ce250SPaul Luseelse 12290b56a5b4SJim Harris echo "Type 'make' to build." 1230870ce250SPaul Lusefi 12319dd998cdSBen Walker 12329dd998cdSBen Walkerexit 0 1233