| .. | .. |
|---|
| 1 | +# SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | include ../../scripts/Makefile.include |
|---|
| 2 | | -include ../../scripts/utilities.mak |
|---|
| 3 | 3 | |
|---|
| 4 | 4 | ifeq ($(srctree),) |
|---|
| 5 | 5 | srctree := $(patsubst %/,%,$(dir $(CURDIR))) |
|---|
| .. | .. |
|---|
| 16 | 16 | BPF_DIR = $(srctree)/tools/lib/bpf/ |
|---|
| 17 | 17 | |
|---|
| 18 | 18 | ifneq ($(OUTPUT),) |
|---|
| 19 | | - BPF_PATH = $(OUTPUT) |
|---|
| 19 | + LIBBPF_OUTPUT = $(OUTPUT)/libbpf/ |
|---|
| 20 | + LIBBPF_PATH = $(LIBBPF_OUTPUT) |
|---|
| 20 | 21 | else |
|---|
| 21 | | - BPF_PATH = $(BPF_DIR) |
|---|
| 22 | + LIBBPF_PATH = $(BPF_DIR) |
|---|
| 22 | 23 | endif |
|---|
| 23 | 24 | |
|---|
| 24 | | -LIBBPF = $(BPF_PATH)libbpf.a |
|---|
| 25 | +LIBBPF = $(LIBBPF_PATH)libbpf.a |
|---|
| 25 | 26 | |
|---|
| 26 | | -BPFTOOL_VERSION := $(shell make --no-print-directory -sC ../../.. kernelversion) |
|---|
| 27 | +BPFTOOL_VERSION ?= $(shell make -rR --no-print-directory -sC ../../.. kernelversion) |
|---|
| 27 | 28 | |
|---|
| 28 | 29 | $(LIBBPF): FORCE |
|---|
| 29 | | - $(Q)$(MAKE) -C $(BPF_DIR) OUTPUT=$(OUTPUT) $(OUTPUT)libbpf.a |
|---|
| 30 | + $(if $(LIBBPF_OUTPUT),@mkdir -p $(LIBBPF_OUTPUT)) |
|---|
| 31 | + $(Q)$(MAKE) -C $(BPF_DIR) OUTPUT=$(LIBBPF_OUTPUT) $(LIBBPF_OUTPUT)libbpf.a |
|---|
| 30 | 32 | |
|---|
| 31 | 33 | $(LIBBPF)-clean: |
|---|
| 32 | 34 | $(call QUIET_CLEAN, libbpf) |
|---|
| 33 | | - $(Q)$(MAKE) -C $(BPF_DIR) OUTPUT=$(OUTPUT) clean >/dev/null |
|---|
| 35 | + $(Q)$(MAKE) -C $(BPF_DIR) OUTPUT=$(LIBBPF_OUTPUT) clean >/dev/null |
|---|
| 34 | 36 | |
|---|
| 35 | 37 | prefix ?= /usr/local |
|---|
| 36 | 38 | bash_compdir ?= /usr/share/bash-completion/completions |
|---|
| 37 | 39 | |
|---|
| 38 | | -CC = gcc |
|---|
| 39 | | - |
|---|
| 40 | 40 | CFLAGS += -O2 |
|---|
| 41 | | -CFLAGS += -W -Wall -Wextra -Wno-unused-parameter -Wshadow -Wno-missing-field-initializers |
|---|
| 41 | +CFLAGS += -W -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers |
|---|
| 42 | +CFLAGS += $(filter-out -Wswitch-enum -Wnested-externs,$(EXTRA_WARNINGS)) |
|---|
| 42 | 43 | CFLAGS += -DPACKAGE='"bpftool"' -D__EXPORTED_HEADERS__ \ |
|---|
| 44 | + -I$(if $(OUTPUT),$(OUTPUT),.) \ |
|---|
| 43 | 45 | -I$(srctree)/kernel/bpf/ \ |
|---|
| 44 | 46 | -I$(srctree)/tools/include \ |
|---|
| 45 | 47 | -I$(srctree)/tools/include/uapi \ |
|---|
| 46 | | - -I$(srctree)/tools/lib/bpf \ |
|---|
| 48 | + -I$(srctree)/tools/lib \ |
|---|
| 47 | 49 | -I$(srctree)/tools/perf |
|---|
| 48 | 50 | CFLAGS += -DBPFTOOL_VERSION='"$(BPFTOOL_VERSION)"' |
|---|
| 49 | | -LIBS = -lelf -lbfd -lopcodes $(LIBBPF) |
|---|
| 51 | +ifneq ($(EXTRA_CFLAGS),) |
|---|
| 52 | +CFLAGS += $(EXTRA_CFLAGS) |
|---|
| 53 | +endif |
|---|
| 54 | +ifneq ($(EXTRA_LDFLAGS),) |
|---|
| 55 | +LDFLAGS += $(EXTRA_LDFLAGS) |
|---|
| 56 | +endif |
|---|
| 50 | 57 | |
|---|
| 51 | 58 | INSTALL ?= install |
|---|
| 52 | 59 | RM ?= rm -f |
|---|
| 60 | +CLANG ?= clang |
|---|
| 61 | +LLVM_STRIP ?= llvm-strip |
|---|
| 53 | 62 | |
|---|
| 54 | 63 | FEATURE_USER = .bpftool |
|---|
| 55 | | -FEATURE_TESTS = libbfd disassembler-four-args reallocarray |
|---|
| 56 | | -FEATURE_DISPLAY = libbfd disassembler-four-args |
|---|
| 64 | +FEATURE_TESTS = libbfd disassembler-four-args reallocarray zlib libcap \ |
|---|
| 65 | + clang-bpf-co-re |
|---|
| 66 | +FEATURE_DISPLAY = libbfd disassembler-four-args zlib libcap \ |
|---|
| 67 | + clang-bpf-co-re |
|---|
| 57 | 68 | |
|---|
| 58 | 69 | check_feat := 1 |
|---|
| 59 | 70 | NON_CHECK_FEAT_TARGETS := clean uninstall doc doc-clean doc-install doc-uninstall |
|---|
| .. | .. |
|---|
| 79 | 90 | CFLAGS += -DCOMPAT_NEED_REALLOCARRAY |
|---|
| 80 | 91 | endif |
|---|
| 81 | 92 | |
|---|
| 93 | +LIBS = $(LIBBPF) -lelf -lz |
|---|
| 94 | +ifeq ($(feature-libcap), 1) |
|---|
| 95 | +CFLAGS += -DUSE_LIBCAP |
|---|
| 96 | +LIBS += -lcap |
|---|
| 97 | +endif |
|---|
| 98 | + |
|---|
| 82 | 99 | include $(wildcard $(OUTPUT)*.d) |
|---|
| 83 | 100 | |
|---|
| 84 | 101 | all: $(OUTPUT)bpftool |
|---|
| 85 | 102 | |
|---|
| 86 | | -SRCS = $(wildcard *.c) |
|---|
| 103 | +BFD_SRCS = jit_disasm.c |
|---|
| 104 | + |
|---|
| 105 | +SRCS = $(filter-out $(BFD_SRCS),$(wildcard *.c)) |
|---|
| 106 | + |
|---|
| 107 | +ifeq ($(feature-libbfd),1) |
|---|
| 108 | + LIBS += -lbfd -ldl -lopcodes |
|---|
| 109 | +else ifeq ($(feature-libbfd-liberty),1) |
|---|
| 110 | + LIBS += -lbfd -ldl -lopcodes -liberty |
|---|
| 111 | +else ifeq ($(feature-libbfd-liberty-z),1) |
|---|
| 112 | + LIBS += -lbfd -ldl -lopcodes -liberty -lz |
|---|
| 113 | +endif |
|---|
| 114 | + |
|---|
| 115 | +ifneq ($(filter -lbfd,$(LIBS)),) |
|---|
| 116 | +CFLAGS += -DHAVE_LIBBFD_SUPPORT |
|---|
| 117 | +SRCS += $(BFD_SRCS) |
|---|
| 118 | +endif |
|---|
| 119 | + |
|---|
| 120 | +BPFTOOL_BOOTSTRAP := $(if $(OUTPUT),$(OUTPUT)bpftool-bootstrap,./bpftool-bootstrap) |
|---|
| 121 | + |
|---|
| 122 | +BOOTSTRAP_OBJS = $(addprefix $(OUTPUT),main.o common.o json_writer.o gen.o btf.o) |
|---|
| 87 | 123 | OBJS = $(patsubst %.c,$(OUTPUT)%.o,$(SRCS)) $(OUTPUT)disasm.o |
|---|
| 88 | 124 | |
|---|
| 125 | +VMLINUX_BTF_PATHS ?= $(if $(O),$(O)/vmlinux) \ |
|---|
| 126 | + $(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux) \ |
|---|
| 127 | + ../../../vmlinux \ |
|---|
| 128 | + /sys/kernel/btf/vmlinux \ |
|---|
| 129 | + /boot/vmlinux-$(shell uname -r) |
|---|
| 130 | +VMLINUX_BTF ?= $(abspath $(firstword $(wildcard $(VMLINUX_BTF_PATHS)))) |
|---|
| 131 | + |
|---|
| 132 | +ifneq ($(VMLINUX_BTF)$(VMLINUX_H),) |
|---|
| 133 | +ifeq ($(feature-clang-bpf-co-re),1) |
|---|
| 134 | + |
|---|
| 135 | +BUILD_BPF_SKELS := 1 |
|---|
| 136 | + |
|---|
| 137 | +$(OUTPUT)vmlinux.h: $(VMLINUX_BTF) $(BPFTOOL_BOOTSTRAP) |
|---|
| 138 | +ifeq ($(VMLINUX_H),) |
|---|
| 139 | + $(QUIET_GEN)$(BPFTOOL_BOOTSTRAP) btf dump file $< format c > $@ |
|---|
| 140 | +else |
|---|
| 141 | + $(Q)cp "$(VMLINUX_H)" $@ |
|---|
| 142 | +endif |
|---|
| 143 | + |
|---|
| 144 | +$(OUTPUT)%.bpf.o: skeleton/%.bpf.c $(OUTPUT)vmlinux.h $(LIBBPF) |
|---|
| 145 | + $(QUIET_CLANG)$(CLANG) \ |
|---|
| 146 | + -I$(if $(OUTPUT),$(OUTPUT),.) \ |
|---|
| 147 | + -I$(srctree)/tools/include/uapi/ \ |
|---|
| 148 | + -I$(LIBBPF_PATH) \ |
|---|
| 149 | + -I$(srctree)/tools/lib \ |
|---|
| 150 | + -g -O2 -target bpf -c $< -o $@ && $(LLVM_STRIP) -g $@ |
|---|
| 151 | + |
|---|
| 152 | +$(OUTPUT)%.skel.h: $(OUTPUT)%.bpf.o $(BPFTOOL_BOOTSTRAP) |
|---|
| 153 | + $(QUIET_GEN)$(BPFTOOL_BOOTSTRAP) gen skeleton $< > $@ |
|---|
| 154 | + |
|---|
| 155 | +$(OUTPUT)prog.o: $(OUTPUT)profiler.skel.h |
|---|
| 156 | + |
|---|
| 157 | +$(OUTPUT)pids.o: $(OUTPUT)pid_iter.skel.h |
|---|
| 158 | + |
|---|
| 159 | +endif |
|---|
| 160 | +endif |
|---|
| 161 | + |
|---|
| 162 | +CFLAGS += $(if $(BUILD_BPF_SKELS),,-DBPFTOOL_WITHOUT_SKELETONS) |
|---|
| 163 | + |
|---|
| 89 | 164 | $(OUTPUT)disasm.o: $(srctree)/kernel/bpf/disasm.c |
|---|
| 90 | | - $(QUIET_CC)$(COMPILE.c) -MMD -o $@ $< |
|---|
| 165 | + $(QUIET_CC)$(CC) $(CFLAGS) -c -MMD -o $@ $< |
|---|
| 166 | + |
|---|
| 167 | +$(OUTPUT)feature.o: | zdep |
|---|
| 168 | + |
|---|
| 169 | +$(BPFTOOL_BOOTSTRAP): $(BOOTSTRAP_OBJS) $(LIBBPF) |
|---|
| 170 | + $(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(BOOTSTRAP_OBJS) $(LIBS) |
|---|
| 91 | 171 | |
|---|
| 92 | 172 | $(OUTPUT)bpftool: $(OBJS) $(LIBBPF) |
|---|
| 93 | | - $(QUIET_LINK)$(CC) $(CFLAGS) -o $@ $^ $(LIBS) |
|---|
| 173 | + $(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJS) $(LIBS) |
|---|
| 94 | 174 | |
|---|
| 95 | 175 | $(OUTPUT)%.o: %.c |
|---|
| 96 | | - $(QUIET_CC)$(COMPILE.c) -MMD -o $@ $< |
|---|
| 176 | + $(QUIET_CC)$(CC) $(CFLAGS) -c -MMD -o $@ $< |
|---|
| 97 | 177 | |
|---|
| 98 | | -clean: $(LIBBPF)-clean |
|---|
| 178 | +feature-detect-clean: |
|---|
| 179 | + $(call QUIET_CLEAN, feature-detect) |
|---|
| 180 | + $(Q)$(MAKE) -C $(srctree)/tools/build/feature/ clean >/dev/null |
|---|
| 181 | + |
|---|
| 182 | +clean: $(LIBBPF)-clean feature-detect-clean |
|---|
| 99 | 183 | $(call QUIET_CLEAN, bpftool) |
|---|
| 100 | | - $(Q)$(RM) $(OUTPUT)bpftool $(OUTPUT)*.o $(OUTPUT)*.d |
|---|
| 184 | + $(Q)$(RM) -- $(OUTPUT)bpftool $(OUTPUT)*.o $(OUTPUT)*.d |
|---|
| 185 | + $(Q)$(RM) -- $(BPFTOOL_BOOTSTRAP) $(OUTPUT)*.skel.h $(OUTPUT)vmlinux.h |
|---|
| 186 | + $(Q)$(RM) -r -- $(OUTPUT)libbpf/ |
|---|
| 101 | 187 | $(call QUIET_CLEAN, core-gen) |
|---|
| 102 | | - $(Q)$(RM) $(OUTPUT)FEATURE-DUMP.bpftool |
|---|
| 188 | + $(Q)$(RM) -- $(OUTPUT)FEATURE-DUMP.bpftool |
|---|
| 189 | + $(Q)$(RM) -r -- $(OUTPUT)feature/ |
|---|
| 103 | 190 | |
|---|
| 104 | 191 | install: $(OUTPUT)bpftool |
|---|
| 105 | 192 | $(call QUIET_INSTALL, bpftool) |
|---|
| .. | .. |
|---|
| 110 | 197 | |
|---|
| 111 | 198 | uninstall: |
|---|
| 112 | 199 | $(call QUIET_UNINST, bpftool) |
|---|
| 113 | | - $(Q)$(RM) $(DESTDIR)$(prefix)/sbin/bpftool |
|---|
| 114 | | - $(Q)$(RM) $(DESTDIR)$(bash_compdir)/bpftool |
|---|
| 200 | + $(Q)$(RM) -- $(DESTDIR)$(prefix)/sbin/bpftool |
|---|
| 201 | + $(Q)$(RM) -- $(DESTDIR)$(bash_compdir)/bpftool |
|---|
| 115 | 202 | |
|---|
| 116 | 203 | doc: |
|---|
| 117 | 204 | $(call descend,Documentation) |
|---|
| .. | .. |
|---|
| 127 | 214 | |
|---|
| 128 | 215 | FORCE: |
|---|
| 129 | 216 | |
|---|
| 130 | | -.PHONY: all FORCE clean install uninstall |
|---|
| 217 | +zdep: |
|---|
| 218 | + @if [ "$(feature-zlib)" != "1" ]; then echo "No zlib found"; exit 1 ; fi |
|---|
| 219 | + |
|---|
| 220 | +.SECONDARY: |
|---|
| 221 | +.PHONY: all FORCE clean install uninstall zdep |
|---|
| 131 | 222 | .PHONY: doc doc-clean doc-install doc-uninstall |
|---|
| 132 | 223 | .DEFAULT_GOAL := all |
|---|