Makefile 7.1 KB
Newer Older
1
# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
2 3 4 5 6 7 8 9
# Most of this file is copied from tools/lib/traceevent/Makefile

BPF_VERSION = 0
BPF_PATCHLEVEL = 0
BPF_EXTRAVERSION = 1

MAKEFLAGS += --no-print-directory

10
ifeq ($(srctree),)
11
srctree := $(patsubst %/,%,$(dir $(CURDIR)))
12 13 14 15
srctree := $(patsubst %/,%,$(dir $(srctree)))
srctree := $(patsubst %/,%,$(dir $(srctree)))
#$(info Determined 'srctree' to be $(srctree))
endif
16 17 18 19 20 21 22 23 24 25

INSTALL = install

# Use DESTDIR for installing into a different root directory.
# This is useful for building a package. The program will be
# installed in this directory as if it was the root directory.
# Then the build tool can move it later.
DESTDIR ?=
DESTDIR_SQ = '$(subst ','\'',$(DESTDIR))'

26 27
include $(srctree)/tools/scripts/Makefile.arch

28 29 30 31 32 33 34 35 36 37 38 39 40 41
ifeq ($(LP64), 1)
  libdir_relative = lib64
else
  libdir_relative = lib
endif

prefix ?= /usr/local
libdir = $(prefix)/$(libdir_relative)
man_dir = $(prefix)/share/man
man_dir_SQ = '$(subst ','\'',$(man_dir))'

export man_dir man_dir_SQ INSTALL
export DESTDIR DESTDIR_SQ

42
include $(srctree)/tools/scripts/Makefile.include
43 44 45 46 47 48 49 50 51 52

# copy a bit from Linux kbuild

ifeq ("$(origin V)", "command line")
  VERBOSE = $(V)
endif
ifndef VERBOSE
  VERBOSE = 0
endif

53
FEATURE_USER = .libbpf
54
FEATURE_TESTS = libelf libelf-mmap bpf reallocarray cxx
55
FEATURE_DISPLAY = libelf bpf
56

57
INCLUDES = -I. -I$(srctree)/tools/include -I$(srctree)/tools/arch/$(ARCH)/include/uapi -I$(srctree)/tools/include/uapi
58 59
FEATURE_CHECK_CFLAGS-bpf = $(INCLUDES)

60 61 62 63 64 65 66 67 68
check_feat := 1
NON_CHECK_FEAT_TARGETS := clean TAGS tags cscope help
ifdef MAKECMDGOALS
ifeq ($(filter-out $(NON_CHECK_FEAT_TARGETS),$(MAKECMDGOALS)),)
  check_feat := 0
endif
endif

ifeq ($(check_feat),1)
69
ifeq ($(FEATURES_DUMP),)
70
include $(srctree)/tools/build/Makefile.feature
71 72 73
else
include $(FEATURES_DUMP)
endif
74
endif
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103

export prefix libdir src obj

# Shell quotes
libdir_SQ = $(subst ','\'',$(libdir))
libdir_relative_SQ = $(subst ','\'',$(libdir_relative))

LIB_FILE = libbpf.a libbpf.so

VERSION		= $(BPF_VERSION)
PATCHLEVEL	= $(BPF_PATCHLEVEL)
EXTRAVERSION	= $(BPF_EXTRAVERSION)

OBJ		= $@
N		=

LIBBPF_VERSION = $(BPF_VERSION).$(BPF_PATCHLEVEL).$(BPF_EXTRAVERSION)

# Set compile option CFLAGS
ifdef EXTRA_CFLAGS
  CFLAGS := $(EXTRA_CFLAGS)
else
  CFLAGS := -g -Wall
endif

ifeq ($(feature-libelf-mmap), 1)
  override CFLAGS += -DHAVE_LIBELF_MMAP_SUPPORT
endif

104 105 106 107
ifeq ($(feature-reallocarray), 0)
  override CFLAGS += -DCOMPAT_NEED_REALLOCARRAY
endif

108 109 110 111 112
# Append required CFLAGS
override CFLAGS += $(EXTRA_WARNINGS)
override CFLAGS += -Werror -Wall
override CFLAGS += -fPIC
override CFLAGS += $(INCLUDES)
113
override CFLAGS += -fvisibility=hidden
114 115 116 117 118 119 120

ifeq ($(VERBOSE),1)
  Q =
else
  Q = @
endif

121
# Disable command line variables (CFLAGS) override from top
122 123 124 125
# level Makefile (perf), otherwise build Makefile will get
# the same command line setup.
MAKEOVERRIDES=

126 127
all:

128
export srctree OUTPUT CC LD CFLAGS V
J
Jiri Olsa 已提交
129
include $(srctree)/tools/build/Makefile.include
130 131 132

BPF_IN    := $(OUTPUT)libbpf-in.o
LIB_FILE := $(addprefix $(OUTPUT),$(LIB_FILE))
133
VERSION_SCRIPT := libbpf.map
134

135
GLOBAL_SYM_COUNT = $(shell readelf -s --wide $(BPF_IN) | \
A
Andrey Ignatov 已提交
136
			   awk '/GLOBAL/ && /DEFAULT/ && !/UND/ {s++} END{print s}')
137
VERSIONED_SYM_COUNT = $(shell readelf -s --wide $(OUTPUT)libbpf.so | \
A
Andrey Ignatov 已提交
138 139
			      grep -Eo '[^ ]+@LIBBPF_' | cut -d@ -f1 | sort -u | wc -l)

140 141
CMD_TARGETS = $(LIB_FILE)

142 143 144 145 146 147
CXX_TEST_TARGET = $(OUTPUT)test_libbpf

ifeq ($(feature-cxx), 1)
	CMD_TARGETS += $(CXX_TEST_TARGET)
endif

148 149
TARGETS = $(CMD_TARGETS)

150
all: fixdep all_cmd
151

A
Andrey Ignatov 已提交
152
all_cmd: $(CMD_TARGETS) check
153 154

$(BPF_IN): force elfdep bpfdep
155
	@(test -f ../../include/uapi/linux/bpf.h -a -f ../../../include/uapi/linux/bpf.h && ( \
156
	(diff -B ../../include/uapi/linux/bpf.h ../../../include/uapi/linux/bpf.h >/dev/null) || \
157
	echo "Warning: Kernel ABI header at 'tools/include/uapi/linux/bpf.h' differs from latest version at 'include/uapi/linux/bpf.h'" >&2 )) || true
158
	@(test -f ../../include/uapi/linux/bpf_common.h -a -f ../../../include/uapi/linux/bpf_common.h && ( \
159
	(diff -B ../../include/uapi/linux/bpf_common.h ../../../include/uapi/linux/bpf_common.h >/dev/null) || \
160
	echo "Warning: Kernel ABI header at 'tools/include/uapi/linux/bpf_common.h' differs from latest version at 'include/uapi/linux/bpf_common.h'" >&2 )) || true
161 162 163 164 165 166
	@(test -f ../../include/uapi/linux/netlink.h -a -f ../../../include/uapi/linux/netlink.h && ( \
	(diff -B ../../include/uapi/linux/netlink.h ../../../include/uapi/linux/netlink.h >/dev/null) || \
	echo "Warning: Kernel ABI header at 'tools/include/uapi/linux/netlink.h' differs from latest version at 'include/uapi/linux/netlink.h'" >&2 )) || true
	@(test -f ../../include/uapi/linux/if_link.h -a -f ../../../include/uapi/linux/if_link.h && ( \
	(diff -B ../../include/uapi/linux/if_link.h ../../../include/uapi/linux/if_link.h >/dev/null) || \
	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
167 168 169
	@(test -f ../../include/uapi/linux/if_xdp.h -a -f ../../../include/uapi/linux/if_xdp.h && ( \
	(diff -B ../../include/uapi/linux/if_xdp.h ../../../include/uapi/linux/if_xdp.h >/dev/null) || \
	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
170 171 172
	$(Q)$(MAKE) $(build)=libbpf

$(OUTPUT)libbpf.so: $(BPF_IN)
173 174
	$(QUIET_LINK)$(CC) --shared -Wl,--version-script=$(VERSION_SCRIPT) \
		$^ -o $@
175 176 177 178

$(OUTPUT)libbpf.a: $(BPF_IN)
	$(QUIET_LINK)$(RM) $@; $(AR) rcs $@ $^

179
$(OUTPUT)test_libbpf: test_libbpf.cpp $(OUTPUT)libbpf.a
180
	$(QUIET_LINK)$(CXX) $(INCLUDES) $^ -lelf -o $@
181

A
Andrey Ignatov 已提交
182 183 184 185 186 187 188 189 190 191 192 193
check: check_abi

check_abi: $(OUTPUT)libbpf.so
	@if [ "$(GLOBAL_SYM_COUNT)" != "$(VERSIONED_SYM_COUNT)" ]; then	 \
		echo "Warning: Num of global symbols in $(BPF_IN)"	 \
		     "($(GLOBAL_SYM_COUNT)) does NOT match with num of"	 \
		     "versioned symbols in $^ ($(VERSIONED_SYM_COUNT))." \
		     "Please make sure all LIBBPF_API symbols are"	 \
		     "versioned in $(VERSION_SCRIPT)." >&2;		 \
		exit 1;							 \
	fi

194 195 196 197
define do_install
	if [ ! -d '$(DESTDIR_SQ)$2' ]; then		\
		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$2';	\
	fi;						\
198
	$(INSTALL) $1 $(if $3,-m $3,) '$(DESTDIR_SQ)$2'
199 200 201 202 203 204
endef

install_lib: all_cmd
	$(call QUIET_INSTALL, $(LIB_FILE)) \
		$(call do_install,$(LIB_FILE),$(libdir_SQ))

205 206
install_headers:
	$(call QUIET_INSTALL, headers) \
207 208
		$(call do_install,bpf.h,$(prefix)/include/bpf,644); \
		$(call do_install,libbpf.h,$(prefix)/include/bpf,644);
209
		$(call do_install,btf.h,$(prefix)/include/bpf,644);
210

211 212 213 214 215 216 217 218 219
install: install_lib

### Cleaning rules

config-clean:
	$(call QUIET_CLEAN, config)
	$(Q)$(MAKE) -C $(srctree)/tools/build/feature/ clean >/dev/null

clean:
220 221
	$(call QUIET_CLEAN, libbpf) $(RM) $(TARGETS) $(CXX_TEST_TARGET) \
		*.o *~ *.a *.so .*.d .*.cmd LIBBPF-CFLAGS
222
	$(call QUIET_CLEAN, core-gen) $(RM) $(OUTPUT)FEATURE-DUMP.libbpf
223 224 225 226 227 228 229



PHONY += force elfdep bpfdep
force:

elfdep:
230
	@if [ "$(feature-libelf)" != "1" ]; then echo "No libelf found"; exit 1 ; fi
231 232

bpfdep:
233
	@if [ "$(feature-bpf)" != "1" ]; then echo "BPF API too old"; exit 1 ; fi
234 235 236 237

# Declare the contents of the .PHONY variable as phony.  We keep that
# information in a variable so we can use it in if_changed and friends.
.PHONY: $(PHONY)