From 7b04eb72d24a63fbd01276908f187521698ea6a5 Mon Sep 17 00:00:00 2001 From: Yuriy Umanets Date: Mon, 17 Jan 2022 16:23:01 +0200 Subject: [PATCH] configure: Fixes for multi-arch distros - When using --with-dpdk=dpdk/install option we have to take into account multi-arch distros (Ubuntu) that keep the libraries in locations like dpdk/install/lib/x86_64-linux-gnu. - Handle arch differences and library paths between gcc -dumpmachine and clang -dumpmachine. - If possible, use pkg-config to handle --with-dpdk=dpdk/install properly and request libraries path and cflags using correct pkg-config library location. Signed-off-by: Yuriy Umanets Change-Id: I0b8b746742aab8ed4af7d96dfb540fa2cf02e27c Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/11615 Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Ben Walker Reviewed-by: Shuhei Matsumoto Reviewed-by: Aleksey Marchuk --- configure | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/configure b/configure index e2a42a7a0..b8be360ae 100755 --- a/configure +++ b/configure @@ -193,6 +193,27 @@ function check_dir() { fi } +# On x86_64 'clang -dumpmachine' produces x86_64-pc-linux-gnu +# whereas the dpdk might be built with gcc and its libs lie in +# x86_64-linux-gnu. Let's find the right libdir for dpdkd libs. +function find_dpdk_arch_libdir() { + local dpdk_dir=$1 + + # Checking first what we have with $arch, then clang + # variant of arch. + arches=("$arch" "$(echo $arch | sed 's/-pc//g')") + for a in "${arches[@]}"; do + local libdir="$dpdk_dir/lib/$a" + if [[ -d $libdir ]]; then + echo $libdir + return + fi + done + + # Fallback to the libdir without arch component + echo "$dpdk_dir/lib" +} + for i in "$@"; do case "$i" in -h | --help) @@ -289,9 +310,14 @@ for i in "$@"; do CONFIG[CET]=n ;; --with-dpdk) - if pkg-config --exists libdpdk; then - CONFIG[DPDK_LIB_DIR]=$(pkg-config --variable=libdir libdpdk) - CONFIG[DPDK_INC_DIR]=$(pkg-config --variable=includedir libdpdk) + # Can we use pkg-config? + if command -v "pkg-config" > /dev/null 2>&1 && pkg-config --exists libdpdk; then + dpdk_libdir=$(pkg-config --variable=libdir libdpdk) + dpdk_libdir=$(readlink -f $dpdk_libdir) + dpdk_incdir=$(pkg-config --variable=includedir libdpdk) + echo "Using DPDK lib dir $dpdk_libdir" + CONFIG[DPDK_LIB_DIR]=$dpdk_libdir + CONFIG[DPDK_INC_DIR]=$dpdk_incdir CONFIG[DPDK_PKG_CONFIG]=y CFLAGS="${CFLAGS:+$CFLAGS }$(pkg-config --cflags libdpdk)" else @@ -301,7 +327,30 @@ for i in "$@"; do ;; --with-dpdk=*) check_dir "$i" - CONFIG[DPDK_DIR]=$(readlink -f ${i#*=}) + dpdk_dir=$(readlink -f ${i#*=}) + dpdk_libdir=$(find_dpdk_arch_libdir $dpdk_dir) + dpdk_incdir="$dpdk_dir/include" + + # Can we use pkg-config? + if command -v "pkg-config" > /dev/null 2>&1 && PKG_CONFIG_PATH="$dpdk_libdir/pkgconfig" pkg-config --exists libdpdk; then + echo "Using $dpdk_libdir/pkgconfig for additional libs..." + dpdk_libdir=$(PKG_CONFIG_PATH="$dpdk_libdir/pkgconfig" pkg-config --variable=libdir libdpdk) + dpdk_libdir=$(readlink -f $dpdk_libdir) + if ! echo $dpdk_libdir | grep $dpdk_dir > /dev/null 2>&1; then + echo "ERROR: pkg-config reported DPDK libdir $dpdk_libdir is out of the directory specified with --with-dpdk=" + echo "ERROR: do you have another DPDK installed in the system?" + exit 1 + fi + + CFLAGS="${CFLAGS:+$CFLAGS }$(PKG_CONFIG_PATH="$dpdk_libdir/pkgconfig" pkg-config --cflags libdpdk)" + dpdk_incdir=$(PKG_CONFIG_PATH="$dpdk_libdir/pkgconfig" pkg-config --variable=includedir libdpdk) + fi + echo "DPDK libraries: $dpdk_libdir" + echo "DPDK includes: $dpdk_incdir" + CONFIG[DPDK_DIR]=$dpdk_dir + CONFIG[DPDK_LIB_DIR]="$dpdk_libdir" + CONFIG[DPDK_INC_DIR]="$dpdk_incdir" + CONFIG[DPDK_PKG_CONFIG]=n ;; --without-dpdk) CONFIG[DPDK_DIR]=