Makefile 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
  2. include ../../scripts/Makefile.include
  3. ifeq ($(srctree),)
  4. srctree := $(patsubst %/,%,$(dir $(CURDIR)))
  5. srctree := $(patsubst %/,%,$(dir $(srctree)))
  6. srctree := $(patsubst %/,%,$(dir $(srctree)))
  7. endif
  8. ifeq ($(V),1)
  9. Q =
  10. else
  11. Q = @
  12. endif
  13. BPF_DIR = $(srctree)/tools/lib/bpf
  14. ifneq ($(OUTPUT),)
  15. _OUTPUT := $(OUTPUT)
  16. else
  17. _OUTPUT := $(CURDIR)/
  18. endif
  19. BOOTSTRAP_OUTPUT := $(_OUTPUT)bootstrap/
  20. LIBBPF_OUTPUT := $(_OUTPUT)libbpf/
  21. LIBBPF_DESTDIR := $(LIBBPF_OUTPUT)
  22. LIBBPF_INCLUDE := $(LIBBPF_DESTDIR)include
  23. LIBBPF_HDRS_DIR := $(LIBBPF_INCLUDE)/bpf
  24. LIBBPF := $(LIBBPF_OUTPUT)libbpf.a
  25. LIBBPF_BOOTSTRAP_OUTPUT := $(BOOTSTRAP_OUTPUT)libbpf/
  26. LIBBPF_BOOTSTRAP_DESTDIR := $(LIBBPF_BOOTSTRAP_OUTPUT)
  27. LIBBPF_BOOTSTRAP_INCLUDE := $(LIBBPF_BOOTSTRAP_DESTDIR)include
  28. LIBBPF_BOOTSTRAP_HDRS_DIR := $(LIBBPF_BOOTSTRAP_INCLUDE)/bpf
  29. LIBBPF_BOOTSTRAP := $(LIBBPF_BOOTSTRAP_OUTPUT)libbpf.a
  30. # We need to copy hashmap.h, nlattr.h, relo_core.h and libbpf_internal.h
  31. # which are not otherwise exported by libbpf, but still required by bpftool.
  32. LIBBPF_INTERNAL_HDRS := $(addprefix $(LIBBPF_HDRS_DIR)/,hashmap.h nlattr.h relo_core.h libbpf_internal.h)
  33. LIBBPF_BOOTSTRAP_INTERNAL_HDRS := $(addprefix $(LIBBPF_BOOTSTRAP_HDRS_DIR)/,hashmap.h relo_core.h libbpf_internal.h)
  34. $(LIBBPF_OUTPUT) $(BOOTSTRAP_OUTPUT) $(LIBBPF_BOOTSTRAP_OUTPUT) $(LIBBPF_HDRS_DIR) $(LIBBPF_BOOTSTRAP_HDRS_DIR):
  35. $(QUIET_MKDIR)mkdir -p $@
  36. $(LIBBPF): $(wildcard $(BPF_DIR)/*.[ch] $(BPF_DIR)/Makefile) | $(LIBBPF_OUTPUT)
  37. $(Q)$(MAKE) -C $(BPF_DIR) OUTPUT=$(LIBBPF_OUTPUT) \
  38. DESTDIR=$(LIBBPF_DESTDIR:/=) prefix= $(LIBBPF) install_headers
  39. $(LIBBPF_INTERNAL_HDRS): $(LIBBPF_HDRS_DIR)/%.h: $(BPF_DIR)/%.h | $(LIBBPF_HDRS_DIR)
  40. $(call QUIET_INSTALL, $@)
  41. $(Q)install -m 644 -t $(LIBBPF_HDRS_DIR) $<
  42. $(LIBBPF_BOOTSTRAP): $(wildcard $(BPF_DIR)/*.[ch] $(BPF_DIR)/Makefile) | $(LIBBPF_BOOTSTRAP_OUTPUT)
  43. $(Q)$(MAKE) -C $(BPF_DIR) OUTPUT=$(LIBBPF_BOOTSTRAP_OUTPUT) \
  44. DESTDIR=$(LIBBPF_BOOTSTRAP_DESTDIR:/=) prefix= \
  45. ARCH= CROSS_COMPILE= CC="$(HOSTCC)" LD="$(HOSTLD)" AR="$(HOSTAR)" $@ install_headers
  46. $(LIBBPF_BOOTSTRAP_INTERNAL_HDRS): $(LIBBPF_BOOTSTRAP_HDRS_DIR)/%.h: $(BPF_DIR)/%.h | $(LIBBPF_BOOTSTRAP_HDRS_DIR)
  47. $(call QUIET_INSTALL, $@)
  48. $(Q)install -m 644 -t $(LIBBPF_BOOTSTRAP_HDRS_DIR) $<
  49. $(LIBBPF)-clean: FORCE | $(LIBBPF_OUTPUT)
  50. $(call QUIET_CLEAN, libbpf)
  51. $(Q)$(MAKE) -C $(BPF_DIR) OUTPUT=$(LIBBPF_OUTPUT) clean >/dev/null
  52. $(LIBBPF_BOOTSTRAP)-clean: FORCE | $(LIBBPF_BOOTSTRAP_OUTPUT)
  53. $(call QUIET_CLEAN, libbpf-bootstrap)
  54. $(Q)$(MAKE) -C $(BPF_DIR) OUTPUT=$(LIBBPF_BOOTSTRAP_OUTPUT) clean >/dev/null
  55. prefix ?= /usr/local
  56. bash_compdir ?= /usr/share/bash-completion/completions
  57. CFLAGS += -O2
  58. CFLAGS += -W -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers
  59. CFLAGS += $(filter-out -Wswitch-enum -Wnested-externs,$(EXTRA_WARNINGS))
  60. CFLAGS += -DPACKAGE='"bpftool"' -D__EXPORTED_HEADERS__ \
  61. -I$(or $(OUTPUT),.) \
  62. -I$(LIBBPF_INCLUDE) \
  63. -I$(srctree)/kernel/bpf/ \
  64. -I$(srctree)/tools/include \
  65. -I$(srctree)/tools/include/uapi
  66. ifneq ($(BPFTOOL_VERSION),)
  67. CFLAGS += -DBPFTOOL_VERSION='"$(BPFTOOL_VERSION)"'
  68. endif
  69. ifneq ($(EXTRA_CFLAGS),)
  70. CFLAGS += $(EXTRA_CFLAGS)
  71. endif
  72. ifneq ($(EXTRA_LDFLAGS),)
  73. LDFLAGS += $(EXTRA_LDFLAGS)
  74. endif
  75. HOST_CFLAGS := $(subst -I$(LIBBPF_INCLUDE),-I$(LIBBPF_BOOTSTRAP_INCLUDE),\
  76. $(subst $(CLANG_CROSS_FLAGS),,$(CFLAGS)))
  77. HOST_LDFLAGS := $(LDFLAGS)
  78. INSTALL ?= install
  79. RM ?= rm -f
  80. FEATURE_USER = .bpftool
  81. FEATURE_TESTS := clang-bpf-co-re
  82. FEATURE_TESTS += llvm
  83. FEATURE_TESTS += libcap
  84. FEATURE_TESTS += libbfd
  85. FEATURE_TESTS += libbfd-liberty
  86. FEATURE_TESTS += libbfd-liberty-z
  87. FEATURE_TESTS += disassembler-four-args
  88. FEATURE_TESTS += disassembler-init-styled
  89. FEATURE_DISPLAY := clang-bpf-co-re
  90. FEATURE_DISPLAY += llvm
  91. FEATURE_DISPLAY += libcap
  92. FEATURE_DISPLAY += libbfd
  93. FEATURE_DISPLAY += libbfd-liberty
  94. FEATURE_DISPLAY += libbfd-liberty-z
  95. check_feat := 1
  96. NON_CHECK_FEAT_TARGETS := clean uninstall doc doc-clean doc-install doc-uninstall
  97. ifdef MAKECMDGOALS
  98. ifeq ($(filter-out $(NON_CHECK_FEAT_TARGETS),$(MAKECMDGOALS)),)
  99. check_feat := 0
  100. endif
  101. endif
  102. ifeq ($(check_feat),1)
  103. ifeq ($(FEATURES_DUMP),)
  104. include $(srctree)/tools/build/Makefile.feature
  105. else
  106. include $(FEATURES_DUMP)
  107. endif
  108. endif
  109. LIBS = $(LIBBPF) -lelf -lz
  110. LIBS_BOOTSTRAP = $(LIBBPF_BOOTSTRAP) -lelf -lz
  111. ifeq ($(feature-libcap), 1)
  112. CFLAGS += -DUSE_LIBCAP
  113. LIBS += -lcap
  114. endif
  115. include $(wildcard $(OUTPUT)*.d)
  116. all: $(OUTPUT)bpftool
  117. SRCS := $(wildcard *.c)
  118. ifeq ($(feature-llvm),1)
  119. # If LLVM is available, use it for JIT disassembly
  120. CFLAGS += -DHAVE_LLVM_SUPPORT
  121. LLVM_CONFIG_LIB_COMPONENTS := mcdisassembler all-targets
  122. CFLAGS += $(shell $(LLVM_CONFIG) --cflags)
  123. LIBS += $(shell $(LLVM_CONFIG) --libs $(LLVM_CONFIG_LIB_COMPONENTS))
  124. ifeq ($(shell $(LLVM_CONFIG) --shared-mode),static)
  125. LIBS += $(shell $(LLVM_CONFIG) --system-libs $(LLVM_CONFIG_LIB_COMPONENTS))
  126. LIBS += -lstdc++
  127. endif
  128. LDFLAGS += $(shell $(LLVM_CONFIG) --ldflags)
  129. else
  130. # Fall back on libbfd
  131. ifeq ($(feature-libbfd),1)
  132. LIBS += -lbfd -ldl -lopcodes
  133. else ifeq ($(feature-libbfd-liberty),1)
  134. LIBS += -lbfd -ldl -lopcodes -liberty
  135. else ifeq ($(feature-libbfd-liberty-z),1)
  136. LIBS += -lbfd -ldl -lopcodes -liberty -lz
  137. endif
  138. # If one of the above feature combinations is set, we support libbfd
  139. ifneq ($(filter -lbfd,$(LIBS)),)
  140. CFLAGS += -DHAVE_LIBBFD_SUPPORT
  141. # Libbfd interface changed over time, figure out what we need
  142. ifeq ($(feature-disassembler-four-args), 1)
  143. CFLAGS += -DDISASM_FOUR_ARGS_SIGNATURE
  144. endif
  145. ifeq ($(feature-disassembler-init-styled), 1)
  146. CFLAGS += -DDISASM_INIT_STYLED
  147. endif
  148. endif
  149. endif
  150. ifeq ($(filter -DHAVE_LLVM_SUPPORT -DHAVE_LIBBFD_SUPPORT,$(CFLAGS)),)
  151. # No support for JIT disassembly
  152. SRCS := $(filter-out jit_disasm.c,$(SRCS))
  153. endif
  154. BPFTOOL_BOOTSTRAP := $(BOOTSTRAP_OUTPUT)bpftool
  155. BOOTSTRAP_OBJS = $(addprefix $(BOOTSTRAP_OUTPUT),main.o common.o json_writer.o gen.o btf.o)
  156. $(BOOTSTRAP_OBJS): $(LIBBPF_BOOTSTRAP)
  157. OBJS = $(patsubst %.c,$(OUTPUT)%.o,$(SRCS)) $(OUTPUT)disasm.o
  158. $(OBJS): $(LIBBPF) $(LIBBPF_INTERNAL_HDRS)
  159. VMLINUX_BTF_PATHS ?= $(if $(O),$(O)/vmlinux) \
  160. $(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux) \
  161. ../../../vmlinux \
  162. /sys/kernel/btf/vmlinux \
  163. /boot/vmlinux-$(shell uname -r)
  164. VMLINUX_BTF ?= $(abspath $(firstword $(wildcard $(VMLINUX_BTF_PATHS))))
  165. bootstrap: $(BPFTOOL_BOOTSTRAP)
  166. ifneq ($(VMLINUX_BTF)$(VMLINUX_H),)
  167. ifeq ($(feature-clang-bpf-co-re),1)
  168. BUILD_BPF_SKELS := 1
  169. ifeq ($(VMLINUX_H),)
  170. $(OUTPUT)vmlinux.h: $(VMLINUX_BTF) $(BPFTOOL_BOOTSTRAP)
  171. $(QUIET_GEN)$(BPFTOOL_BOOTSTRAP) btf dump file $< format c > $@
  172. else
  173. $(OUTPUT)vmlinux.h: $(VMLINUX_H)
  174. $(Q)cp "$(VMLINUX_H)" $@
  175. endif
  176. $(OUTPUT)%.bpf.o: skeleton/%.bpf.c $(OUTPUT)vmlinux.h $(LIBBPF_BOOTSTRAP)
  177. $(QUIET_CLANG)$(CLANG) \
  178. -I$(or $(OUTPUT),.) \
  179. -I$(srctree)/tools/include/uapi/ \
  180. -I$(LIBBPF_BOOTSTRAP_INCLUDE) \
  181. -g -O2 -Wall -fno-stack-protector \
  182. --target=bpf -c $< -o $@
  183. $(Q)$(LLVM_STRIP) -g $@
  184. $(OUTPUT)%.skel.h: $(OUTPUT)%.bpf.o $(BPFTOOL_BOOTSTRAP)
  185. $(QUIET_GEN)$(BPFTOOL_BOOTSTRAP) gen skeleton $< > $@
  186. $(OUTPUT)prog.o: $(OUTPUT)profiler.skel.h
  187. $(OUTPUT)pids.o: $(OUTPUT)pid_iter.skel.h
  188. endif
  189. endif
  190. CFLAGS += $(if $(BUILD_BPF_SKELS),,-DBPFTOOL_WITHOUT_SKELETONS)
  191. $(OUTPUT)disasm.o: $(srctree)/kernel/bpf/disasm.c
  192. $(QUIET_CC)$(CC) $(CFLAGS) -c -MMD $< -o $@
  193. $(BPFTOOL_BOOTSTRAP): $(BOOTSTRAP_OBJS) $(LIBBPF_BOOTSTRAP)
  194. $(QUIET_LINK)$(HOSTCC) $(HOST_CFLAGS) $(HOST_LDFLAGS) $(BOOTSTRAP_OBJS) $(LIBS_BOOTSTRAP) -o $@
  195. $(OUTPUT)bpftool: $(OBJS) $(LIBBPF)
  196. $(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) $(LIBS) -o $@
  197. $(BOOTSTRAP_OUTPUT)%.o: %.c $(LIBBPF_BOOTSTRAP_INTERNAL_HDRS) | $(BOOTSTRAP_OUTPUT)
  198. $(QUIET_CC)$(HOSTCC) $(HOST_CFLAGS) -c -MMD $< -o $@
  199. $(OUTPUT)%.o: %.c
  200. $(QUIET_CC)$(CC) $(CFLAGS) -c -MMD $< -o $@
  201. feature-detect-clean:
  202. $(call QUIET_CLEAN, feature-detect)
  203. $(Q)$(MAKE) -C $(srctree)/tools/build/feature/ clean >/dev/null
  204. clean: $(LIBBPF)-clean $(LIBBPF_BOOTSTRAP)-clean feature-detect-clean
  205. $(call QUIET_CLEAN, bpftool)
  206. $(Q)$(RM) -- $(OUTPUT)bpftool $(OUTPUT)*.o $(OUTPUT)*.d
  207. $(Q)$(RM) -- $(OUTPUT)*.skel.h $(OUTPUT)vmlinux.h
  208. $(Q)$(RM) -r -- $(LIBBPF_OUTPUT) $(BOOTSTRAP_OUTPUT)
  209. $(call QUIET_CLEAN, core-gen)
  210. $(Q)$(RM) -- $(OUTPUT)FEATURE-DUMP.bpftool
  211. $(Q)$(RM) -r -- $(OUTPUT)feature/
  212. install-bin: $(OUTPUT)bpftool
  213. $(call QUIET_INSTALL, bpftool)
  214. $(Q)$(INSTALL) -m 0755 -d $(DESTDIR)$(prefix)/sbin
  215. $(Q)$(INSTALL) $(OUTPUT)bpftool $(DESTDIR)$(prefix)/sbin/bpftool
  216. install: install-bin
  217. $(Q)$(INSTALL) -m 0755 -d $(DESTDIR)$(bash_compdir)
  218. $(Q)$(INSTALL) -m 0644 bash-completion/bpftool $(DESTDIR)$(bash_compdir)
  219. uninstall:
  220. $(call QUIET_UNINST, bpftool)
  221. $(Q)$(RM) -- $(DESTDIR)$(prefix)/sbin/bpftool
  222. $(Q)$(RM) -- $(DESTDIR)$(bash_compdir)/bpftool
  223. doc:
  224. $(call descend,Documentation)
  225. doc-clean:
  226. $(call descend,Documentation,clean)
  227. doc-install:
  228. $(call descend,Documentation,install)
  229. doc-uninstall:
  230. $(call descend,Documentation,uninstall)
  231. FORCE:
  232. .SECONDARY:
  233. .PHONY: all FORCE bootstrap clean install-bin install uninstall
  234. .PHONY: doc doc-clean doc-install doc-uninstall
  235. .DEFAULT_GOAL := all
  236. # Delete partially updated (corrupted) files on error
  237. .DELETE_ON_ERROR: