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