Makefile (3689B)
1 # The development version of clang is distributed as the 'clang' binary, 2 # while stable/released versions have a version number attached. 3 # Pin the default clang to a stable version. 4 CLANG ?= clang-14 5 STRIP ?= llvm-strip-14 6 OBJCOPY ?= llvm-objcopy-14 7 CFLAGS := -O2 -g -Wall -Werror $(CFLAGS) 8 9 CI_KERNEL_URL ?= https://github.com/cilium/ci-kernels/raw/master/ 10 11 # Obtain an absolute path to the directory of the Makefile. 12 # Assume the Makefile is in the root of the repository. 13 REPODIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST)))) 14 UIDGID := $(shell stat -c '%u:%g' ${REPODIR}) 15 16 # Prefer podman if installed, otherwise use docker. 17 # Note: Setting the var at runtime will always override. 18 CONTAINER_ENGINE ?= $(if $(shell command -v podman), podman, docker) 19 CONTAINER_RUN_ARGS ?= $(if $(filter ${CONTAINER_ENGINE}, podman), --log-driver=none, --user "${UIDGID}") 20 21 IMAGE := $(shell cat ${REPODIR}/testdata/docker/IMAGE) 22 VERSION := $(shell cat ${REPODIR}/testdata/docker/VERSION) 23 24 25 # clang <8 doesn't tag relocs properly (STT_NOTYPE) 26 # clang 9 is the first version emitting BTF 27 TARGETS := \ 28 testdata/loader-clang-7 \ 29 testdata/loader-clang-9 \ 30 testdata/loader-$(CLANG) \ 31 testdata/btf_map_init \ 32 testdata/invalid_map \ 33 testdata/raw_tracepoint \ 34 testdata/invalid_map_static \ 35 testdata/invalid_btf_map_init \ 36 testdata/strings \ 37 testdata/freplace \ 38 testdata/iproute2_map_compat \ 39 testdata/map_spin_lock \ 40 testdata/subprog_reloc \ 41 testdata/fwd_decl \ 42 btf/testdata/relocs \ 43 btf/testdata/relocs_read \ 44 btf/testdata/relocs_read_tgt 45 46 .PHONY: all clean container-all container-shell generate 47 48 .DEFAULT_TARGET = container-all 49 50 # Build all ELF binaries using a containerized LLVM toolchain. 51 container-all: 52 ${CONTAINER_ENGINE} run --rm ${CONTAINER_RUN_ARGS} \ 53 -v "${REPODIR}":/ebpf -w /ebpf --env MAKEFLAGS \ 54 --env CFLAGS="-fdebug-prefix-map=/ebpf=." \ 55 --env HOME="/tmp" \ 56 "${IMAGE}:${VERSION}" \ 57 $(MAKE) all 58 59 # (debug) Drop the user into a shell inside the container as root. 60 container-shell: 61 ${CONTAINER_ENGINE} run --rm -ti \ 62 -v "${REPODIR}":/ebpf -w /ebpf \ 63 "${IMAGE}:${VERSION}" 64 65 clean: 66 -$(RM) testdata/*.elf 67 -$(RM) btf/testdata/*.elf 68 69 format: 70 find . -type f -name "*.c" | xargs clang-format -i 71 72 all: format $(addsuffix -el.elf,$(TARGETS)) $(addsuffix -eb.elf,$(TARGETS)) generate 73 ln -srf testdata/loader-$(CLANG)-el.elf testdata/loader-el.elf 74 ln -srf testdata/loader-$(CLANG)-eb.elf testdata/loader-eb.elf 75 76 # $BPF_CLANG is used in go:generate invocations. 77 generate: export BPF_CLANG := $(CLANG) 78 generate: export BPF_CFLAGS := $(CFLAGS) 79 generate: 80 go generate ./cmd/bpf2go/test 81 go generate ./internal/sys 82 cd examples/ && go generate ./... 83 84 testdata/loader-%-el.elf: testdata/loader.c 85 $* $(CFLAGS) -target bpfel -c $< -o $@ 86 $(STRIP) -g $@ 87 88 testdata/loader-%-eb.elf: testdata/loader.c 89 $* $(CFLAGS) -target bpfeb -c $< -o $@ 90 $(STRIP) -g $@ 91 92 %-el.elf: %.c 93 $(CLANG) $(CFLAGS) -target bpfel -c $< -o $@ 94 $(STRIP) -g $@ 95 96 %-eb.elf : %.c 97 $(CLANG) $(CFLAGS) -target bpfeb -c $< -o $@ 98 $(STRIP) -g $@ 99 100 .PHONY: generate-btf 101 generate-btf: KERNEL_VERSION?=5.18 102 generate-btf: 103 $(eval TMP := $(shell mktemp -d)) 104 curl -fL "$(CI_KERNEL_URL)/linux-$(KERNEL_VERSION).bz" -o "$(TMP)/bzImage" 105 ./testdata/extract-vmlinux "$(TMP)/bzImage" > "$(TMP)/vmlinux" 106 $(OBJCOPY) --dump-section .BTF=/dev/stdout "$(TMP)/vmlinux" /dev/null | gzip > "btf/testdata/vmlinux.btf.gz" 107 curl -fL "$(CI_KERNEL_URL)/linux-$(KERNEL_VERSION)-selftests-bpf.tgz" -o "$(TMP)/selftests.tgz" 108 tar -xf "$(TMP)/selftests.tgz" --to-stdout tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.ko | \ 109 $(OBJCOPY) --dump-section .BTF="btf/testdata/btf_testmod.btf" - /dev/null 110 $(RM) -r "$(TMP)"