Back to home page

OSCL-LXR

 
 

    


0001 # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
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 # We need to copy hashmap.h, nlattr.h, relo_core.h and libbpf_internal.h
0038 # which are not otherwise exported by libbpf, but still required by bpftool.
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