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 |
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.
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
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 --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 > $@