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