1# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) 2include ../../scripts/Makefile.include 3 4OUTPUT ?= $(abspath .output)/ 5 6BPFTOOL_OUTPUT := $(OUTPUT)bpftool/ 7DEFAULT_BPFTOOL := $(BPFTOOL_OUTPUT)bootstrap/bpftool 8BPFTOOL ?= $(DEFAULT_BPFTOOL) 9BPF_TARGET_ENDIAN ?= --target=bpf 10LIBBPF_SRC := $(abspath ../../lib/bpf) 11BPFOBJ_OUTPUT := $(OUTPUT)libbpf/ 12BPFOBJ := $(BPFOBJ_OUTPUT)libbpf.a 13BPF_DESTDIR := $(BPFOBJ_OUTPUT) 14BPF_INCLUDE := $(BPF_DESTDIR)/include 15INCLUDES := -I$(OUTPUT) -I$(BPF_INCLUDE) -I$(abspath ../../include/uapi) 16CFLAGS := -g -Wall $(CLANG_CROSS_FLAGS) 17CFLAGS += $(EXTRA_CFLAGS) 18LDFLAGS += $(EXTRA_LDFLAGS) 19LDLIBS += -lelf -lz 20 21# Try to detect best kernel BTF source 22KERNEL_REL := $(shell uname -r) 23VMLINUX_BTF_PATHS := $(if $(O),$(O)/vmlinux) \ 24 $(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux) \ 25 ../../../vmlinux /sys/kernel/btf/vmlinux \ 26 /boot/vmlinux-$(KERNEL_REL) 27VMLINUX_BTF_PATH := $(or $(VMLINUX_BTF),$(firstword \ 28 $(wildcard $(VMLINUX_BTF_PATHS)))) 29 30ifneq ($(V),1) 31MAKEFLAGS += --no-print-directory 32submake_extras := feature_display=0 33endif 34 35.DELETE_ON_ERROR: 36 37.PHONY: all clean runqslower libbpf_hdrs 38all: runqslower 39 40runqslower: $(OUTPUT)/runqslower 41 42clean: 43 $(call QUIET_CLEAN, runqslower) 44 $(Q)$(RM) -r $(BPFOBJ_OUTPUT) $(BPFTOOL_OUTPUT) 45 $(Q)$(RM) $(OUTPUT)*.o $(OUTPUT)*.d 46 $(Q)$(RM) $(OUTPUT)*.skel.h $(OUTPUT)vmlinux.h 47 $(Q)$(RM) $(OUTPUT)runqslower 48 $(Q)$(RM) -r .output 49 50libbpf_hdrs: $(BPFOBJ) 51 52$(OUTPUT)/runqslower: $(OUTPUT)/runqslower.o $(BPFOBJ) 53 $(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $^ $(LDLIBS) -o $@ 54 55$(OUTPUT)/runqslower.o: runqslower.h $(OUTPUT)/runqslower.skel.h \ 56 $(OUTPUT)/runqslower.bpf.o | libbpf_hdrs 57 58$(OUTPUT)/runqslower.bpf.o: $(OUTPUT)/vmlinux.h runqslower.h | libbpf_hdrs 59 60$(OUTPUT)/%.skel.h: $(OUTPUT)/%.bpf.o | $(BPFTOOL) 61 $(QUIET_GEN)$(BPFTOOL) gen skeleton $< > $@ 62 63$(OUTPUT)/%.bpf.o: %.bpf.c $(BPFOBJ) | $(OUTPUT) 64 $(QUIET_GEN)$(CLANG) -g -O2 $(BPF_TARGET_ENDIAN) $(INCLUDES) \ 65 -c $(filter %.c,$^) -o $@ && \ 66 $(LLVM_STRIP) -g $@ 67 68$(OUTPUT)/%.o: %.c | $(OUTPUT) 69 $(QUIET_CC)$(CC) $(CFLAGS) $(INCLUDES) -c $(filter %.c,$^) -o $@ 70 71$(OUTPUT) $(BPFOBJ_OUTPUT) $(BPFTOOL_OUTPUT): 72 $(QUIET_MKDIR)mkdir -p $@ 73 74$(OUTPUT)/vmlinux.h: $(VMLINUX_BTF_PATH) | $(OUTPUT) $(BPFTOOL) 75ifeq ($(VMLINUX_H),) 76 $(Q)if [ ! -e "$(VMLINUX_BTF_PATH)" ] ; then \ 77 echo "Couldn't find kernel BTF; set VMLINUX_BTF to" \ 78 "specify its location." >&2; \ 79 exit 1;\ 80 fi 81 $(QUIET_GEN)$(BPFTOOL) btf dump file $(VMLINUX_BTF_PATH) format c > $@ 82else 83 $(Q)cp "$(VMLINUX_H)" $@ 84endif 85 86$(BPFOBJ): $(wildcard $(LIBBPF_SRC)/*.[ch] $(LIBBPF_SRC)/Makefile) | $(BPFOBJ_OUTPUT) 87 $(Q)$(MAKE) $(submake_extras) -C $(LIBBPF_SRC) OUTPUT=$(BPFOBJ_OUTPUT) \ 88 DESTDIR=$(BPFOBJ_OUTPUT) prefix= $(abspath $@) install_headers 89 90$(DEFAULT_BPFTOOL): | $(BPFTOOL_OUTPUT) 91 $(Q)$(MAKE) $(submake_extras) -C ../bpftool OUTPUT=$(BPFTOOL_OUTPUT) bootstrap 92