.. | .. |
---|
1 | | -# SPDX-License-Identifier: GPL-2.0 |
---|
| 1 | +# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) |
---|
2 | 2 | # Most of this file is copied from tools/lib/traceevent/Makefile |
---|
3 | 3 | |
---|
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))) |
---|
7 | 12 | |
---|
8 | 13 | MAKEFLAGS += --no-print-directory |
---|
9 | 14 | |
---|
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 |
---|
11 | 20 | srctree := $(patsubst %/,%,$(dir $(CURDIR))) |
---|
12 | 21 | srctree := $(patsubst %/,%,$(dir $(srctree))) |
---|
13 | 22 | srctree := $(patsubst %/,%,$(dir $(srctree))) |
---|
14 | 23 | #$(info Determined 'srctree' to be $(srctree)) |
---|
15 | 24 | 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) |
---|
31 | 25 | |
---|
32 | 26 | INSTALL = install |
---|
33 | 27 | |
---|
.. | .. |
---|
54 | 48 | export man_dir man_dir_SQ INSTALL |
---|
55 | 49 | export DESTDIR DESTDIR_SQ |
---|
56 | 50 | |
---|
57 | | -include ../../scripts/Makefile.include |
---|
| 51 | +include $(srctree)/tools/scripts/Makefile.include |
---|
58 | 52 | |
---|
59 | 53 | # copy a bit from Linux kbuild |
---|
60 | 54 | |
---|
.. | .. |
---|
66 | 60 | endif |
---|
67 | 61 | |
---|
68 | 62 | 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 |
---|
71 | 65 | |
---|
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 |
---|
73 | 67 | FEATURE_CHECK_CFLAGS-bpf = $(INCLUDES) |
---|
74 | 68 | |
---|
75 | 69 | check_feat := 1 |
---|
.. | .. |
---|
94 | 88 | libdir_SQ = $(subst ','\'',$(libdir)) |
---|
95 | 89 | libdir_relative_SQ = $(subst ','\'',$(libdir_relative)) |
---|
96 | 90 | |
---|
97 | | -LIB_FILE = libbpf.a libbpf.so |
---|
98 | | - |
---|
99 | | -VERSION = $(BPF_VERSION) |
---|
100 | | -PATCHLEVEL = $(BPF_PATCHLEVEL) |
---|
101 | | -EXTRAVERSION = $(BPF_EXTRAVERSION) |
---|
102 | | - |
---|
103 | 91 | OBJ = $@ |
---|
104 | 92 | N = |
---|
105 | 93 | |
---|
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 |
---|
107 | 97 | |
---|
108 | 98 | # Set compile option CFLAGS |
---|
109 | 99 | ifdef EXTRA_CFLAGS |
---|
110 | 100 | CFLAGS := $(EXTRA_CFLAGS) |
---|
111 | 101 | 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 |
---|
121 | 103 | endif |
---|
122 | 104 | |
---|
123 | 105 | # Append required CFLAGS |
---|
124 | | -override CFLAGS += $(EXTRA_WARNINGS) |
---|
| 106 | +override CFLAGS += $(EXTRA_WARNINGS) -Wno-switch-enum |
---|
125 | 107 | override CFLAGS += -Werror -Wall |
---|
126 | | -override CFLAGS += -fPIC |
---|
127 | 108 | 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 |
---|
128 | 114 | |
---|
129 | 115 | ifeq ($(VERBOSE),1) |
---|
130 | 116 | Q = |
---|
.. | .. |
---|
142 | 128 | export srctree OUTPUT CC LD CFLAGS V |
---|
143 | 129 | include $(srctree)/tools/build/Makefile.include |
---|
144 | 130 | |
---|
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 |
---|
147 | 136 | |
---|
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)) |
---|
149 | 140 | |
---|
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) |
---|
151 | 154 | |
---|
152 | 155 | all: fixdep |
---|
153 | 156 | $(Q)$(MAKE) all_cmd |
---|
154 | 157 | |
---|
155 | | -all_cmd: $(CMD_TARGETS) |
---|
| 158 | +all_cmd: $(CMD_TARGETS) check |
---|
156 | 159 | |
---|
157 | | -$(BPF_IN): force elfdep bpfdep |
---|
| 160 | +$(BPF_IN_SHARED): force elfdep zdep bpfdep $(BPF_HELPER_DEFS) |
---|
158 | 161 | @(test -f ../../include/uapi/linux/bpf.h -a -f ../../../include/uapi/linux/bpf.h && ( \ |
---|
159 | 162 | (diff -B ../../include/uapi/linux/bpf.h ../../../include/uapi/linux/bpf.h >/dev/null) || \ |
---|
160 | 163 | 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 | 170 | @(test -f ../../include/uapi/linux/if_link.h -a -f ../../../include/uapi/linux/if_link.h && ( \ |
---|
168 | 171 | (diff -B ../../include/uapi/linux/if_link.h ../../../include/uapi/linux/if_link.h >/dev/null) || \ |
---|
169 | 172 | 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)" |
---|
171 | 177 | |
---|
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) |
---|
174 | 180 | |
---|
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 |
---|
177 | 234 | |
---|
178 | 235 | define do_install |
---|
179 | 236 | if [ ! -d '$(DESTDIR_SQ)$2' ]; then \ |
---|
.. | .. |
---|
183 | 240 | endef |
---|
184 | 241 | |
---|
185 | 242 | 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) |
---|
188 | 246 | |
---|
189 | | -install_headers: |
---|
| 247 | +install_headers: $(BPF_HELPER_DEFS) |
---|
190 | 248 | $(call QUIET_INSTALL, headers) \ |
---|
191 | 249 | $(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); |
---|
194 | 260 | |
---|
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 |
---|
196 | 266 | |
---|
197 | 267 | ### Cleaning rules |
---|
198 | 268 | |
---|
199 | 269 | config-clean: |
---|
200 | | - $(call QUIET_CLEAN, config) |
---|
| 270 | + $(call QUIET_CLEAN, feature-detect) |
---|
201 | 271 | $(Q)$(MAKE) -C $(srctree)/tools/build/feature/ clean >/dev/null |
---|
202 | 272 | |
---|
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) |
---|
206 | 279 | $(call QUIET_CLEAN, core-gen) $(RM) $(OUTPUT)FEATURE-DUMP.libbpf |
---|
207 | 280 | |
---|
208 | 281 | |
---|
209 | 282 | |
---|
210 | | -PHONY += force elfdep bpfdep |
---|
| 283 | +PHONY += force elfdep zdep bpfdep cscope tags |
---|
211 | 284 | force: |
---|
212 | 285 | |
---|
213 | 286 | elfdep: |
---|
214 | 287 | @if [ "$(feature-libelf)" != "1" ]; then echo "No libelf found"; exit 1 ; fi |
---|
215 | 288 | |
---|
| 289 | +zdep: |
---|
| 290 | + @if [ "$(feature-zlib)" != "1" ]; then echo "No zlib found"; exit 1 ; fi |
---|
| 291 | + |
---|
216 | 292 | bpfdep: |
---|
217 | 293 | @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 |
---|
218 | 302 | |
---|
219 | 303 | # Declare the contents of the .PHONY variable as phony. We keep that |
---|
220 | 304 | # information in a variable so we can use it in if_changed and friends. |
---|
221 | 305 | .PHONY: $(PHONY) |
---|
| 306 | + |
---|
| 307 | +# Delete partially updated (corrupted) files on error |
---|
| 308 | +.DELETE_ON_ERROR: |
---|