hc
2024-02-19 1c055e55a242a33e574e48be530e06770a210dcd
kernel/tools/lib/bpf/Makefile
....@@ -1,33 +1,27 @@
1
-# SPDX-License-Identifier: GPL-2.0
1
+# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
22 # Most of this file is copied from tools/lib/traceevent/Makefile
33
4
-BPF_VERSION = 0
5
-BPF_PATCHLEVEL = 0
6
-BPF_EXTRAVERSION = 1
4
+RM ?= rm
5
+srctree = $(abs_srctree)
6
+
7
+VERSION_SCRIPT := libbpf.map
8
+LIBBPF_VERSION := $(shell \
9
+ grep -oE '^LIBBPF_([0-9.]+)' $(VERSION_SCRIPT) | \
10
+ sort -rV | head -n1 | cut -d'_' -f2)
11
+LIBBPF_MAJOR_VERSION := $(firstword $(subst ., ,$(LIBBPF_VERSION)))
712
813 MAKEFLAGS += --no-print-directory
914
10
-ifeq ($(srctree),)
15
+# This will work when bpf is built in tools env. where srctree
16
+# isn't set and when invoked from selftests build, where srctree
17
+# is a ".". building_out_of_srctree is undefined for in srctree
18
+# builds
19
+ifndef building_out_of_srctree
1120 srctree := $(patsubst %/,%,$(dir $(CURDIR)))
1221 srctree := $(patsubst %/,%,$(dir $(srctree)))
1322 srctree := $(patsubst %/,%,$(dir $(srctree)))
1423 #$(info Determined 'srctree' to be $(srctree))
1524 endif
16
-
17
-# Makefiles suck: This macro sets a default value of $(2) for the
18
-# variable named by $(1), unless the variable has been set by
19
-# environment or command line. This is necessary for CC and AR
20
-# because make sets default values, so the simpler ?= approach
21
-# won't work as expected.
22
-define allow-override
23
- $(if $(or $(findstring environment,$(origin $(1))),\
24
- $(findstring command line,$(origin $(1)))),,\
25
- $(eval $(1) = $(2)))
26
-endef
27
-
28
-# Allow setting CC and AR, or setting CROSS_COMPILE as a prefix.
29
-$(call allow-override,CC,$(CROSS_COMPILE)gcc)
30
-$(call allow-override,AR,$(CROSS_COMPILE)ar)
3125
3226 INSTALL = install
3327
....@@ -54,7 +48,7 @@
5448 export man_dir man_dir_SQ INSTALL
5549 export DESTDIR DESTDIR_SQ
5650
57
-include ../../scripts/Makefile.include
51
+include $(srctree)/tools/scripts/Makefile.include
5852
5953 # copy a bit from Linux kbuild
6054
....@@ -66,10 +60,10 @@
6660 endif
6761
6862 FEATURE_USER = .libbpf
69
-FEATURE_TESTS = libelf libelf-mmap bpf reallocarray
70
-FEATURE_DISPLAY = libelf bpf
63
+FEATURE_TESTS = libelf zlib bpf
64
+FEATURE_DISPLAY = libelf zlib bpf
7165
72
-INCLUDES = -I. -I$(srctree)/tools/include -I$(srctree)/tools/arch/$(ARCH)/include/uapi -I$(srctree)/tools/include/uapi -I$(srctree)/tools/perf
66
+INCLUDES = -I. -I$(srctree)/tools/include -I$(srctree)/tools/include/uapi
7367 FEATURE_CHECK_CFLAGS-bpf = $(INCLUDES)
7468
7569 check_feat := 1
....@@ -94,37 +88,29 @@
9488 libdir_SQ = $(subst ','\'',$(libdir))
9589 libdir_relative_SQ = $(subst ','\'',$(libdir_relative))
9690
97
-LIB_FILE = libbpf.a libbpf.so
98
-
99
-VERSION = $(BPF_VERSION)
100
-PATCHLEVEL = $(BPF_PATCHLEVEL)
101
-EXTRAVERSION = $(BPF_EXTRAVERSION)
102
-
10391 OBJ = $@
10492 N =
10593
106
-LIBBPF_VERSION = $(BPF_VERSION).$(BPF_PATCHLEVEL).$(BPF_EXTRAVERSION)
94
+LIB_TARGET = libbpf.a libbpf.so.$(LIBBPF_VERSION)
95
+LIB_FILE = libbpf.a libbpf.so*
96
+PC_FILE = libbpf.pc
10797
10898 # Set compile option CFLAGS
10999 ifdef EXTRA_CFLAGS
110100 CFLAGS := $(EXTRA_CFLAGS)
111101 else
112
- CFLAGS := -g -Wall
113
-endif
114
-
115
-ifeq ($(feature-libelf-mmap), 1)
116
- override CFLAGS += -DHAVE_LIBELF_MMAP_SUPPORT
117
-endif
118
-
119
-ifeq ($(feature-reallocarray), 0)
120
- override CFLAGS += -DCOMPAT_NEED_REALLOCARRAY
102
+ CFLAGS := -g -O2
121103 endif
122104
123105 # Append required CFLAGS
124
-override CFLAGS += $(EXTRA_WARNINGS)
106
+override CFLAGS += $(EXTRA_WARNINGS) -Wno-switch-enum
125107 override CFLAGS += -Werror -Wall
126
-override CFLAGS += -fPIC
127108 override CFLAGS += $(INCLUDES)
109
+override CFLAGS += -fvisibility=hidden
110
+override CFLAGS += -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
111
+
112
+# flags specific for shared library
113
+SHLIB_FLAGS := -DSHARED -fPIC
128114
129115 ifeq ($(VERBOSE),1)
130116 Q =
....@@ -142,19 +128,36 @@
142128 export srctree OUTPUT CC LD CFLAGS V
143129 include $(srctree)/tools/build/Makefile.include
144130
145
-BPF_IN := $(OUTPUT)libbpf-in.o
146
-LIB_FILE := $(addprefix $(OUTPUT),$(LIB_FILE))
131
+SHARED_OBJDIR := $(OUTPUT)sharedobjs/
132
+STATIC_OBJDIR := $(OUTPUT)staticobjs/
133
+BPF_IN_SHARED := $(SHARED_OBJDIR)libbpf-in.o
134
+BPF_IN_STATIC := $(STATIC_OBJDIR)libbpf-in.o
135
+BPF_HELPER_DEFS := $(OUTPUT)bpf_helper_defs.h
147136
148
-CMD_TARGETS = $(LIB_FILE)
137
+LIB_TARGET := $(addprefix $(OUTPUT),$(LIB_TARGET))
138
+LIB_FILE := $(addprefix $(OUTPUT),$(LIB_FILE))
139
+PC_FILE := $(addprefix $(OUTPUT),$(PC_FILE))
149140
150
-TARGETS = $(CMD_TARGETS)
141
+TAGS_PROG := $(if $(shell which etags 2>/dev/null),etags,ctags)
142
+
143
+GLOBAL_SYM_COUNT = $(shell readelf -s --wide $(BPF_IN_SHARED) | \
144
+ cut -d "@" -f1 | sed 's/_v[0-9]_[0-9]_[0-9].*//' | \
145
+ sed 's/\[.*\]//' | \
146
+ awk '/GLOBAL/ && /DEFAULT/ && !/UND/ {print $$NF}' | \
147
+ sort -u | wc -l)
148
+VERSIONED_SYM_COUNT = $(shell readelf --dyn-syms --wide $(OUTPUT)libbpf.so | \
149
+ sed 's/\[.*\]//' | \
150
+ awk '/GLOBAL/ && /DEFAULT/ && !/UND|ABS/ {print $$NF}' | \
151
+ grep -Eo '[^ ]+@LIBBPF_' | cut -d@ -f1 | sort -u | wc -l)
152
+
153
+CMD_TARGETS = $(LIB_TARGET) $(PC_FILE)
151154
152155 all: fixdep
153156 $(Q)$(MAKE) all_cmd
154157
155
-all_cmd: $(CMD_TARGETS)
158
+all_cmd: $(CMD_TARGETS) check
156159
157
-$(BPF_IN): force elfdep bpfdep
160
+$(BPF_IN_SHARED): force elfdep zdep bpfdep $(BPF_HELPER_DEFS)
158161 @(test -f ../../include/uapi/linux/bpf.h -a -f ../../../include/uapi/linux/bpf.h && ( \
159162 (diff -B ../../include/uapi/linux/bpf.h ../../../include/uapi/linux/bpf.h >/dev/null) || \
160163 echo "Warning: Kernel ABI header at 'tools/include/uapi/linux/bpf.h' differs from latest version at 'include/uapi/linux/bpf.h'" >&2 )) || true
....@@ -167,13 +170,67 @@
167170 @(test -f ../../include/uapi/linux/if_link.h -a -f ../../../include/uapi/linux/if_link.h && ( \
168171 (diff -B ../../include/uapi/linux/if_link.h ../../../include/uapi/linux/if_link.h >/dev/null) || \
169172 echo "Warning: Kernel ABI header at 'tools/include/uapi/linux/if_link.h' differs from latest version at 'include/uapi/linux/if_link.h'" >&2 )) || true
170
- $(Q)$(MAKE) $(build)=libbpf
173
+ @(test -f ../../include/uapi/linux/if_xdp.h -a -f ../../../include/uapi/linux/if_xdp.h && ( \
174
+ (diff -B ../../include/uapi/linux/if_xdp.h ../../../include/uapi/linux/if_xdp.h >/dev/null) || \
175
+ echo "Warning: Kernel ABI header at 'tools/include/uapi/linux/if_xdp.h' differs from latest version at 'include/uapi/linux/if_xdp.h'" >&2 )) || true
176
+ $(Q)$(MAKE) $(build)=libbpf OUTPUT=$(SHARED_OBJDIR) CFLAGS="$(CFLAGS) $(SHLIB_FLAGS)"
171177
172
-$(OUTPUT)libbpf.so: $(BPF_IN)
173
- $(QUIET_LINK)$(CC) --shared $^ -o $@
178
+$(BPF_IN_STATIC): force elfdep zdep bpfdep $(BPF_HELPER_DEFS)
179
+ $(Q)$(MAKE) $(build)=libbpf OUTPUT=$(STATIC_OBJDIR)
174180
175
-$(OUTPUT)libbpf.a: $(BPF_IN)
176
- $(QUIET_LINK)$(RM) $@; $(AR) rcs $@ $^
181
+$(BPF_HELPER_DEFS): $(srctree)/tools/include/uapi/linux/bpf.h
182
+ $(QUIET_GEN)$(srctree)/scripts/bpf_helpers_doc.py --header \
183
+ --file $(srctree)/tools/include/uapi/linux/bpf.h > $(BPF_HELPER_DEFS)
184
+
185
+$(OUTPUT)libbpf.so: $(OUTPUT)libbpf.so.$(LIBBPF_VERSION)
186
+
187
+$(OUTPUT)libbpf.so.$(LIBBPF_VERSION): $(BPF_IN_SHARED) $(VERSION_SCRIPT)
188
+ $(QUIET_LINK)$(CC) $(LDFLAGS) \
189
+ --shared -Wl,-soname,libbpf.so.$(LIBBPF_MAJOR_VERSION) \
190
+ -Wl,--version-script=$(VERSION_SCRIPT) $< -lelf -lz -o $@
191
+ @ln -sf $(@F) $(OUTPUT)libbpf.so
192
+ @ln -sf $(@F) $(OUTPUT)libbpf.so.$(LIBBPF_MAJOR_VERSION)
193
+
194
+$(OUTPUT)libbpf.a: $(BPF_IN_STATIC)
195
+ $(QUIET_LINK)$(RM) -f $@; $(AR) rcs $@ $^
196
+
197
+$(OUTPUT)libbpf.pc:
198
+ $(QUIET_GEN)sed -e "s|@PREFIX@|$(prefix)|" \
199
+ -e "s|@LIBDIR@|$(libdir_SQ)|" \
200
+ -e "s|@VERSION@|$(LIBBPF_VERSION)|" \
201
+ < libbpf.pc.template > $@
202
+
203
+check: check_abi
204
+
205
+check_abi: $(OUTPUT)libbpf.so $(VERSION_SCRIPT)
206
+ @if [ "$(GLOBAL_SYM_COUNT)" != "$(VERSIONED_SYM_COUNT)" ]; then \
207
+ echo "Warning: Num of global symbols in $(BPF_IN_SHARED)" \
208
+ "($(GLOBAL_SYM_COUNT)) does NOT match with num of" \
209
+ "versioned symbols in $^ ($(VERSIONED_SYM_COUNT))." \
210
+ "Please make sure all LIBBPF_API symbols are" \
211
+ "versioned in $(VERSION_SCRIPT)." >&2; \
212
+ readelf -s --wide $(BPF_IN_SHARED) | \
213
+ cut -d "@" -f1 | sed 's/_v[0-9]_[0-9]_[0-9].*//' | \
214
+ sed 's/\[.*\]//' | \
215
+ awk '/GLOBAL/ && /DEFAULT/ && !/UND/ {print $$NF}'| \
216
+ sort -u > $(OUTPUT)libbpf_global_syms.tmp; \
217
+ readelf --dyn-syms --wide $(OUTPUT)libbpf.so | \
218
+ sed 's/\[.*\]//' | \
219
+ awk '/GLOBAL/ && /DEFAULT/ && !/UND|ABS/ {print $$NF}'| \
220
+ grep -Eo '[^ ]+@LIBBPF_' | cut -d@ -f1 | \
221
+ sort -u > $(OUTPUT)libbpf_versioned_syms.tmp; \
222
+ diff -u $(OUTPUT)libbpf_global_syms.tmp \
223
+ $(OUTPUT)libbpf_versioned_syms.tmp; \
224
+ rm $(OUTPUT)libbpf_global_syms.tmp \
225
+ $(OUTPUT)libbpf_versioned_syms.tmp; \
226
+ exit 1; \
227
+ fi
228
+
229
+define do_install_mkdir
230
+ if [ ! -d '$(DESTDIR_SQ)$1' ]; then \
231
+ $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$1'; \
232
+ fi
233
+endef
177234
178235 define do_install
179236 if [ ! -d '$(DESTDIR_SQ)$2' ]; then \
....@@ -183,39 +240,69 @@
183240 endef
184241
185242 install_lib: all_cmd
186
- $(call QUIET_INSTALL, $(LIB_FILE)) \
187
- $(call do_install,$(LIB_FILE),$(libdir_SQ))
243
+ $(call QUIET_INSTALL, $(LIB_TARGET)) \
244
+ $(call do_install_mkdir,$(libdir_SQ)); \
245
+ cp -fpR $(LIB_FILE) $(DESTDIR)$(libdir_SQ)
188246
189
-install_headers:
247
+install_headers: $(BPF_HELPER_DEFS)
190248 $(call QUIET_INSTALL, headers) \
191249 $(call do_install,bpf.h,$(prefix)/include/bpf,644); \
192
- $(call do_install,libbpf.h,$(prefix)/include/bpf,644);
193
- $(call do_install,btf.h,$(prefix)/include/bpf,644);
250
+ $(call do_install,libbpf.h,$(prefix)/include/bpf,644); \
251
+ $(call do_install,btf.h,$(prefix)/include/bpf,644); \
252
+ $(call do_install,libbpf_util.h,$(prefix)/include/bpf,644); \
253
+ $(call do_install,libbpf_common.h,$(prefix)/include/bpf,644); \
254
+ $(call do_install,xsk.h,$(prefix)/include/bpf,644); \
255
+ $(call do_install,bpf_helpers.h,$(prefix)/include/bpf,644); \
256
+ $(call do_install,$(BPF_HELPER_DEFS),$(prefix)/include/bpf,644); \
257
+ $(call do_install,bpf_tracing.h,$(prefix)/include/bpf,644); \
258
+ $(call do_install,bpf_endian.h,$(prefix)/include/bpf,644); \
259
+ $(call do_install,bpf_core_read.h,$(prefix)/include/bpf,644);
194260
195
-install: install_lib
261
+install_pkgconfig: $(PC_FILE)
262
+ $(call QUIET_INSTALL, $(PC_FILE)) \
263
+ $(call do_install,$(PC_FILE),$(libdir_SQ)/pkgconfig,644)
264
+
265
+install: install_lib install_pkgconfig install_headers
196266
197267 ### Cleaning rules
198268
199269 config-clean:
200
- $(call QUIET_CLEAN, config)
270
+ $(call QUIET_CLEAN, feature-detect)
201271 $(Q)$(MAKE) -C $(srctree)/tools/build/feature/ clean >/dev/null
202272
203
-clean:
204
- $(call QUIET_CLEAN, libbpf) $(RM) *.o *~ $(TARGETS) *.a *.so .*.d .*.cmd \
205
- $(RM) LIBBPF-CFLAGS
273
+clean: config-clean
274
+ $(call QUIET_CLEAN, libbpf) $(RM) -rf $(CMD_TARGETS) \
275
+ *~ .*.d .*.cmd LIBBPF-CFLAGS $(BPF_HELPER_DEFS) \
276
+ $(SHARED_OBJDIR) $(STATIC_OBJDIR) \
277
+ $(addprefix $(OUTPUT), \
278
+ *.o *.a *.so *.so.$(LIBBPF_MAJOR_VERSION) *.pc)
206279 $(call QUIET_CLEAN, core-gen) $(RM) $(OUTPUT)FEATURE-DUMP.libbpf
207280
208281
209282
210
-PHONY += force elfdep bpfdep
283
+PHONY += force elfdep zdep bpfdep cscope tags
211284 force:
212285
213286 elfdep:
214287 @if [ "$(feature-libelf)" != "1" ]; then echo "No libelf found"; exit 1 ; fi
215288
289
+zdep:
290
+ @if [ "$(feature-zlib)" != "1" ]; then echo "No zlib found"; exit 1 ; fi
291
+
216292 bpfdep:
217293 @if [ "$(feature-bpf)" != "1" ]; then echo "BPF API too old"; exit 1 ; fi
294
+
295
+cscope:
296
+ ls *.c *.h > cscope.files
297
+ cscope -b -q -I $(srctree)/include -f cscope.out
298
+
299
+tags:
300
+ $(RM) -f TAGS tags
301
+ ls *.c *.h | xargs $(TAGS_PROG) -a
218302
219303 # Declare the contents of the .PHONY variable as phony. We keep that
220304 # information in a variable so we can use it in if_changed and friends.
221305 .PHONY: $(PHONY)
306
+
307
+# Delete partially updated (corrupted) files on error
308
+.DELETE_ON_ERROR: