| 1 |
|
| 2 | include ../../scripts/Makefile.include
|
| 3 |
|
| 4 | ifeq ($(srctree),)
|
| 5 | srctree := $(patsubst %/,%,$(dir $(CURDIR)))
|
| 6 | srctree := $(patsubst %/,%,$(dir $(srctree)))
|
| 7 | srctree := $(patsubst %/,%,$(dir $(srctree)))
|
| 8 | endif
|
| 9 |
|
| 10 | BPF_DIR = $(srctree)/tools/lib/bpf
|
| 11 |
|
| 12 | ifneq ($(OUTPUT),)
|
| 13 | _OUTPUT := $(OUTPUT)
|
| 14 | else
|
| 15 | _OUTPUT := $(CURDIR)/
|
| 16 | endif
|
| 17 | BOOTSTRAP_OUTPUT := $(_OUTPUT)bootstrap/
|
| 18 |
|
| 19 | LIBBPF_OUTPUT := $(_OUTPUT)libbpf/
|
| 20 | LIBBPF_DESTDIR := $(LIBBPF_OUTPUT)
|
| 21 | LIBBPF_INCLUDE := $(LIBBPF_DESTDIR)include
|
| 22 | LIBBPF_HDRS_DIR := $(LIBBPF_INCLUDE)/bpf
|
| 23 | LIBBPF := $(LIBBPF_OUTPUT)libbpf.a
|
| 24 |
|
| 25 | LIBBPF_BOOTSTRAP_OUTPUT := $(BOOTSTRAP_OUTPUT)libbpf/
|
| 26 | LIBBPF_BOOTSTRAP_DESTDIR := $(LIBBPF_BOOTSTRAP_OUTPUT)
|
| 27 | LIBBPF_BOOTSTRAP_INCLUDE := $(LIBBPF_BOOTSTRAP_DESTDIR)include
|
| 28 | LIBBPF_BOOTSTRAP_HDRS_DIR := $(LIBBPF_BOOTSTRAP_INCLUDE)/bpf
|
| 29 | LIBBPF_BOOTSTRAP := $(LIBBPF_BOOTSTRAP_OUTPUT)libbpf.a
|
| 30 |
|
| 31 |
|
| 32 |
|
| 33 | LIBBPF_INTERNAL_HDRS := $(addprefix $(LIBBPF_HDRS_DIR)/,hashmap.h nlattr.h relo_core.h libbpf_internal.h)
|
| 34 | LIBBPF_BOOTSTRAP_INTERNAL_HDRS := $(addprefix $(LIBBPF_BOOTSTRAP_HDRS_DIR)/,hashmap.h relo_core.h libbpf_internal.h)
|
| 35 |
|
| 36 | $(LIBBPF_OUTPUT) $(BOOTSTRAP_OUTPUT) $(LIBBPF_BOOTSTRAP_OUTPUT) $(LIBBPF_HDRS_DIR) $(LIBBPF_BOOTSTRAP_HDRS_DIR):
|
| 37 | $(QUIET_MKDIR)mkdir -p $@
|
| 38 |
|
| 39 | $(LIBBPF): $(wildcard $(BPF_DIR)/*.[ch] $(BPF_DIR)/Makefile) | $(LIBBPF_OUTPUT)
|
| 40 | $(Q)$(MAKE) -C $(BPF_DIR) OUTPUT=$(LIBBPF_OUTPUT) \
|
| 41 | DESTDIR=$(LIBBPF_DESTDIR:/=) prefix= $(LIBBPF) install_headers
|
| 42 |
|
| 43 | $(LIBBPF_INTERNAL_HDRS): $(LIBBPF_HDRS_DIR)/%.h: $(BPF_DIR)/%.h | $(LIBBPF_HDRS_DIR)
|
| 44 | $(call QUIET_INSTALL, $@)
|
| 45 | $(Q)install -m 644 -t $(LIBBPF_HDRS_DIR) $<
|
| 46 |
|
| 47 | $(LIBBPF_BOOTSTRAP): $(wildcard $(BPF_DIR)/*.[ch] $(BPF_DIR)/Makefile) | $(LIBBPF_BOOTSTRAP_OUTPUT)
|
| 48 | $(Q)$(MAKE) -C $(BPF_DIR) OUTPUT=$(LIBBPF_BOOTSTRAP_OUTPUT) \
|
| 49 | DESTDIR=$(LIBBPF_BOOTSTRAP_DESTDIR:/=) prefix= \
|
| 50 | ARCH= CROSS_COMPILE= CC="$(HOSTCC)" LD="$(HOSTLD)" AR="$(HOSTAR)" \
|
| 51 | CFLAGS="$(LIBBPF_BOOTSTRAP_CFLAGS)" EXTRA_CFLAGS= $@ install_headers
|
| 52 |
|
| 53 | $(LIBBPF_BOOTSTRAP_INTERNAL_HDRS): $(LIBBPF_BOOTSTRAP_HDRS_DIR)/%.h: $(BPF_DIR)/%.h | $(LIBBPF_BOOTSTRAP_HDRS_DIR)
|
| 54 | $(call QUIET_INSTALL, $@)
|
| 55 | $(Q)install -m 644 -t $(LIBBPF_BOOTSTRAP_HDRS_DIR) $<
|
| 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 |
|
| 65 | prefix ?= /usr/local
|
| 66 | bash_compdir ?= /usr/share/bash-completion/completions
|
| 67 |
|
| 68 | CFLAGS += -O2
|
| 69 | CFLAGS += -W
|
| 70 | CFLAGS += -Wall
|
| 71 | CFLAGS += -Wextra
|
| 72 | CFLAGS += -Wformat-signedness
|
| 73 | CFLAGS += -Wno-unused-parameter
|
| 74 | CFLAGS += -Wno-missing-field-initializers
|
| 75 | CFLAGS += $(filter-out -Wswitch-enum -Wnested-externs,$(EXTRA_WARNINGS))
|
| 76 | CFLAGS += -DPACKAGE='"bpftool"' -D__EXPORTED_HEADERS__ \
|
| 77 | -I$(or $(OUTPUT),.) \
|
| 78 | -I$(LIBBPF_INCLUDE) \
|
| 79 | -I$(srctree)/kernel/bpf/ \
|
| 80 | -I$(srctree)/tools/include \
|
| 81 | -I$(srctree)/tools/include/uapi
|
| 82 | ifneq ($(BPFTOOL_VERSION),)
|
| 83 | CFLAGS += -DBPFTOOL_VERSION='"$(BPFTOOL_VERSION)"'
|
| 84 | endif
|
| 85 |
|
| 86 |
|
| 87 |
|
| 88 | HOST_CFLAGS := $(subst -I$(LIBBPF_INCLUDE),-I$(LIBBPF_BOOTSTRAP_INCLUDE),\
|
| 89 | $(subst $(CLANG_CROSS_FLAGS),,$(CFLAGS)))
|
| 90 | HOST_CFLAGS += $(HOST_EXTRACFLAGS)
|
| 91 |
|
| 92 | ifneq ($(EXTRA_CFLAGS),)
|
| 93 | CFLAGS += $(EXTRA_CFLAGS)
|
| 94 | endif
|
| 95 | ifneq ($(EXTRA_LDFLAGS),)
|
| 96 | LDFLAGS += $(EXTRA_LDFLAGS)
|
| 97 | endif
|
| 98 |
|
| 99 | HOST_LDFLAGS := $(LDFLAGS)
|
| 100 |
|
| 101 |
|
| 102 | LIBBPF_BOOTSTRAP_CFLAGS := $(filter-out -W -Wall -Wextra -Wformat%,$(HOST_CFLAGS))
|
| 103 |
|
| 104 | INSTALL ?= install
|
| 105 | RM ?= rm -f
|
| 106 |
|
| 107 | FEATURE_USER = .bpftool
|
| 108 |
|
| 109 |
|
| 110 |
|
| 111 | SKIP_LLVM ?=
|
| 112 | SKIP_LIBBFD ?=
|
| 113 | SKIP_CRYPTO ?=
|
| 114 | ifneq ($(SKIP_CRYPTO),1)
|
| 115 | CRYPTO_LIBS := -lcrypto
|
| 116 | endif
|
| 117 |
|
| 118 | ifeq ($(MAKECMDGOALS),bootstrap)
|
| 119 | FEATURE_TESTS := libelf-zstd
|
| 120 | FEATURE_DISPLAY :=
|
| 121 | else
|
| 122 | FEATURE_TESTS := clang-bpf-co-re
|
| 123 | FEATURE_TESTS += llvm
|
| 124 | FEATURE_TESTS += libcap
|
| 125 | FEATURE_TESTS += libbfd
|
| 126 | FEATURE_TESTS += libbfd-liberty
|
| 127 | FEATURE_TESTS += libbfd-liberty-z
|
| 128 | FEATURE_TESTS += disassembler-four-args
|
| 129 | FEATURE_TESTS += disassembler-init-styled
|
| 130 | FEATURE_TESTS += libelf-zstd
|
| 131 |
|
| 132 | FEATURE_DISPLAY := clang-bpf-co-re
|
| 133 | FEATURE_DISPLAY += llvm
|
| 134 | FEATURE_DISPLAY += libcap
|
| 135 | FEATURE_DISPLAY += libbfd
|
| 136 | FEATURE_DISPLAY += libbfd-liberty
|
| 137 | FEATURE_DISPLAY += libbfd-liberty-z
|
| 138 | endif
|
| 139 |
|
| 140 | check_feat := 1
|
| 141 | NON_CHECK_FEAT_TARGETS := clean uninstall doc doc-clean doc-install doc-uninstall
|
| 142 | ifdef MAKECMDGOALS
|
| 143 | ifeq ($(filter-out $(NON_CHECK_FEAT_TARGETS),$(MAKECMDGOALS)),)
|
| 144 | check_feat := 0
|
| 145 | endif
|
| 146 | endif
|
| 147 |
|
| 148 | ifeq ($(check_feat),1)
|
| 149 | ifeq ($(FEATURES_DUMP),)
|
| 150 | include $(srctree)/tools/build/Makefile.feature
|
| 151 | else
|
| 152 | include $(FEATURES_DUMP)
|
| 153 | endif
|
| 154 | endif
|
| 155 |
|
| 156 | LIBS = $(LIBBPF) -lelf $(CRYPTO_LIBS) -lz
|
| 157 | LIBS_BOOTSTRAP = $(LIBBPF_BOOTSTRAP) -lelf $(CRYPTO_LIBS) -lz
|
| 158 |
|
| 159 | ifeq ($(feature-libelf-zstd),1)
|
| 160 | LIBS += -lzstd
|
| 161 | LIBS_BOOTSTRAP += -lzstd
|
| 162 | endif
|
| 163 |
|
| 164 | ifeq ($(feature-libcap), 1)
|
| 165 | CFLAGS += -DUSE_LIBCAP
|
| 166 | LIBS += -lcap
|
| 167 | endif
|
| 168 |
|
| 169 | include $(wildcard $(OUTPUT)*.d)
|
| 170 |
|
| 171 | all: $(OUTPUT)bpftool
|
| 172 |
|
| 173 | SRCS := $(wildcard *.c)
|
| 174 |
|
| 175 | ifeq ($(feature-llvm),1)
|
| 176 | ifneq ($(SKIP_LLVM),1)
|
| 177 | HAS_LLVM := 1
|
| 178 | endif
|
| 179 | endif
|
| 180 |
|
| 181 | ifeq ($(HAS_LLVM),1)
|
| 182 | CFLAGS += -DHAVE_LLVM_SUPPORT
|
| 183 | LLVM_CONFIG_LIB_COMPONENTS := mcdisassembler all-targets
|
| 184 |
|
| 185 |
|
| 186 |
|
| 187 |
|
| 188 | CFLAGS += $(filter-out -D_GNU_SOURCE,$(shell $(LLVM_CONFIG) --cflags))
|
| 189 | LIBS += $(shell $(LLVM_CONFIG) --libs $(LLVM_CONFIG_LIB_COMPONENTS))
|
| 190 | ifeq ($(shell $(LLVM_CONFIG) --shared-mode),static)
|
| 191 | LIBS += $(shell $(LLVM_CONFIG) --system-libs $(LLVM_CONFIG_LIB_COMPONENTS))
|
| 192 | LIBS += -lstdc++
|
| 193 | endif
|
| 194 | LDFLAGS += $(shell $(LLVM_CONFIG) --ldflags)
|
| 195 | else
|
| 196 | ifneq ($(SKIP_LIBBFD),1)
|
| 197 |
|
| 198 | ifeq ($(feature-libbfd),1)
|
| 199 | LIBS += -lbfd -ldl -lopcodes
|
| 200 | else ifeq ($(feature-libbfd-liberty),1)
|
| 201 | LIBS += -lbfd -ldl -lopcodes -liberty
|
| 202 | else ifeq ($(feature-libbfd-liberty-z),1)
|
| 203 | LIBS += -lbfd -ldl -lopcodes -liberty -lz
|
| 204 | endif
|
| 205 |
|
| 206 |
|
| 207 | ifneq ($(filter -lbfd,$(LIBS)),)
|
| 208 | CFLAGS += -DHAVE_LIBBFD_SUPPORT
|
| 209 |
|
| 210 |
|
| 211 | ifeq ($(feature-disassembler-four-args), 1)
|
| 212 | CFLAGS += -DDISASM_FOUR_ARGS_SIGNATURE
|
| 213 | endif
|
| 214 | ifeq ($(feature-disassembler-init-styled), 1)
|
| 215 | CFLAGS += -DDISASM_INIT_STYLED
|
| 216 | endif
|
| 217 | endif
|
| 218 | endif
|
| 219 | endif
|
| 220 | ifeq ($(filter -DHAVE_LLVM_SUPPORT -DHAVE_LIBBFD_SUPPORT,$(CFLAGS)),)
|
| 221 |
|
| 222 | SRCS := $(filter-out jit_disasm.c,$(SRCS))
|
| 223 | endif
|
| 224 |
|
| 225 | ifeq ($(SKIP_CRYPTO),1)
|
| 226 | CFLAGS += -DBPFTOOL_WITHOUT_CRYPTO
|
| 227 | HOST_CFLAGS += -DBPFTOOL_WITHOUT_CRYPTO
|
| 228 | SRCS := $(filter-out sign.c,$(SRCS))
|
| 229 | endif
|
| 230 |
|
| 231 | BPFTOOL_BOOTSTRAP := $(BOOTSTRAP_OUTPUT)bpftool
|
| 232 |
|
| 233 | BOOTSTRAP_OBJS = $(addprefix $(BOOTSTRAP_OUTPUT),main.o common.o json_writer.o gen.o btf.o $(if $(CRYPTO_LIBS),sign.o))
|
| 234 | $(BOOTSTRAP_OBJS): $(LIBBPF_BOOTSTRAP)
|
| 235 |
|
| 236 | OBJS = $(patsubst %.c,$(OUTPUT)%.o,$(SRCS)) $(OUTPUT)disasm.o
|
| 237 | $(OBJS): $(LIBBPF) $(LIBBPF_INTERNAL_HDRS)
|
| 238 |
|
| 239 | VMLINUX_BTF_PATHS ?= $(if $(O),$(O)/vmlinux) \
|
| 240 | $(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux) \
|
| 241 | ../../../vmlinux \
|
| 242 | /sys/kernel/btf/vmlinux \
|
| 243 | /boot/vmlinux-$(shell uname -r)
|
| 244 | VMLINUX_BTF ?= $(abspath $(firstword $(wildcard $(VMLINUX_BTF_PATHS))))
|
| 245 |
|
| 246 | bootstrap: $(BPFTOOL_BOOTSTRAP)
|
| 247 |
|
| 248 | ifneq ($(VMLINUX_BTF)$(VMLINUX_H),)
|
| 249 | ifeq ($(feature-clang-bpf-co-re),1)
|
| 250 |
|
| 251 | BUILD_BPF_SKELS := 1
|
| 252 |
|
| 253 | ifeq ($(VMLINUX_H),)
|
| 254 | $(OUTPUT)vmlinux.h: $(VMLINUX_BTF) $(BPFTOOL_BOOTSTRAP)
|
| 255 | $(QUIET_GEN)$(BPFTOOL_BOOTSTRAP) btf dump file $< format c > $@
|
| 256 | else
|
| 257 | $(OUTPUT)vmlinux.h: $(VMLINUX_H)
|
| 258 | $(Q)cp "$(VMLINUX_H)" $@
|
| 259 | endif
|
| 260 |
|
| 261 | $(OUTPUT)%.bpf.o: skeleton/%.bpf.c $(OUTPUT)vmlinux.h $(LIBBPF_BOOTSTRAP)
|
| 262 | $(QUIET_CLANG)$(CLANG) \
|
| 263 | -Wno-microsoft-anon-tag \
|
| 264 | -fms-extensions \
|
| 265 | -I$(or $(OUTPUT),.) \
|
| 266 | -I$(srctree)/tools/include/uapi/ \
|
| 267 | -I$(LIBBPF_BOOTSTRAP_INCLUDE) \
|
| 268 | -g -O2 -Wall -fno-stack-protector \
|
| 269 | --target=bpf -c $< -o $@
|
| 270 | $(Q)$(LLVM_STRIP) -g $@
|
| 271 |
|
| 272 | $(OUTPUT)%.skel.h: $(OUTPUT)%.bpf.o $(BPFTOOL_BOOTSTRAP)
|
| 273 | $(QUIET_GEN)$(BPFTOOL_BOOTSTRAP) gen skeleton $< > $@
|
| 274 |
|
| 275 | $(OUTPUT)prog.o: $(OUTPUT)profiler.skel.h
|
| 276 |
|
| 277 | $(OUTPUT)pids.o: $(OUTPUT)pid_iter.skel.h
|
| 278 |
|
| 279 | endif
|
| 280 | endif
|
| 281 |
|
| 282 | CFLAGS += $(if $(BUILD_BPF_SKELS),,-DBPFTOOL_WITHOUT_SKELETONS)
|
| 283 |
|
| 284 | $(OUTPUT)disasm.o: $(srctree)/kernel/bpf/disasm.c
|
| 285 | $(QUIET_CC)$(CC) $(CFLAGS) -c -MMD $< -o $@
|
| 286 |
|
| 287 | $(BPFTOOL_BOOTSTRAP): $(BOOTSTRAP_OBJS) $(LIBBPF_BOOTSTRAP)
|
| 288 | $(QUIET_LINK)$(HOSTCC) $(HOST_CFLAGS) $(HOST_LDFLAGS) $(BOOTSTRAP_OBJS) $(LIBS_BOOTSTRAP) -o $@
|
| 289 |
|
| 290 | $(OUTPUT)bpftool: $(OBJS) $(LIBBPF)
|
| 291 | $(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) $(LIBS) -o $@
|
| 292 |
|
| 293 | $(BOOTSTRAP_OUTPUT)%.o: %.c $(LIBBPF_BOOTSTRAP_INTERNAL_HDRS) | $(BOOTSTRAP_OUTPUT)
|
| 294 | $(QUIET_CC)$(HOSTCC) $(HOST_CFLAGS) -c -MMD $< -o $@
|
| 295 |
|
| 296 | $(OUTPUT)%.o: %.c
|
| 297 | $(QUIET_CC)$(CC) $(CFLAGS) -c -MMD $< -o $@
|
| 298 |
|
| 299 | feature-detect-clean:
|
| 300 | $(call QUIET_CLEAN, feature-detect)
|
| 301 | $(Q)$(MAKE) -C $(srctree)/tools/build/feature/ clean >/dev/null
|
| 302 |
|
| 303 | clean: $(LIBBPF)-clean $(LIBBPF_BOOTSTRAP)-clean feature-detect-clean
|
| 304 | $(call QUIET_CLEAN, bpftool)
|
| 305 | $(Q)$(RM) -- $(OUTPUT)bpftool $(OUTPUT)*.o $(OUTPUT)*.d
|
| 306 | $(Q)$(RM) -- $(OUTPUT)*.skel.h $(OUTPUT)vmlinux.h
|
| 307 | $(Q)$(RM) -r -- $(LIBBPF_OUTPUT) $(BOOTSTRAP_OUTPUT)
|
| 308 | $(call QUIET_CLEAN, core-gen)
|
| 309 | $(Q)$(RM) -- $(OUTPUT)FEATURE-DUMP.bpftool
|
| 310 | $(Q)$(RM) -r -- $(OUTPUT)feature/
|
| 311 |
|
| 312 | install-bin: $(OUTPUT)bpftool
|
| 313 | $(call QUIET_INSTALL, bpftool)
|
| 314 | $(Q)$(INSTALL) -m 0755 -d $(DESTDIR)$(prefix)/sbin
|
| 315 | $(Q)$(INSTALL) $(OUTPUT)bpftool $(DESTDIR)$(prefix)/sbin/bpftool
|
| 316 |
|
| 317 | install: install-bin
|
| 318 | $(Q)$(INSTALL) -m 0755 -d $(DESTDIR)$(bash_compdir)
|
| 319 | $(Q)$(INSTALL) -m 0644 bash-completion/bpftool $(DESTDIR)$(bash_compdir)
|
| 320 |
|
| 321 | uninstall:
|
| 322 | $(call QUIET_UNINST, bpftool)
|
| 323 | $(Q)$(RM) -- $(DESTDIR)$(prefix)/sbin/bpftool
|
| 324 | $(Q)$(RM) -- $(DESTDIR)$(bash_compdir)/bpftool
|
| 325 |
|
| 326 | doc:
|
| 327 | $(call descend,Documentation)
|
| 328 |
|
| 329 | doc-clean:
|
| 330 | $(call descend,Documentation,clean)
|
| 331 |
|
| 332 | doc-install:
|
| 333 | $(call descend,Documentation,install)
|
| 334 |
|
| 335 | doc-uninstall:
|
| 336 | $(call descend,Documentation,uninstall)
|
| 337 |
|
| 338 | FORCE:
|
| 339 |
|
| 340 | .SECONDARY:
|
| 341 | .PHONY: all FORCE bootstrap clean install-bin install uninstall
|
| 342 | .PHONY: doc doc-clean doc-install doc-uninstall
|
| 343 | .DEFAULT_GOAL := all
|
| 344 |
|
| 345 |
|
| 346 | .DELETE_ON_ERROR:
|