Re: [PATCHv4 iproute2-next 1/5] configure: add check_libbpf() for later libbpf support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 11/9/20 12:07 AM, Hangbin Liu wrote:
> This patch adds a check to see if we have libbpf support. By default the
> system libbpf will be used, but static linking against a custom libbpf
> version can be achieved by passing LIBBPF_DIR to configure.
> 
> Add another variable LIBBPF_FORCE to control whether to build iproute2
> with libbpf. If set to on, then force to build with libbpf and exit if
> not available. If set to off, then force to not build with libbpf.
> 
> Signed-off-by: Hangbin Liu <haliu@xxxxxxxxxx>
> 
> v4:
> 1) Remove duplicate LIBBPF_CFLAGS
> 2) Remove un-needed -L since using static libbpf.a
> 3) Fix == not supported in dash
> 4) Extend LIBBPF_FORCE to support on/off, when set to on, stop building when
>    there is no libbpf support. If set to off, discard libbpf check.
> 5) Print libbpf version after checking
> 
> v3:
> Check function bpf_program__section_name() separately and only use it
> on higher libbpf version.
> 
> v2:
> No update
> ---
>  configure | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 108 insertions(+)
> 
> diff --git a/configure b/configure
> index 307912aa..3081a2ac 100755
> --- a/configure
> +++ b/configure
> @@ -2,6 +2,11 @@
>  # SPDX-License-Identifier: GPL-2.0
>  # This is not an autoconf generated configure
>  #
> +# Influential LIBBPF environment variables:
> +#   LIBBPF_FORCE={on,off}   on: require link against libbpf;
> +#                           off: disable libbpf probing
> +#   LIBBPF_LIBDIR           Path to libbpf to use
> +
>  INCLUDE=${1:-"$PWD/include"}
>  
>  # Output file which is input to Makefile
> @@ -240,6 +245,106 @@ check_elf()
>      fi
>  }
>  
> +have_libbpf_basic()
> +{
> +    cat >$TMPDIR/libbpf_test.c <<EOF
> +#include <bpf/libbpf.h>
> +int main(int argc, char **argv) {
> +    bpf_program__set_autoload(NULL, false);
> +    bpf_map__ifindex(NULL);
> +    bpf_map__set_pin_path(NULL, NULL);
> +    bpf_object__open_file(NULL, NULL);
> +    return 0;
> +}
> +EOF
> +
> +    $CC -o $TMPDIR/libbpf_test $TMPDIR/libbpf_test.c $LIBBPF_CFLAGS $LIBBPF_LDLIBS >/dev/null 2>&1
> +    local ret=$?
> +
> +    rm -f $TMPDIR/libbpf_test.c $TMPDIR/libbpf_test
> +    return $ret
> +}
> +
> +have_libbpf_sec_name()
> +{
> +    cat >$TMPDIR/libbpf_sec_test.c <<EOF
> +#include <bpf/libbpf.h>
> +int main(int argc, char **argv) {
> +    void *ptr;
> +    bpf_program__section_name(NULL);
> +    return 0;
> +}
> +EOF
> +
> +    $CC -o $TMPDIR/libbpf_sec_test $TMPDIR/libbpf_sec_test.c $LIBBPF_CFLAGS $LIBBPF_LDLIBS >/dev/null 2>&1
> +    local ret=$?
> +
> +    rm -f $TMPDIR/libbpf_sec_test.c $TMPDIR/libbpf_sec_test
> +    return $ret
> +}
> +
> +check_force_libbpf_on()
> +{
> +    # if set LIBBPF_FORCE=on but no libbpf support, just exist the config
> +    # process to make sure we don't build without libbpf.
> +    if [ "$LIBBPF_FORCE" = on ]; then
> +        echo "	LIBBPF_FORCE=on set, but couldn't find a usable libbpf"
> +        exit 1
> +    fi
> +}
> +
> +check_libbpf()
> +{
> +    # if set LIBBPF_FORCE=off, disable libbpf entirely
> +    if [ "$LIBBPF_FORCE" = off ]; then
> +        echo "no"
> +        return
> +    fi
> +
> +    if ! ${PKG_CONFIG} libbpf --exists && [ -z "$LIBBPF_DIR" ] ; then
> +        echo "no"
> +        check_force_libbpf_on
> +        return
> +    fi
> +
> +    if [ $(uname -m) = x86_64 ]; then
> +        local LIBBPF_LIBDIR="${LIBBPF_DIR}/lib64"
> +    else
> +        local LIBBPF_LIBDIR="${LIBBPF_DIR}/lib"
> +    fi
> +
> +    if [ -n "$LIBBPF_DIR" ]; then
> +        LIBBPF_CFLAGS="-I${LIBBPF_DIR}/include"
> +        LIBBPF_LDLIBS="${LIBBPF_LIBDIR}/libbpf.a -lz -lelf"
> +        LIBBPF_VERSION=$(PKG_CONFIG_LIBDIR=${LIBBPF_LIBDIR}/pkgconfig ${PKG_CONFIG} libbpf --modversion)
> +    else
> +        LIBBPF_CFLAGS=$(${PKG_CONFIG} libbpf --cflags)
> +        LIBBPF_LDLIBS=$(${PKG_CONFIG} libbpf --libs)
> +        LIBBPF_VERSION=$(${PKG_CONFIG} libbpf --modversion)
> +    fi
> +
> +    if ! have_libbpf_basic; then
> +        echo "no"
> +        echo "	libbpf version $LIBBPF_VERSION is too low, please update it to at least 0.1.0"
> +        check_force_libbpf_on
> +        return
> +    else
> +        echo "HAVE_LIBBPF:=y" >>$CONFIG
> +        echo 'CFLAGS += -DHAVE_LIBBPF ' $LIBBPF_CFLAGS >> $CONFIG
> +        echo 'LDLIBS += ' $LIBBPF_LDLIBS >>$CONFIG
> +    fi
> +
> +    # bpf_program__title() is deprecated since libbpf 0.2.0, use
> +    # bpf_program__section_name() instead if we support
> +    if have_libbpf_sec_name; then
> +        echo "HAVE_LIBBPF_SECTION_NAME:=y" >>$CONFIG
> +        echo 'CFLAGS += -DHAVE_LIBBPF_SECTION_NAME ' >> $CONFIG
> +    fi
> +
> +    echo "yes"
> +    echo "	libbpf version $LIBBPF_VERSION"
> +}
> +
>  check_selinux()
>  # SELinux is a compile time option in the ss utility
>  {
> @@ -385,6 +490,9 @@ check_setns
>  echo -n "SELinux support: "
>  check_selinux
>  
> +echo -n "libbpf support: "
> +check_libbpf
> +
>  echo -n "ELF support: "
>  check_elf
>  
> 

Something is off with the version detection.

# LIBBPF_LIBDIR=/tmp/libbpf ./configure
TC schedulers
 ATM	no

libc has setns: yes
SELinux support: no
libbpf support: yes
	libbpf version 0.1.0
ELF support: yes

/tmp/libbpf has an install of top of tree as of today which is:

/tmp/libbpf/usr/lib64/libbpf.so.0.3.0

This is using Ubuntu 20.10.




[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux