1# SPDX-License-Identifier: GPL-2.0-only 2include ../../scripts/Makefile.include 3include ../../scripts/utilities.mak 4 5ifeq ($(srctree),) 6srctree := $(patsubst %/,%,$(dir $(CURDIR))) 7srctree := $(patsubst %/,%,$(dir $(srctree))) 8srctree := $(patsubst %/,%,$(dir $(srctree))) 9endif 10 11ifeq ($(V),1) 12 Q = 13else 14 Q = @ 15endif 16 17BPF_DIR = $(srctree)/tools/lib/bpf/ 18 19ifneq ($(OUTPUT),) 20 LIBBPF_OUTPUT = $(OUTPUT)/libbpf/ 21 LIBBPF_PATH = $(LIBBPF_OUTPUT) 22 BOOTSTRAP_OUTPUT = $(OUTPUT)/bootstrap/ 23else 24 LIBBPF_OUTPUT = 25 LIBBPF_PATH = $(BPF_DIR) 26 BOOTSTRAP_OUTPUT = $(CURDIR)/bootstrap/ 27endif 28 29LIBBPF = $(LIBBPF_PATH)libbpf.a 30LIBBPF_BOOTSTRAP_OUTPUT = $(BOOTSTRAP_OUTPUT)libbpf/ 31LIBBPF_BOOTSTRAP = $(LIBBPF_BOOTSTRAP_OUTPUT)libbpf.a 32 33ifeq ($(BPFTOOL_VERSION),) 34BPFTOOL_VERSION := $(shell make -rR --no-print-directory -sC ../../.. kernelversion) 35endif 36 37$(LIBBPF_OUTPUT) $(BOOTSTRAP_OUTPUT) $(LIBBPF_BOOTSTRAP_OUTPUT): 38 $(QUIET_MKDIR)mkdir -p $@ 39 40$(LIBBPF): FORCE | $(LIBBPF_OUTPUT) 41 $(Q)$(MAKE) -C $(BPF_DIR) OUTPUT=$(LIBBPF_OUTPUT) $(LIBBPF_OUTPUT)libbpf.a 42 43$(LIBBPF_BOOTSTRAP): FORCE | $(LIBBPF_BOOTSTRAP_OUTPUT) 44 $(Q)$(MAKE) -C $(BPF_DIR) OUTPUT=$(LIBBPF_BOOTSTRAP_OUTPUT) \ 45 ARCH= CC=$(HOSTCC) LD=$(HOSTLD) $@ 46 47$(LIBBPF)-clean: FORCE | $(LIBBPF_OUTPUT) 48 $(call QUIET_CLEAN, libbpf) 49 $(Q)$(MAKE) -C $(BPF_DIR) OUTPUT=$(LIBBPF_OUTPUT) clean >/dev/null 50 51$(LIBBPF_BOOTSTRAP)-clean: FORCE | $(LIBBPF_BOOTSTRAP_OUTPUT) 52 $(call QUIET_CLEAN, libbpf-bootstrap) 53 $(Q)$(MAKE) -C $(BPF_DIR) OUTPUT=$(LIBBPF_BOOTSTRAP_OUTPUT) clean >/dev/null 54 55prefix ?= /usr/local 56bash_compdir ?= /usr/share/bash-completion/completions 57 58CFLAGS += -O2 59CFLAGS += -W -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers 60CFLAGS += $(filter-out -Wswitch-enum -Wnested-externs,$(EXTRA_WARNINGS)) 61CFLAGS += -DPACKAGE='"bpftool"' -D__EXPORTED_HEADERS__ \ 62 -I$(if $(OUTPUT),$(OUTPUT),.) \ 63 -I$(srctree)/kernel/bpf/ \ 64 -I$(srctree)/tools/include \ 65 -I$(srctree)/tools/include/uapi \ 66 -I$(srctree)/tools/lib \ 67 -I$(srctree)/tools/perf 68CFLAGS += -DBPFTOOL_VERSION='"$(BPFTOOL_VERSION)"' 69ifneq ($(EXTRA_CFLAGS),) 70CFLAGS += $(EXTRA_CFLAGS) 71endif 72ifneq ($(EXTRA_LDFLAGS),) 73LDFLAGS += $(EXTRA_LDFLAGS) 74endif 75 76INSTALL ?= install 77RM ?= rm -f 78CLANG ?= clang 79LLVM_STRIP ?= llvm-strip 80 81FEATURE_USER = .bpftool 82FEATURE_TESTS = libbfd disassembler-four-args reallocarray zlib libcap \ 83 clang-bpf-co-re 84FEATURE_DISPLAY = libbfd disassembler-four-args zlib libcap \ 85 clang-bpf-co-re 86 87check_feat := 1 88NON_CHECK_FEAT_TARGETS := clean uninstall doc doc-clean doc-install doc-uninstall 89ifdef MAKECMDGOALS 90ifeq ($(filter-out $(NON_CHECK_FEAT_TARGETS),$(MAKECMDGOALS)),) 91 check_feat := 0 92endif 93endif 94 95ifeq ($(check_feat),1) 96ifeq ($(FEATURES_DUMP),) 97include $(srctree)/tools/build/Makefile.feature 98else 99include $(FEATURES_DUMP) 100endif 101endif 102 103ifeq ($(feature-disassembler-four-args), 1) 104CFLAGS += -DDISASM_FOUR_ARGS_SIGNATURE 105endif 106 107ifeq ($(feature-reallocarray), 0) 108CFLAGS += -DCOMPAT_NEED_REALLOCARRAY 109endif 110 111LIBS = $(LIBBPF) -lelf -lz 112LIBS_BOOTSTRAP = $(LIBBPF_BOOTSTRAP) -lelf -lz 113ifeq ($(feature-libcap), 1) 114CFLAGS += -DUSE_LIBCAP 115LIBS += -lcap 116endif 117 118include $(wildcard $(OUTPUT)*.d) 119 120all: $(OUTPUT)bpftool 121 122BFD_SRCS = jit_disasm.c 123 124SRCS = $(filter-out $(BFD_SRCS),$(wildcard *.c)) 125 126ifeq ($(feature-libbfd),1) 127 LIBS += -lbfd -ldl -lopcodes 128else ifeq ($(feature-libbfd-liberty),1) 129 LIBS += -lbfd -ldl -lopcodes -liberty 130else ifeq ($(feature-libbfd-liberty-z),1) 131 LIBS += -lbfd -ldl -lopcodes -liberty -lz 132endif 133 134ifneq ($(filter -lbfd,$(LIBS)),) 135CFLAGS += -DHAVE_LIBBFD_SUPPORT 136SRCS += $(BFD_SRCS) 137endif 138 139BPFTOOL_BOOTSTRAP := $(BOOTSTRAP_OUTPUT)bpftool 140 141BOOTSTRAP_OBJS = $(addprefix $(BOOTSTRAP_OUTPUT),main.o common.o json_writer.o gen.o btf.o) 142OBJS = $(patsubst %.c,$(OUTPUT)%.o,$(SRCS)) $(OUTPUT)disasm.o 143 144VMLINUX_BTF_PATHS ?= $(if $(O),$(O)/vmlinux) \ 145 $(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux) \ 146 ../../../vmlinux \ 147 /sys/kernel/btf/vmlinux \ 148 /boot/vmlinux-$(shell uname -r) 149VMLINUX_BTF ?= $(abspath $(firstword $(wildcard $(VMLINUX_BTF_PATHS)))) 150 151ifneq ($(VMLINUX_BTF)$(VMLINUX_H),) 152ifeq ($(feature-clang-bpf-co-re),1) 153 154BUILD_BPF_SKELS := 1 155 156$(OUTPUT)vmlinux.h: $(VMLINUX_BTF) $(BPFTOOL_BOOTSTRAP) 157ifeq ($(VMLINUX_H),) 158 $(QUIET_GEN)$(BPFTOOL_BOOTSTRAP) btf dump file $< format c > $@ 159else 160 $(Q)cp "$(VMLINUX_H)" $@ 161endif 162 163$(OUTPUT)%.bpf.o: skeleton/%.bpf.c $(OUTPUT)vmlinux.h $(LIBBPF) 164 $(QUIET_CLANG)$(CLANG) \ 165 -I$(if $(OUTPUT),$(OUTPUT),.) \ 166 -I$(srctree)/tools/include/uapi/ \ 167 -I$(LIBBPF_PATH) \ 168 -I$(srctree)/tools/lib \ 169 -g -O2 -target bpf -c $< -o $@ && $(LLVM_STRIP) -g $@ 170 171$(OUTPUT)%.skel.h: $(OUTPUT)%.bpf.o $(BPFTOOL_BOOTSTRAP) 172 $(QUIET_GEN)$(BPFTOOL_BOOTSTRAP) gen skeleton $< > $@ 173 174$(OUTPUT)prog.o: $(OUTPUT)profiler.skel.h 175 176$(OUTPUT)pids.o: $(OUTPUT)pid_iter.skel.h 177 178endif 179endif 180 181CFLAGS += $(if $(BUILD_BPF_SKELS),,-DBPFTOOL_WITHOUT_SKELETONS) 182 183$(OUTPUT)disasm.o: $(srctree)/kernel/bpf/disasm.c 184 $(QUIET_CC)$(CC) $(CFLAGS) -c -MMD -o $@ $< 185 186$(OUTPUT)feature.o: | zdep 187 188$(BPFTOOL_BOOTSTRAP): $(BOOTSTRAP_OBJS) $(LIBBPF_BOOTSTRAP) 189 $(QUIET_LINK)$(HOSTCC) $(CFLAGS) $(LDFLAGS) -o $@ $(BOOTSTRAP_OBJS) \ 190 $(LIBS_BOOTSTRAP) 191 192$(OUTPUT)bpftool: $(OBJS) $(LIBBPF) 193 $(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJS) $(LIBS) 194 195$(BOOTSTRAP_OUTPUT)%.o: %.c | $(BOOTSTRAP_OUTPUT) 196 $(QUIET_CC)$(HOSTCC) $(CFLAGS) -c -MMD -o $@ $< 197 198$(OUTPUT)%.o: %.c 199 $(QUIET_CC)$(CC) $(CFLAGS) -c -MMD -o $@ $< 200 201feature-detect-clean: 202 $(call QUIET_CLEAN, feature-detect) 203 $(Q)$(MAKE) -C $(srctree)/tools/build/feature/ clean >/dev/null 204 205clean: $(LIBBPF)-clean $(LIBBPF_BOOTSTRAP)-clean feature-detect-clean 206 $(call QUIET_CLEAN, bpftool) 207 $(Q)$(RM) -- $(OUTPUT)bpftool $(OUTPUT)*.o $(OUTPUT)*.d 208 $(Q)$(RM) -- $(OUTPUT)*.skel.h $(OUTPUT)vmlinux.h 209 $(Q)$(RM) -r -- $(LIBBPF_OUTPUT) $(BOOTSTRAP_OUTPUT) 210 $(call QUIET_CLEAN, core-gen) 211 $(Q)$(RM) -- $(OUTPUT)FEATURE-DUMP.bpftool 212 $(Q)$(RM) -r -- $(OUTPUT)feature/ 213 214install: $(OUTPUT)bpftool 215 $(call QUIET_INSTALL, bpftool) 216 $(Q)$(INSTALL) -m 0755 -d $(DESTDIR)$(prefix)/sbin 217 $(Q)$(INSTALL) $(OUTPUT)bpftool $(DESTDIR)$(prefix)/sbin/bpftool 218 $(Q)$(INSTALL) -m 0755 -d $(DESTDIR)$(bash_compdir) 219 $(Q)$(INSTALL) -m 0644 bash-completion/bpftool $(DESTDIR)$(bash_compdir) 220 221uninstall: 222 $(call QUIET_UNINST, bpftool) 223 $(Q)$(RM) -- $(DESTDIR)$(prefix)/sbin/bpftool 224 $(Q)$(RM) -- $(DESTDIR)$(bash_compdir)/bpftool 225 226doc: 227 $(call descend,Documentation) 228 229doc-clean: 230 $(call descend,Documentation,clean) 231 232doc-install: 233 $(call descend,Documentation,install) 234 235doc-uninstall: 236 $(call descend,Documentation,uninstall) 237 238FORCE: 239 240zdep: 241 @if [ "$(feature-zlib)" != "1" ]; then echo "No zlib found"; exit 1 ; fi 242 243.SECONDARY: 244.PHONY: all FORCE clean install uninstall zdep 245.PHONY: doc doc-clean doc-install doc-uninstall 246.DEFAULT_GOAL := all 247