0001
0002 include ../../scripts/Makefile.include
0003
0004 ifeq ($(srctree),)
0005 srctree := $(patsubst %/,%,$(dir $(CURDIR)))
0006 srctree := $(patsubst %/,%,$(dir $(srctree)))
0007 srctree := $(patsubst %/,%,$(dir $(srctree)))
0008 endif
0009
0010 ifeq ($(V),1)
0011 Q =
0012 else
0013 Q = @
0014 endif
0015
0016 BPF_DIR = $(srctree)/tools/lib/bpf
0017
0018 ifneq ($(OUTPUT),)
0019 _OUTPUT := $(OUTPUT)
0020 else
0021 _OUTPUT := $(CURDIR)/
0022 endif
0023 BOOTSTRAP_OUTPUT := $(_OUTPUT)bootstrap/
0024
0025 LIBBPF_OUTPUT := $(_OUTPUT)libbpf/
0026 LIBBPF_DESTDIR := $(LIBBPF_OUTPUT)
0027 LIBBPF_INCLUDE := $(LIBBPF_DESTDIR)include
0028 LIBBPF_HDRS_DIR := $(LIBBPF_INCLUDE)/bpf
0029 LIBBPF := $(LIBBPF_OUTPUT)libbpf.a
0030
0031 LIBBPF_BOOTSTRAP_OUTPUT := $(BOOTSTRAP_OUTPUT)libbpf/
0032 LIBBPF_BOOTSTRAP_DESTDIR := $(LIBBPF_BOOTSTRAP_OUTPUT)
0033 LIBBPF_BOOTSTRAP_INCLUDE := $(LIBBPF_BOOTSTRAP_DESTDIR)include
0034 LIBBPF_BOOTSTRAP_HDRS_DIR := $(LIBBPF_BOOTSTRAP_INCLUDE)/bpf
0035 LIBBPF_BOOTSTRAP := $(LIBBPF_BOOTSTRAP_OUTPUT)libbpf.a
0036
0037
0038
0039 LIBBPF_INTERNAL_HDRS := $(addprefix $(LIBBPF_HDRS_DIR)/,hashmap.h nlattr.h relo_core.h libbpf_internal.h)
0040 LIBBPF_BOOTSTRAP_INTERNAL_HDRS := $(addprefix $(LIBBPF_BOOTSTRAP_HDRS_DIR)/,hashmap.h relo_core.h libbpf_internal.h)
0041
0042 $(LIBBPF_OUTPUT) $(BOOTSTRAP_OUTPUT) $(LIBBPF_BOOTSTRAP_OUTPUT) $(LIBBPF_HDRS_DIR) $(LIBBPF_BOOTSTRAP_HDRS_DIR):
0043 $(QUIET_MKDIR)mkdir -p $@
0044
0045 $(LIBBPF): $(wildcard $(BPF_DIR)/*.[ch] $(BPF_DIR)/Makefile) | $(LIBBPF_OUTPUT)
0046 $(Q)$(MAKE) -C $(BPF_DIR) OUTPUT=$(LIBBPF_OUTPUT) \
0047 DESTDIR=$(LIBBPF_DESTDIR:/=) prefix= $(LIBBPF) install_headers
0048
0049 $(LIBBPF_INTERNAL_HDRS): $(LIBBPF_HDRS_DIR)/%.h: $(BPF_DIR)/%.h | $(LIBBPF_HDRS_DIR)
0050 $(call QUIET_INSTALL, $@)
0051 $(Q)install -m 644 -t $(LIBBPF_HDRS_DIR) $<
0052
0053 $(LIBBPF_BOOTSTRAP): $(wildcard $(BPF_DIR)/*.[ch] $(BPF_DIR)/Makefile) | $(LIBBPF_BOOTSTRAP_OUTPUT)
0054 $(Q)$(MAKE) -C $(BPF_DIR) OUTPUT=$(LIBBPF_BOOTSTRAP_OUTPUT) \
0055 DESTDIR=$(LIBBPF_BOOTSTRAP_DESTDIR:/=) prefix= \
0056 ARCH= CROSS_COMPILE= CC=$(HOSTCC) LD=$(HOSTLD) AR=$(HOSTAR) $@ install_headers
0057
0058 $(LIBBPF_BOOTSTRAP_INTERNAL_HDRS): $(LIBBPF_BOOTSTRAP_HDRS_DIR)/%.h: $(BPF_DIR)/%.h | $(LIBBPF_BOOTSTRAP_HDRS_DIR)
0059 $(call QUIET_INSTALL, $@)
0060 $(Q)install -m 644 -t $(LIBBPF_BOOTSTRAP_HDRS_DIR) $<
0061
0062 $(LIBBPF)-clean: FORCE | $(LIBBPF_OUTPUT)
0063 $(call QUIET_CLEAN, libbpf)
0064 $(Q)$(MAKE) -C $(BPF_DIR) OUTPUT=$(LIBBPF_OUTPUT) clean >/dev/null
0065
0066 $(LIBBPF_BOOTSTRAP)-clean: FORCE | $(LIBBPF_BOOTSTRAP_OUTPUT)
0067 $(call QUIET_CLEAN, libbpf-bootstrap)
0068 $(Q)$(MAKE) -C $(BPF_DIR) OUTPUT=$(LIBBPF_BOOTSTRAP_OUTPUT) clean >/dev/null
0069
0070 prefix ?= /usr/local
0071 bash_compdir ?= /usr/share/bash-completion/completions
0072
0073 CFLAGS += -O2
0074 CFLAGS += -W -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers
0075 CFLAGS += $(filter-out -Wswitch-enum -Wnested-externs,$(EXTRA_WARNINGS))
0076 CFLAGS += -DPACKAGE='"bpftool"' -D__EXPORTED_HEADERS__ \
0077 -I$(or $(OUTPUT),.) \
0078 -I$(LIBBPF_INCLUDE) \
0079 -I$(srctree)/kernel/bpf/ \
0080 -I$(srctree)/tools/include \
0081 -I$(srctree)/tools/include/uapi
0082 ifneq ($(BPFTOOL_VERSION),)
0083 CFLAGS += -DBPFTOOL_VERSION='"$(BPFTOOL_VERSION)"'
0084 endif
0085 ifneq ($(EXTRA_CFLAGS),)
0086 CFLAGS += $(EXTRA_CFLAGS)
0087 endif
0088 ifneq ($(EXTRA_LDFLAGS),)
0089 LDFLAGS += $(EXTRA_LDFLAGS)
0090 endif
0091
0092 INSTALL ?= install
0093 RM ?= rm -f
0094
0095 FEATURE_USER = .bpftool
0096 FEATURE_TESTS = libbfd libbfd-liberty libbfd-liberty-z \
0097 disassembler-four-args disassembler-init-styled libcap \
0098 clang-bpf-co-re
0099 FEATURE_DISPLAY = libbfd libbfd-liberty libbfd-liberty-z \
0100 libcap clang-bpf-co-re
0101
0102 check_feat := 1
0103 NON_CHECK_FEAT_TARGETS := clean uninstall doc doc-clean doc-install doc-uninstall
0104 ifdef MAKECMDGOALS
0105 ifeq ($(filter-out $(NON_CHECK_FEAT_TARGETS),$(MAKECMDGOALS)),)
0106 check_feat := 0
0107 endif
0108 endif
0109
0110 ifeq ($(check_feat),1)
0111 ifeq ($(FEATURES_DUMP),)
0112 include $(srctree)/tools/build/Makefile.feature
0113 else
0114 include $(FEATURES_DUMP)
0115 endif
0116 endif
0117
0118 ifeq ($(feature-disassembler-four-args), 1)
0119 CFLAGS += -DDISASM_FOUR_ARGS_SIGNATURE
0120 endif
0121 ifeq ($(feature-disassembler-init-styled), 1)
0122 CFLAGS += -DDISASM_INIT_STYLED
0123 endif
0124
0125 LIBS = $(LIBBPF) -lelf -lz
0126 LIBS_BOOTSTRAP = $(LIBBPF_BOOTSTRAP) -lelf -lz
0127 ifeq ($(feature-libcap), 1)
0128 CFLAGS += -DUSE_LIBCAP
0129 LIBS += -lcap
0130 endif
0131
0132 include $(wildcard $(OUTPUT)*.d)
0133
0134 all: $(OUTPUT)bpftool
0135
0136 BFD_SRCS = jit_disasm.c
0137
0138 SRCS = $(filter-out $(BFD_SRCS),$(wildcard *.c))
0139
0140 ifeq ($(feature-libbfd),1)
0141 LIBS += -lbfd -ldl -lopcodes
0142 else ifeq ($(feature-libbfd-liberty),1)
0143 LIBS += -lbfd -ldl -lopcodes -liberty
0144 else ifeq ($(feature-libbfd-liberty-z),1)
0145 LIBS += -lbfd -ldl -lopcodes -liberty -lz
0146 endif
0147
0148 ifneq ($(filter -lbfd,$(LIBS)),)
0149 CFLAGS += -DHAVE_LIBBFD_SUPPORT
0150 SRCS += $(BFD_SRCS)
0151 endif
0152
0153 HOST_CFLAGS = $(subst -I$(LIBBPF_INCLUDE),-I$(LIBBPF_BOOTSTRAP_INCLUDE),\
0154 $(subst $(CLANG_CROSS_FLAGS),,$(CFLAGS)))
0155
0156 BPFTOOL_BOOTSTRAP := $(BOOTSTRAP_OUTPUT)bpftool
0157
0158 BOOTSTRAP_OBJS = $(addprefix $(BOOTSTRAP_OUTPUT),main.o common.o json_writer.o gen.o btf.o xlated_dumper.o btf_dumper.o disasm.o)
0159 $(BOOTSTRAP_OBJS): $(LIBBPF_BOOTSTRAP)
0160
0161 OBJS = $(patsubst %.c,$(OUTPUT)%.o,$(SRCS)) $(OUTPUT)disasm.o
0162 $(OBJS): $(LIBBPF) $(LIBBPF_INTERNAL_HDRS)
0163
0164 VMLINUX_BTF_PATHS ?= $(if $(O),$(O)/vmlinux) \
0165 $(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux) \
0166 ../../../vmlinux \
0167 /sys/kernel/btf/vmlinux \
0168 /boot/vmlinux-$(shell uname -r)
0169 VMLINUX_BTF ?= $(abspath $(firstword $(wildcard $(VMLINUX_BTF_PATHS))))
0170
0171 bootstrap: $(BPFTOOL_BOOTSTRAP)
0172
0173 ifneq ($(VMLINUX_BTF)$(VMLINUX_H),)
0174 ifeq ($(feature-clang-bpf-co-re),1)
0175
0176 BUILD_BPF_SKELS := 1
0177
0178 $(OUTPUT)vmlinux.h: $(VMLINUX_BTF) $(BPFTOOL_BOOTSTRAP)
0179 ifeq ($(VMLINUX_H),)
0180 $(QUIET_GEN)$(BPFTOOL_BOOTSTRAP) btf dump file $< format c > $@
0181 else
0182 $(Q)cp "$(VMLINUX_H)" $@
0183 endif
0184
0185 $(OUTPUT)%.bpf.o: skeleton/%.bpf.c $(OUTPUT)vmlinux.h $(LIBBPF_BOOTSTRAP)
0186 $(QUIET_CLANG)$(CLANG) \
0187 -I$(or $(OUTPUT),.) \
0188 -I$(srctree)/tools/include/uapi/ \
0189 -I$(LIBBPF_BOOTSTRAP_INCLUDE) \
0190 -g -O2 -Wall -target bpf -c $< -o $@
0191 $(Q)$(LLVM_STRIP) -g $@
0192
0193 $(OUTPUT)%.skel.h: $(OUTPUT)%.bpf.o $(BPFTOOL_BOOTSTRAP)
0194 $(QUIET_GEN)$(BPFTOOL_BOOTSTRAP) gen skeleton $< > $@
0195
0196 $(OUTPUT)prog.o: $(OUTPUT)profiler.skel.h
0197
0198 $(OUTPUT)pids.o: $(OUTPUT)pid_iter.skel.h
0199
0200 endif
0201 endif
0202
0203 CFLAGS += $(if $(BUILD_BPF_SKELS),,-DBPFTOOL_WITHOUT_SKELETONS)
0204
0205 $(BOOTSTRAP_OUTPUT)disasm.o: $(srctree)/kernel/bpf/disasm.c
0206 $(QUIET_CC)$(HOSTCC) $(HOST_CFLAGS) -c -MMD $< -o $@
0207
0208 $(OUTPUT)disasm.o: $(srctree)/kernel/bpf/disasm.c
0209 $(QUIET_CC)$(CC) $(CFLAGS) -c -MMD $< -o $@
0210
0211 $(BPFTOOL_BOOTSTRAP): $(BOOTSTRAP_OBJS) $(LIBBPF_BOOTSTRAP)
0212 $(QUIET_LINK)$(HOSTCC) $(HOST_CFLAGS) $(LDFLAGS) $(BOOTSTRAP_OBJS) $(LIBS_BOOTSTRAP) -o $@
0213
0214 $(OUTPUT)bpftool: $(OBJS) $(LIBBPF)
0215 $(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) $(LIBS) -o $@
0216
0217 $(BOOTSTRAP_OUTPUT)%.o: %.c $(LIBBPF_BOOTSTRAP_INTERNAL_HDRS) | $(BOOTSTRAP_OUTPUT)
0218 $(QUIET_CC)$(HOSTCC) $(HOST_CFLAGS) -c -MMD $< -o $@
0219
0220 $(OUTPUT)%.o: %.c
0221 $(QUIET_CC)$(CC) $(CFLAGS) -c -MMD $< -o $@
0222
0223 feature-detect-clean:
0224 $(call QUIET_CLEAN, feature-detect)
0225 $(Q)$(MAKE) -C $(srctree)/tools/build/feature/ clean >/dev/null
0226
0227 clean: $(LIBBPF)-clean $(LIBBPF_BOOTSTRAP)-clean feature-detect-clean
0228 $(call QUIET_CLEAN, bpftool)
0229 $(Q)$(RM) -- $(OUTPUT)bpftool $(OUTPUT)*.o $(OUTPUT)*.d
0230 $(Q)$(RM) -- $(OUTPUT)*.skel.h $(OUTPUT)vmlinux.h
0231 $(Q)$(RM) -r -- $(LIBBPF_OUTPUT) $(BOOTSTRAP_OUTPUT)
0232 $(call QUIET_CLEAN, core-gen)
0233 $(Q)$(RM) -- $(OUTPUT)FEATURE-DUMP.bpftool
0234 $(Q)$(RM) -r -- $(OUTPUT)feature/
0235
0236 install-bin: $(OUTPUT)bpftool
0237 $(call QUIET_INSTALL, bpftool)
0238 $(Q)$(INSTALL) -m 0755 -d $(DESTDIR)$(prefix)/sbin
0239 $(Q)$(INSTALL) $(OUTPUT)bpftool $(DESTDIR)$(prefix)/sbin/bpftool
0240
0241 install: install-bin
0242 $(Q)$(INSTALL) -m 0755 -d $(DESTDIR)$(bash_compdir)
0243 $(Q)$(INSTALL) -m 0644 bash-completion/bpftool $(DESTDIR)$(bash_compdir)
0244
0245 uninstall:
0246 $(call QUIET_UNINST, bpftool)
0247 $(Q)$(RM) -- $(DESTDIR)$(prefix)/sbin/bpftool
0248 $(Q)$(RM) -- $(DESTDIR)$(bash_compdir)/bpftool
0249
0250 doc:
0251 $(call descend,Documentation)
0252
0253 doc-clean:
0254 $(call descend,Documentation,clean)
0255
0256 doc-install:
0257 $(call descend,Documentation,install)
0258
0259 doc-uninstall:
0260 $(call descend,Documentation,uninstall)
0261
0262 FORCE:
0263
0264 .SECONDARY:
0265 .PHONY: all FORCE bootstrap clean install-bin install uninstall
0266 .PHONY: doc doc-clean doc-install doc-uninstall
0267 .DEFAULT_GOAL := all