| xj | b04a402 | 2021-11-25 15:01:52 +0800 | [diff] [blame] | 1 | # SPDX-License-Identifier: GPL-2.0 | 
|  | 2 | # Most of this file is copied from tools/lib/traceevent/Makefile | 
|  | 3 |  | 
|  | 4 | BPF_VERSION = 0 | 
|  | 5 | BPF_PATCHLEVEL = 0 | 
|  | 6 | BPF_EXTRAVERSION = 1 | 
|  | 7 |  | 
|  | 8 | MAKEFLAGS += --no-print-directory | 
|  | 9 |  | 
|  | 10 | ifeq ($(srctree),) | 
|  | 11 | srctree := $(patsubst %/,%,$(dir $(CURDIR))) | 
|  | 12 | srctree := $(patsubst %/,%,$(dir $(srctree))) | 
|  | 13 | srctree := $(patsubst %/,%,$(dir $(srctree))) | 
|  | 14 | #$(info Determined 'srctree' to be $(srctree)) | 
|  | 15 | 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 |  | 
|  | 32 | INSTALL = install | 
|  | 33 |  | 
|  | 34 | # Use DESTDIR for installing into a different root directory. | 
|  | 35 | # This is useful for building a package. The program will be | 
|  | 36 | # installed in this directory as if it was the root directory. | 
|  | 37 | # Then the build tool can move it later. | 
|  | 38 | DESTDIR ?= | 
|  | 39 | DESTDIR_SQ = '$(subst ','\'',$(DESTDIR))' | 
|  | 40 |  | 
|  | 41 | include $(srctree)/tools/scripts/Makefile.arch | 
|  | 42 |  | 
|  | 43 | ifeq ($(LP64), 1) | 
|  | 44 | libdir_relative = lib64 | 
|  | 45 | else | 
|  | 46 | libdir_relative = lib | 
|  | 47 | endif | 
|  | 48 |  | 
|  | 49 | prefix ?= /usr/local | 
|  | 50 | libdir = $(prefix)/$(libdir_relative) | 
|  | 51 | man_dir = $(prefix)/share/man | 
|  | 52 | man_dir_SQ = '$(subst ','\'',$(man_dir))' | 
|  | 53 |  | 
|  | 54 | export man_dir man_dir_SQ INSTALL | 
|  | 55 | export DESTDIR DESTDIR_SQ | 
|  | 56 |  | 
|  | 57 | include ../../scripts/Makefile.include | 
|  | 58 |  | 
|  | 59 | # copy a bit from Linux kbuild | 
|  | 60 |  | 
|  | 61 | ifeq ("$(origin V)", "command line") | 
|  | 62 | VERBOSE = $(V) | 
|  | 63 | endif | 
|  | 64 | ifndef VERBOSE | 
|  | 65 | VERBOSE = 0 | 
|  | 66 | endif | 
|  | 67 |  | 
|  | 68 | FEATURE_USER = .libbpf | 
|  | 69 | FEATURE_TESTS = libelf libelf-mmap bpf reallocarray | 
|  | 70 | FEATURE_DISPLAY = libelf bpf | 
|  | 71 |  | 
|  | 72 | INCLUDES = -I. -I$(srctree)/tools/include -I$(srctree)/tools/arch/$(ARCH)/include/uapi -I$(srctree)/tools/include/uapi -I$(srctree)/tools/perf | 
|  | 73 | FEATURE_CHECK_CFLAGS-bpf = $(INCLUDES) | 
|  | 74 |  | 
|  | 75 | check_feat := 1 | 
|  | 76 | NON_CHECK_FEAT_TARGETS := clean TAGS tags cscope help | 
|  | 77 | ifdef MAKECMDGOALS | 
|  | 78 | ifeq ($(filter-out $(NON_CHECK_FEAT_TARGETS),$(MAKECMDGOALS)),) | 
|  | 79 | check_feat := 0 | 
|  | 80 | endif | 
|  | 81 | endif | 
|  | 82 |  | 
|  | 83 | ifeq ($(check_feat),1) | 
|  | 84 | ifeq ($(FEATURES_DUMP),) | 
|  | 85 | include $(srctree)/tools/build/Makefile.feature | 
|  | 86 | else | 
|  | 87 | include $(FEATURES_DUMP) | 
|  | 88 | endif | 
|  | 89 | endif | 
|  | 90 |  | 
|  | 91 | export prefix libdir src obj | 
|  | 92 |  | 
|  | 93 | # Shell quotes | 
|  | 94 | libdir_SQ = $(subst ','\'',$(libdir)) | 
|  | 95 | libdir_relative_SQ = $(subst ','\'',$(libdir_relative)) | 
|  | 96 |  | 
|  | 97 | LIB_FILE = libbpf.a libbpf.so | 
|  | 98 |  | 
|  | 99 | VERSION		= $(BPF_VERSION) | 
|  | 100 | PATCHLEVEL	= $(BPF_PATCHLEVEL) | 
|  | 101 | EXTRAVERSION	= $(BPF_EXTRAVERSION) | 
|  | 102 |  | 
|  | 103 | OBJ		= $@ | 
|  | 104 | N		= | 
|  | 105 |  | 
|  | 106 | LIBBPF_VERSION = $(BPF_VERSION).$(BPF_PATCHLEVEL).$(BPF_EXTRAVERSION) | 
|  | 107 |  | 
|  | 108 | # Set compile option CFLAGS | 
|  | 109 | ifdef EXTRA_CFLAGS | 
|  | 110 | CFLAGS := $(EXTRA_CFLAGS) | 
|  | 111 | 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 | 
|  | 121 | endif | 
|  | 122 |  | 
|  | 123 | # Append required CFLAGS | 
|  | 124 | override CFLAGS += $(EXTRA_WARNINGS) | 
|  | 125 | override CFLAGS += -Werror -Wall | 
|  | 126 | override CFLAGS += -fPIC | 
|  | 127 | override CFLAGS += $(INCLUDES) | 
|  | 128 |  | 
|  | 129 | ifeq ($(VERBOSE),1) | 
|  | 130 | Q = | 
|  | 131 | else | 
|  | 132 | Q = @ | 
|  | 133 | endif | 
|  | 134 |  | 
|  | 135 | # Disable command line variables (CFLAGS) override from top | 
|  | 136 | # level Makefile (perf), otherwise build Makefile will get | 
|  | 137 | # the same command line setup. | 
|  | 138 | MAKEOVERRIDES= | 
|  | 139 |  | 
|  | 140 | all: | 
|  | 141 |  | 
|  | 142 | export srctree OUTPUT CC LD CFLAGS V | 
|  | 143 | include $(srctree)/tools/build/Makefile.include | 
|  | 144 |  | 
|  | 145 | BPF_IN    := $(OUTPUT)libbpf-in.o | 
|  | 146 | LIB_FILE := $(addprefix $(OUTPUT),$(LIB_FILE)) | 
|  | 147 |  | 
|  | 148 | CMD_TARGETS = $(LIB_FILE) | 
|  | 149 |  | 
|  | 150 | TARGETS = $(CMD_TARGETS) | 
|  | 151 |  | 
|  | 152 | all: fixdep | 
|  | 153 | $(Q)$(MAKE) all_cmd | 
|  | 154 |  | 
|  | 155 | all_cmd: $(CMD_TARGETS) | 
|  | 156 |  | 
|  | 157 | $(BPF_IN): force elfdep bpfdep | 
|  | 158 | @(test -f ../../include/uapi/linux/bpf.h -a -f ../../../include/uapi/linux/bpf.h && ( \ | 
|  | 159 | (diff -B ../../include/uapi/linux/bpf.h ../../../include/uapi/linux/bpf.h >/dev/null) || \ | 
|  | 160 | echo "Warning: Kernel ABI header at 'tools/include/uapi/linux/bpf.h' differs from latest version at 'include/uapi/linux/bpf.h'" >&2 )) || true | 
|  | 161 | @(test -f ../../include/uapi/linux/bpf_common.h -a -f ../../../include/uapi/linux/bpf_common.h && ( \ | 
|  | 162 | (diff -B ../../include/uapi/linux/bpf_common.h ../../../include/uapi/linux/bpf_common.h >/dev/null) || \ | 
|  | 163 | 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 | 
|  | 164 | @(test -f ../../include/uapi/linux/netlink.h -a -f ../../../include/uapi/linux/netlink.h && ( \ | 
|  | 165 | (diff -B ../../include/uapi/linux/netlink.h ../../../include/uapi/linux/netlink.h >/dev/null) || \ | 
|  | 166 | echo "Warning: Kernel ABI header at 'tools/include/uapi/linux/netlink.h' differs from latest version at 'include/uapi/linux/netlink.h'" >&2 )) || true | 
|  | 167 | @(test -f ../../include/uapi/linux/if_link.h -a -f ../../../include/uapi/linux/if_link.h && ( \ | 
|  | 168 | (diff -B ../../include/uapi/linux/if_link.h ../../../include/uapi/linux/if_link.h >/dev/null) || \ | 
|  | 169 | 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 | 
|  | 171 |  | 
|  | 172 | $(OUTPUT)libbpf.so: $(BPF_IN) | 
|  | 173 | $(QUIET_LINK)$(CC) --shared $^ -o $@ | 
|  | 174 |  | 
|  | 175 | $(OUTPUT)libbpf.a: $(BPF_IN) | 
|  | 176 | $(QUIET_LINK)$(RM) $@; $(AR) rcs $@ $^ | 
|  | 177 |  | 
|  | 178 | define do_install | 
|  | 179 | if [ ! -d '$(DESTDIR_SQ)$2' ]; then		\ | 
|  | 180 | $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$2';	\ | 
|  | 181 | fi;						\ | 
|  | 182 | $(INSTALL) $1 $(if $3,-m $3,) '$(DESTDIR_SQ)$2' | 
|  | 183 | endef | 
|  | 184 |  | 
|  | 185 | install_lib: all_cmd | 
|  | 186 | $(call QUIET_INSTALL, $(LIB_FILE)) \ | 
|  | 187 | $(call do_install,$(LIB_FILE),$(libdir_SQ)) | 
|  | 188 |  | 
|  | 189 | install_headers: | 
|  | 190 | $(call QUIET_INSTALL, headers) \ | 
|  | 191 | $(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); | 
|  | 194 |  | 
|  | 195 | install: install_lib | 
|  | 196 |  | 
|  | 197 | ### Cleaning rules | 
|  | 198 |  | 
|  | 199 | config-clean: | 
|  | 200 | $(call QUIET_CLEAN, config) | 
|  | 201 | $(Q)$(MAKE) -C $(srctree)/tools/build/feature/ clean >/dev/null | 
|  | 202 |  | 
|  | 203 | clean: | 
|  | 204 | $(call QUIET_CLEAN, libbpf) $(RM) *.o *~ $(TARGETS) *.a *.so .*.d .*.cmd \ | 
|  | 205 | $(RM) LIBBPF-CFLAGS | 
|  | 206 | $(call QUIET_CLEAN, core-gen) $(RM) $(OUTPUT)FEATURE-DUMP.libbpf | 
|  | 207 |  | 
|  | 208 |  | 
|  | 209 |  | 
|  | 210 | PHONY += force elfdep bpfdep | 
|  | 211 | force: | 
|  | 212 |  | 
|  | 213 | elfdep: | 
|  | 214 | @if [ "$(feature-libelf)" != "1" ]; then echo "No libelf found"; exit 1 ; fi | 
|  | 215 |  | 
|  | 216 | bpfdep: | 
|  | 217 | @if [ "$(feature-bpf)" != "1" ]; then echo "BPF API too old"; exit 1 ; fi | 
|  | 218 |  | 
|  | 219 | # Declare the contents of the .PHONY variable as phony.  We keep that | 
|  | 220 | # information in a variable so we can use it in if_changed and friends. | 
|  | 221 | .PHONY: $(PHONY) |