diff mbox series

[bpf-next,v2] bpftool: fix profiler build on systems without /usr/include/asm symlink

Message ID 20200311161459.6310-1-tklauser@distanz.ch
State Changes Requested
Headers show
Series [bpf-next,v2] bpftool: fix profiler build on systems without /usr/include/asm symlink | expand

Commit Message

Tobias Klauser March 11, 2020, 4:14 p.m. UTC
When compiling bpftool on a system where the /usr/include/asm symlink
doesn't exist (e.g. on an Ubuntu system without gcc-multilib installed),
the build fails with:

    CLANG    skeleton/profiler.bpf.o
  In file included from skeleton/profiler.bpf.c:4:
  In file included from /usr/include/linux/bpf.h:11:
  /usr/include/linux/types.h:5:10: fatal error: 'asm/types.h' file not found
  #include <asm/types.h>
           ^~~~~~~~~~~~~
  1 error generated.
  make: *** [Makefile:123: skeleton/profiler.bpf.o] Error 1

In certain cases (e.g. for container builds), installing gcc-multilib
and all its dependencies - which are otherwise not needed to build
bpftool - unnecessarily increases the image size.

Thus, fix this by adding /usr/include/$(uname -m)-linux-gnu to the
clang search path so <asm/types.h> can be found.

Acked-by: Song Liu <songliubraving@fb.com>
Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
---
 tools/bpf/bpftool/Makefile | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Comments

Alexei Starovoitov March 11, 2020, 5:26 p.m. UTC | #1
On Wed, Mar 11, 2020 at 05:14:59PM +0100, Tobias Klauser wrote:
> When compiling bpftool on a system where the /usr/include/asm symlink
> doesn't exist (e.g. on an Ubuntu system without gcc-multilib installed),
> the build fails with:
> 
>     CLANG    skeleton/profiler.bpf.o
>   In file included from skeleton/profiler.bpf.c:4:
>   In file included from /usr/include/linux/bpf.h:11:
>   /usr/include/linux/types.h:5:10: fatal error: 'asm/types.h' file not found
>   #include <asm/types.h>
>            ^~~~~~~~~~~~~
>   1 error generated.

I think the issue is different.
profiler.bpf.c should have picked up
tools/include/uapi/linux/bpf.h (instead of global from /usr/inclde)
which should have included
tools/include/linux/types.h (instead of /usr/include/linux/types.h)

we also have a workaround for some cases:
./tools/testing/selftests/bpf/include/uapi/linux/types.h

>   make: *** [Makefile:123: skeleton/profiler.bpf.o] Error 1
> 
> In certain cases (e.g. for container builds), installing gcc-multilib
> and all its dependencies - which are otherwise not needed to build
> bpftool - unnecessarily increases the image size.
> 
> Thus, fix this by adding /usr/include/$(uname -m)-linux-gnu to the
> clang search path so <asm/types.h> can be found.

In general perf builds fine on all sorts of distros and configs.
I think bpftool should use the same includes from tools/
and skeleton too.
Tobias Klauser March 11, 2020, 7:42 p.m. UTC | #2
On 2020-03-11 at 18:26:50 +0100, Alexei Starovoitov <alexei.starovoitov@gmail.com> wrote:
> On Wed, Mar 11, 2020 at 05:14:59PM +0100, Tobias Klauser wrote:
> > When compiling bpftool on a system where the /usr/include/asm symlink
> > doesn't exist (e.g. on an Ubuntu system without gcc-multilib installed),
> > the build fails with:
> > 
> >     CLANG    skeleton/profiler.bpf.o
> >   In file included from skeleton/profiler.bpf.c:4:
> >   In file included from /usr/include/linux/bpf.h:11:
> >   /usr/include/linux/types.h:5:10: fatal error: 'asm/types.h' file not found
> >   #include <asm/types.h>
> >            ^~~~~~~~~~~~~
> >   1 error generated.
> 
> I think the issue is different.
> profiler.bpf.c should have picked up
> tools/include/uapi/linux/bpf.h (instead of global from /usr/inclde)
> which should have included
> tools/include/linux/types.h (instead of /usr/include/linux/types.h)
> 
> we also have a workaround for some cases:
> ./tools/testing/selftests/bpf/include/uapi/linux/types.h

I just tried that. Unfortunately, this will pull in stdbool.h, stddef.h
and stdint.h libc header (via either linux/types.h header). This will
again require the libc6-dev-i386 package when building for the bpf
target. This is exactly the dependency that we'd like to avoid in
Cilium, also see https://github.com/cilium/cilium/pull/10204

I agree that we ideally shouldn't pull in the headers from the system,
but currently I don't see a way of doing that without still depending on
libc headers. Suggestions welcome...

> >   make: *** [Makefile:123: skeleton/profiler.bpf.o] Error 1
> > 
> > In certain cases (e.g. for container builds), installing gcc-multilib
> > and all its dependencies - which are otherwise not needed to build
> > bpftool - unnecessarily increases the image size.
> > 
> > Thus, fix this by adding /usr/include/$(uname -m)-linux-gnu to the
> > clang search path so <asm/types.h> can be found.
> 
> In general perf builds fine on all sorts of distros and configs.
> I think bpftool should use the same includes from tools/
> and skeleton too.

I'll check how perf builds do it but I suspect they will also depend on
libc headers. This is fine for userspace tools, but we'd like to avoid
it for bpf programs.

- Tobias
Tobias Klauser March 12, 2020, 10:30 a.m. UTC | #3
On 2020-03-11 at 18:26:50 +0100, Alexei Starovoitov <alexei.starovoitov@gmail.com> wrote:
> On Wed, Mar 11, 2020 at 05:14:59PM +0100, Tobias Klauser wrote:
> > When compiling bpftool on a system where the /usr/include/asm symlink
> > doesn't exist (e.g. on an Ubuntu system without gcc-multilib installed),
> > the build fails with:
> > 
> >     CLANG    skeleton/profiler.bpf.o
> >   In file included from skeleton/profiler.bpf.c:4:
> >   In file included from /usr/include/linux/bpf.h:11:
> >   /usr/include/linux/types.h:5:10: fatal error: 'asm/types.h' file not found
> >   #include <asm/types.h>
> >            ^~~~~~~~~~~~~
> >   1 error generated.
> 
> I think the issue is different.
> profiler.bpf.c should have picked up
> tools/include/uapi/linux/bpf.h (instead of global from /usr/inclde)
> which should have included
> tools/include/linux/types.h (instead of /usr/include/linux/types.h)
> 
> we also have a workaround for some cases:
> ./tools/testing/selftests/bpf/include/uapi/linux/types.h

Sorry, my earlier reply was wrong. Adding
tools/testing/selftests/bpf/include/uapi/ to the search path (and
tools/include/uapi/ in addition) makes this work. Will send a v3.
diff mbox series

Patch

diff --git a/tools/bpf/bpftool/Makefile b/tools/bpf/bpftool/Makefile
index 20a90d8450f8..db54e9bb873a 100644
--- a/tools/bpf/bpftool/Makefile
+++ b/tools/bpf/bpftool/Makefile
@@ -120,7 +120,8 @@  $(OUTPUT)_bpftool: $(_OBJS) $(LIBBPF)
 	$(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(_OBJS) $(LIBS)
 
 skeleton/profiler.bpf.o: skeleton/profiler.bpf.c
-	$(QUIET_CLANG)$(CLANG) -I$(srctree)/tools/lib -g -O2 -target bpf -c $< -o $@
+	$(QUIET_CLANG)$(CLANG) -I/usr/include/$(shell uname -m)-linux-gnu \
+		-I$(srctree)/tools/lib -g -O2 -target bpf -c $< -o $@
 
 profiler.skel.h: $(OUTPUT)_bpftool skeleton/profiler.bpf.o
 	$(QUIET_GEN)$(OUTPUT)./_bpftool gen skeleton skeleton/profiler.bpf.o > $@