diff mbox series

[bpf-next,1/2] bpftool: only build bpftool-prog-profile with clang >= v11

Message ID 20200310183624.441788-2-songliubraving@fb.com
State Changes Requested
Delegated to: BPF Maintainers
Headers show
Series Fixes for bpftool-prog-profile | expand

Commit Message

Song Liu March 10, 2020, 6:36 p.m. UTC
bpftool-prog-profile requires clang of version 11.0.0 or newer. If
bpftool is built with older clang, show a hint of to the user.

Signed-off-by: Song Liu <songliubraving@fb.com>
---
 tools/bpf/bpftool/Makefile | 13 +++++++++++--
 tools/bpf/bpftool/prog.c   |  2 ++
 2 files changed, 13 insertions(+), 2 deletions(-)

Comments

Quentin Monnet March 10, 2020, 10:44 p.m. UTC | #1
2020-03-10 11:36 UTC-0700 ~ Song Liu <songliubraving@fb.com>
> bpftool-prog-profile requires clang of version 11.0.0 or newer. If
> bpftool is built with older clang, show a hint of to the user.
> 
> Signed-off-by: Song Liu <songliubraving@fb.com>
> ---
>  tools/bpf/bpftool/Makefile | 13 +++++++++++--
>  tools/bpf/bpftool/prog.c   |  2 ++
>  2 files changed, 13 insertions(+), 2 deletions(-)
> 
> diff --git a/tools/bpf/bpftool/Makefile b/tools/bpf/bpftool/Makefile
> index 20a90d8450f8..05a37f0f76a9 100644
> --- a/tools/bpf/bpftool/Makefile
> +++ b/tools/bpf/bpftool/Makefile
> @@ -60,6 +60,15 @@ LIBS = $(LIBBPF) -lelf -lz
>  INSTALL ?= install
>  RM ?= rm -f
>  CLANG ?= clang
> +CLANG_VERS = $(shell $(CLANG) --version | head -n 1 | awk '{print $$3}')
> +CLANG_MAJ = $(shell echo $(CLANG_VERS) | cut -d '.' -f 1)

This will produce error messages on stderr if clang is not installed on
the system.

> +WITHOUT_SKELETONS = -DBPFTOOL_WITHOUT_SKELETONS
> +
> +ifeq ($(shell test $(CLANG_MAJ) -ge 11; echo $$?),0)

Not exactly what I had in mind. I thought about the feature detection
facility we have under tools/build/feature/, as is used for e.g.
detecting libbfd. It would allow to check the feature is available,
instead of tying the build to a numeric version number. But that's more
work to do, so I suppose this version can work, too...

> +	PROG_FLAGS =
> +else
> +	PROG_FLAGS = $(WITHOUT_SKELETONS)
> +endif
>  
>  FEATURE_USER = .bpftool
>  FEATURE_TESTS = libbfd disassembler-four-args reallocarray zlib
> @@ -114,7 +123,7 @@ OBJS = $(patsubst %.c,$(OUTPUT)%.o,$(SRCS)) $(OUTPUT)disasm.o
>  _OBJS = $(filter-out $(OUTPUT)prog.o,$(OBJS)) $(OUTPUT)_prog.o
>  
>  $(OUTPUT)_prog.o: prog.c
> -	$(QUIET_CC)$(COMPILE.c) -MMD -DBPFTOOL_WITHOUT_SKELETONS -o $@ $<
> +	$(QUIET_CC)$(COMPILE.c) -MMD $(WITHOUT_SKELETONS) -o $@ $<
>  
>  $(OUTPUT)_bpftool: $(_OBJS) $(LIBBPF)
>  	$(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(_OBJS) $(LIBS)
> @@ -126,7 +135,7 @@ profiler.skel.h: $(OUTPUT)_bpftool skeleton/profiler.bpf.o
>  	$(QUIET_GEN)$(OUTPUT)./_bpftool gen skeleton skeleton/profiler.bpf.o > $@
>  
>  $(OUTPUT)prog.o: prog.c profiler.skel.h
> -	$(QUIET_CC)$(COMPILE.c) -MMD -o $@ $<
> +	$(QUIET_CC)$(COMPILE.c) -MMD $(PROG_FLAGS) -o $@ $<

Would be nice to find a way to skip the second build if it is not needed?

>  
>  $(OUTPUT)disasm.o: $(srctree)/kernel/bpf/disasm.c
>  	$(QUIET_CC)$(COMPILE.c) -MMD -o $@ $<
> diff --git a/tools/bpf/bpftool/prog.c b/tools/bpf/bpftool/prog.c
> index 576ddd82bc96..5db378d5d970 100644
> --- a/tools/bpf/bpftool/prog.c
> +++ b/tools/bpf/bpftool/prog.c
> @@ -1545,6 +1545,8 @@ static int do_loadall(int argc, char **argv)
>  
>  static int do_profile(int argc, char **argv)
>  {
> +	fprintf(stdout, "bpftool prog profile command is not supported.\n"
> +		"Please recompile bpftool with clang >= 11.0.0\n");

p_err()?

>  	return 0;
>  }
>  
> 

Thanks a lot for the follow-up!
Quentin
Alexei Starovoitov March 10, 2020, 10:54 p.m. UTC | #2
On Tue, Mar 10, 2020 at 3:45 PM Quentin Monnet <quentin@isovalent.com> wrote:
>
> 2020-03-10 11:36 UTC-0700 ~ Song Liu <songliubraving@fb.com>
> > bpftool-prog-profile requires clang of version 11.0.0 or newer. If
> > bpftool is built with older clang, show a hint of to the user.
> >
> > Signed-off-by: Song Liu <songliubraving@fb.com>
> > ---
> >  tools/bpf/bpftool/Makefile | 13 +++++++++++--
> >  tools/bpf/bpftool/prog.c   |  2 ++
> >  2 files changed, 13 insertions(+), 2 deletions(-)
> >
> > diff --git a/tools/bpf/bpftool/Makefile b/tools/bpf/bpftool/Makefile
> > index 20a90d8450f8..05a37f0f76a9 100644
> > --- a/tools/bpf/bpftool/Makefile
> > +++ b/tools/bpf/bpftool/Makefile
> > @@ -60,6 +60,15 @@ LIBS = $(LIBBPF) -lelf -lz
> >  INSTALL ?= install
> >  RM ?= rm -f
> >  CLANG ?= clang
> > +CLANG_VERS = $(shell $(CLANG) --version | head -n 1 | awk '{print $$3}')
> > +CLANG_MAJ = $(shell echo $(CLANG_VERS) | cut -d '.' -f 1)
>
> This will produce error messages on stderr if clang is not installed on
> the system.
>
> > +WITHOUT_SKELETONS = -DBPFTOOL_WITHOUT_SKELETONS
> > +
> > +ifeq ($(shell test $(CLANG_MAJ) -ge 11; echo $$?),0)
>
> Not exactly what I had in mind. I thought about the feature detection
> facility we have under tools/build/feature/, as is used for e.g.
> detecting libbfd. It would allow to check the feature is available,
> instead of tying the build to a numeric version number.

+1
I think the global data feature is actually present in v10.
Version check won't work for backported clangs.
So please do feature check.
diff mbox series

Patch

diff --git a/tools/bpf/bpftool/Makefile b/tools/bpf/bpftool/Makefile
index 20a90d8450f8..05a37f0f76a9 100644
--- a/tools/bpf/bpftool/Makefile
+++ b/tools/bpf/bpftool/Makefile
@@ -60,6 +60,15 @@  LIBS = $(LIBBPF) -lelf -lz
 INSTALL ?= install
 RM ?= rm -f
 CLANG ?= clang
+CLANG_VERS = $(shell $(CLANG) --version | head -n 1 | awk '{print $$3}')
+CLANG_MAJ = $(shell echo $(CLANG_VERS) | cut -d '.' -f 1)
+WITHOUT_SKELETONS = -DBPFTOOL_WITHOUT_SKELETONS
+
+ifeq ($(shell test $(CLANG_MAJ) -ge 11; echo $$?),0)
+	PROG_FLAGS =
+else
+	PROG_FLAGS = $(WITHOUT_SKELETONS)
+endif
 
 FEATURE_USER = .bpftool
 FEATURE_TESTS = libbfd disassembler-four-args reallocarray zlib
@@ -114,7 +123,7 @@  OBJS = $(patsubst %.c,$(OUTPUT)%.o,$(SRCS)) $(OUTPUT)disasm.o
 _OBJS = $(filter-out $(OUTPUT)prog.o,$(OBJS)) $(OUTPUT)_prog.o
 
 $(OUTPUT)_prog.o: prog.c
-	$(QUIET_CC)$(COMPILE.c) -MMD -DBPFTOOL_WITHOUT_SKELETONS -o $@ $<
+	$(QUIET_CC)$(COMPILE.c) -MMD $(WITHOUT_SKELETONS) -o $@ $<
 
 $(OUTPUT)_bpftool: $(_OBJS) $(LIBBPF)
 	$(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(_OBJS) $(LIBS)
@@ -126,7 +135,7 @@  profiler.skel.h: $(OUTPUT)_bpftool skeleton/profiler.bpf.o
 	$(QUIET_GEN)$(OUTPUT)./_bpftool gen skeleton skeleton/profiler.bpf.o > $@
 
 $(OUTPUT)prog.o: prog.c profiler.skel.h
-	$(QUIET_CC)$(COMPILE.c) -MMD -o $@ $<
+	$(QUIET_CC)$(COMPILE.c) -MMD $(PROG_FLAGS) -o $@ $<
 
 $(OUTPUT)disasm.o: $(srctree)/kernel/bpf/disasm.c
 	$(QUIET_CC)$(COMPILE.c) -MMD -o $@ $<
diff --git a/tools/bpf/bpftool/prog.c b/tools/bpf/bpftool/prog.c
index 576ddd82bc96..5db378d5d970 100644
--- a/tools/bpf/bpftool/prog.c
+++ b/tools/bpf/bpftool/prog.c
@@ -1545,6 +1545,8 @@  static int do_loadall(int argc, char **argv)
 
 static int do_profile(int argc, char **argv)
 {
+	fprintf(stdout, "bpftool prog profile command is not supported.\n"
+		"Please recompile bpftool with clang >= 11.0.0\n");
 	return 0;
 }