.. | .. |
---|
| 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 |
---|