1# SPDX-License-Identifier: GPL-2.0-only 2include ../../scripts/Makefile.include 3 4ifeq ($(srctree),) 5srctree := $(patsubst %/,%,$(dir $(CURDIR))) 6srctree := $(patsubst %/,%,$(dir $(srctree))) 7srctree := $(patsubst %/,%,$(dir $(srctree))) 8endif 9 10ifeq ($(V),1) 11 Q = 12else 13 Q = @ 14endif 15 16BPF_DIR = $(srctree)/tools/lib/bpf/ 17 18ifneq ($(OUTPUT),) 19 LIBBPF_OUTPUT = $(OUTPUT)/libbpf/ 20 LIBBPF_PATH = $(LIBBPF_OUTPUT) 21else 22 LIBBPF_PATH = $(BPF_DIR) 23endif 24 25LIBBPF = $(LIBBPF_PATH)libbpf.a 26 27BPFTOOL_VERSION := $(shell make -rR --no-print-directory -sC ../../.. kernelversion) 28 29$(LIBBPF): FORCE 30 $(if $(LIBBPF_OUTPUT),@mkdir -p $(LIBBPF_OUTPUT)) 31 $(Q)$(MAKE) -C $(BPF_DIR) OUTPUT=$(LIBBPF_OUTPUT) $(LIBBPF_OUTPUT)libbpf.a 32 33$(LIBBPF)-clean: 34 $(call QUIET_CLEAN, libbpf) 35 $(Q)$(MAKE) -C $(BPF_DIR) OUTPUT=$(LIBBPF_OUTPUT) clean >/dev/null 36 37prefix ?= /usr/local 38bash_compdir ?= /usr/share/bash-completion/completions 39 40CFLAGS += -O2 41CFLAGS += -W -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers 42CFLAGS += $(filter-out -Wswitch-enum,$(EXTRA_WARNINGS)) 43CFLAGS += -DPACKAGE='"bpftool"' -D__EXPORTED_HEADERS__ \ 44 -I$(srctree)/kernel/bpf/ \ 45 -I$(srctree)/tools/include \ 46 -I$(srctree)/tools/include/uapi \ 47 -I$(srctree)/tools/lib/bpf \ 48 -I$(srctree)/tools/perf 49CFLAGS += -DBPFTOOL_VERSION='"$(BPFTOOL_VERSION)"' 50ifneq ($(EXTRA_CFLAGS),) 51CFLAGS += $(EXTRA_CFLAGS) 52endif 53ifneq ($(EXTRA_LDFLAGS),) 54LDFLAGS += $(EXTRA_LDFLAGS) 55endif 56 57LIBS = $(LIBBPF) -lelf -lz 58 59INSTALL ?= install 60RM ?= rm -f 61 62FEATURE_USER = .bpftool 63FEATURE_TESTS = libbfd disassembler-four-args reallocarray zlib 64FEATURE_DISPLAY = libbfd disassembler-four-args zlib 65 66check_feat := 1 67NON_CHECK_FEAT_TARGETS := clean uninstall doc doc-clean doc-install doc-uninstall 68ifdef MAKECMDGOALS 69ifeq ($(filter-out $(NON_CHECK_FEAT_TARGETS),$(MAKECMDGOALS)),) 70 check_feat := 0 71endif 72endif 73 74ifeq ($(check_feat),1) 75ifeq ($(FEATURES_DUMP),) 76include $(srctree)/tools/build/Makefile.feature 77else 78include $(FEATURES_DUMP) 79endif 80endif 81 82ifeq ($(feature-disassembler-four-args), 1) 83CFLAGS += -DDISASM_FOUR_ARGS_SIGNATURE 84endif 85 86ifeq ($(feature-reallocarray), 0) 87CFLAGS += -DCOMPAT_NEED_REALLOCARRAY 88endif 89 90include $(wildcard $(OUTPUT)*.d) 91 92all: $(OUTPUT)bpftool 93 94BFD_SRCS = jit_disasm.c 95 96SRCS = $(filter-out $(BFD_SRCS),$(wildcard *.c)) 97 98ifeq ($(feature-libbfd),1) 99 LIBS += -lbfd -ldl -lopcodes 100else ifeq ($(feature-libbfd-liberty),1) 101 LIBS += -lbfd -ldl -lopcodes -liberty 102else ifeq ($(feature-libbfd-liberty-z),1) 103 LIBS += -lbfd -ldl -lopcodes -liberty -lz 104endif 105 106ifneq ($(filter -lbfd,$(LIBS)),) 107CFLAGS += -DHAVE_LIBBFD_SUPPORT 108SRCS += $(BFD_SRCS) 109endif 110 111OBJS = $(patsubst %.c,$(OUTPUT)%.o,$(SRCS)) $(OUTPUT)disasm.o 112 113$(OUTPUT)disasm.o: $(srctree)/kernel/bpf/disasm.c 114 $(QUIET_CC)$(COMPILE.c) -MMD -o $@ $< 115 116$(OUTPUT)feature.o: | zdep 117 118$(OUTPUT)bpftool: $(OBJS) $(LIBBPF) 119 $(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJS) $(LIBS) 120 121$(OUTPUT)%.o: %.c 122 $(QUIET_CC)$(COMPILE.c) -MMD -o $@ $< 123 124clean: $(LIBBPF)-clean 125 $(call QUIET_CLEAN, bpftool) 126 $(Q)$(RM) -- $(OUTPUT)bpftool $(OUTPUT)*.o $(OUTPUT)*.d 127 $(Q)$(RM) -r -- $(OUTPUT)libbpf/ 128 $(call QUIET_CLEAN, core-gen) 129 $(Q)$(RM) -- $(OUTPUT)FEATURE-DUMP.bpftool 130 $(Q)$(RM) -r -- $(OUTPUT)feature/ 131 132install: $(OUTPUT)bpftool 133 $(call QUIET_INSTALL, bpftool) 134 $(Q)$(INSTALL) -m 0755 -d $(DESTDIR)$(prefix)/sbin 135 $(Q)$(INSTALL) $(OUTPUT)bpftool $(DESTDIR)$(prefix)/sbin/bpftool 136 $(Q)$(INSTALL) -m 0755 -d $(DESTDIR)$(bash_compdir) 137 $(Q)$(INSTALL) -m 0644 bash-completion/bpftool $(DESTDIR)$(bash_compdir) 138 139uninstall: 140 $(call QUIET_UNINST, bpftool) 141 $(Q)$(RM) -- $(DESTDIR)$(prefix)/sbin/bpftool 142 $(Q)$(RM) -- $(DESTDIR)$(bash_compdir)/bpftool 143 144doc: 145 $(call descend,Documentation) 146 147doc-clean: 148 $(call descend,Documentation,clean) 149 150doc-install: 151 $(call descend,Documentation,install) 152 153doc-uninstall: 154 $(call descend,Documentation,uninstall) 155 156FORCE: 157 158zdep: 159 @if [ "$(feature-zlib)" != "1" ]; then echo "No zlib found"; exit 1 ; fi 160 161.PHONY: all FORCE clean install uninstall zdep 162.PHONY: doc doc-clean doc-install doc-uninstall 163.DEFAULT_GOAL := all 164