[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <8443c959-2ab5-0963-120e-b278e8bac360@gmail.com>
Date: Fri, 13 Nov 2020 20:26:51 -0700
From: David Ahern <dsahern@...il.com>
To: Hangbin Liu <haliu@...hat.com>,
Stephen Hemminger <stephen@...workplumber.org>
Cc: Daniel Borkmann <daniel@...earbox.net>,
Martin KaFai Lau <kafai@...com>,
Song Liu <songliubraving@...com>, Yonghong Song <yhs@...com>,
David Miller <davem@...emloft.net>,
Jesper Dangaard Brouer <brouer@...hat.com>,
netdev@...r.kernel.org, bpf@...r.kernel.org,
Jiri Benc <jbenc@...hat.com>,
Toke Høiland-Jørgensen <toke@...hat.com>
Subject: Re: [PATCHv4 iproute2-next 1/5] configure: add check_libbpf() for
later libbpf support
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@...hat.com>
>
> 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.
Powered by blists - more mailing lists