Makefile 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  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. INSTALL ?= install
  76. RM ?= rm -f
  77. FEATURE_USER = .bpftool
  78. FEATURE_TESTS = libbfd libbfd-liberty libbfd-liberty-z \
  79. disassembler-four-args disassembler-init-styled libcap \
  80. clang-bpf-co-re
  81. FEATURE_DISPLAY = libbfd libbfd-liberty libbfd-liberty-z \
  82. libcap clang-bpf-co-re
  83. check_feat := 1
  84. NON_CHECK_FEAT_TARGETS := clean uninstall doc doc-clean doc-install doc-uninstall
  85. ifdef MAKECMDGOALS
  86. ifeq ($(filter-out $(NON_CHECK_FEAT_TARGETS),$(MAKECMDGOALS)),)
  87. check_feat := 0
  88. endif
  89. endif
  90. ifeq ($(check_feat),1)
  91. ifeq ($(FEATURES_DUMP),)
  92. include $(srctree)/tools/build/Makefile.feature
  93. else
  94. include $(FEATURES_DUMP)
  95. endif
  96. endif
  97. ifeq ($(feature-disassembler-four-args), 1)
  98. CFLAGS += -DDISASM_FOUR_ARGS_SIGNATURE
  99. endif
  100. ifeq ($(feature-disassembler-init-styled), 1)
  101. CFLAGS += -DDISASM_INIT_STYLED
  102. endif
  103. LIBS = $(LIBBPF) -lelf -lz
  104. LIBS_BOOTSTRAP = $(LIBBPF_BOOTSTRAP) -lelf -lz
  105. ifeq ($(feature-libcap), 1)
  106. CFLAGS += -DUSE_LIBCAP
  107. LIBS += -lcap
  108. endif
  109. include $(wildcard $(OUTPUT)*.d)
  110. all: $(OUTPUT)bpftool
  111. BFD_SRCS = jit_disasm.c
  112. SRCS = $(filter-out $(BFD_SRCS),$(wildcard *.c))
  113. ifeq ($(feature-libbfd),1)
  114. LIBS += -lbfd -ldl -lopcodes
  115. else ifeq ($(feature-libbfd-liberty),1)
  116. LIBS += -lbfd -ldl -lopcodes -liberty
  117. else ifeq ($(feature-libbfd-liberty-z),1)
  118. LIBS += -lbfd -ldl -lopcodes -liberty -lz
  119. endif
  120. ifneq ($(filter -lbfd,$(LIBS)),)
  121. CFLAGS += -DHAVE_LIBBFD_SUPPORT
  122. SRCS += $(BFD_SRCS)
  123. endif
  124. HOST_CFLAGS = $(subst -I$(LIBBPF_INCLUDE),-I$(LIBBPF_BOOTSTRAP_INCLUDE),\
  125. $(subst $(CLANG_CROSS_FLAGS),,$(CFLAGS)))
  126. BPFTOOL_BOOTSTRAP := $(BOOTSTRAP_OUTPUT)bpftool
  127. BOOTSTRAP_OBJS = $(addprefix $(BOOTSTRAP_OUTPUT),main.o common.o json_writer.o gen.o btf.o xlated_dumper.o btf_dumper.o disasm.o)
  128. $(BOOTSTRAP_OBJS): $(LIBBPF_BOOTSTRAP)
  129. OBJS = $(patsubst %.c,$(OUTPUT)%.o,$(SRCS)) $(OUTPUT)disasm.o
  130. $(OBJS): $(LIBBPF) $(LIBBPF_INTERNAL_HDRS)
  131. VMLINUX_BTF_PATHS ?= $(if $(O),$(O)/vmlinux) \
  132. $(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux) \
  133. ../../../vmlinux \
  134. /sys/kernel/btf/vmlinux \
  135. /boot/vmlinux-$(shell uname -r)
  136. VMLINUX_BTF ?= $(abspath $(firstword $(wildcard $(VMLINUX_BTF_PATHS))))
  137. bootstrap: $(BPFTOOL_BOOTSTRAP)
  138. ifneq ($(VMLINUX_BTF)$(VMLINUX_H),)
  139. ifeq ($(feature-clang-bpf-co-re),1)
  140. BUILD_BPF_SKELS := 1
  141. $(OUTPUT)vmlinux.h: $(VMLINUX_BTF) $(BPFTOOL_BOOTSTRAP)
  142. ifeq ($(VMLINUX_H),)
  143. $(QUIET_GEN)$(BPFTOOL_BOOTSTRAP) btf dump file $< format c > $@
  144. else
  145. $(Q)cp "$(VMLINUX_H)" $@
  146. endif
  147. $(OUTPUT)%.bpf.o: skeleton/%.bpf.c $(OUTPUT)vmlinux.h $(LIBBPF_BOOTSTRAP)
  148. $(QUIET_CLANG)$(CLANG) \
  149. -I$(or $(OUTPUT),.) \
  150. -I$(srctree)/tools/include/uapi/ \
  151. -I$(LIBBPF_BOOTSTRAP_INCLUDE) \
  152. -g -O2 -Wall -fno-stack-protector \
  153. -target bpf -c $< -o $@
  154. $(Q)$(LLVM_STRIP) -g $@
  155. $(OUTPUT)%.skel.h: $(OUTPUT)%.bpf.o $(BPFTOOL_BOOTSTRAP)
  156. $(QUIET_GEN)$(BPFTOOL_BOOTSTRAP) gen skeleton $< > $@
  157. $(OUTPUT)prog.o: $(OUTPUT)profiler.skel.h
  158. $(OUTPUT)pids.o: $(OUTPUT)pid_iter.skel.h
  159. endif
  160. endif
  161. CFLAGS += $(if $(BUILD_BPF_SKELS),,-DBPFTOOL_WITHOUT_SKELETONS)
  162. $(BOOTSTRAP_OUTPUT)disasm.o: $(srctree)/kernel/bpf/disasm.c
  163. $(QUIET_CC)$(HOSTCC) $(HOST_CFLAGS) -c -MMD $< -o $@
  164. $(OUTPUT)disasm.o: $(srctree)/kernel/bpf/disasm.c
  165. $(QUIET_CC)$(CC) $(CFLAGS) -c -MMD $< -o $@
  166. $(BPFTOOL_BOOTSTRAP): $(BOOTSTRAP_OBJS) $(LIBBPF_BOOTSTRAP)
  167. $(QUIET_LINK)$(HOSTCC) $(HOST_CFLAGS) $(LDFLAGS) $(BOOTSTRAP_OBJS) $(LIBS_BOOTSTRAP) -o $@
  168. $(OUTPUT)bpftool: $(OBJS) $(LIBBPF)
  169. $(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) $(LIBS) -o $@
  170. $(BOOTSTRAP_OUTPUT)%.o: %.c $(LIBBPF_BOOTSTRAP_INTERNAL_HDRS) | $(BOOTSTRAP_OUTPUT)
  171. $(QUIET_CC)$(HOSTCC) $(HOST_CFLAGS) -c -MMD $< -o $@
  172. $(OUTPUT)%.o: %.c
  173. $(QUIET_CC)$(CC) $(CFLAGS) -c -MMD $< -o $@
  174. feature-detect-clean:
  175. $(call QUIET_CLEAN, feature-detect)
  176. $(Q)$(MAKE) -C $(srctree)/tools/build/feature/ clean >/dev/null
  177. clean: $(LIBBPF)-clean $(LIBBPF_BOOTSTRAP)-clean feature-detect-clean
  178. $(call QUIET_CLEAN, bpftool)
  179. $(Q)$(RM) -- $(OUTPUT)bpftool $(OUTPUT)*.o $(OUTPUT)*.d
  180. $(Q)$(RM) -- $(OUTPUT)*.skel.h $(OUTPUT)vmlinux.h
  181. $(Q)$(RM) -r -- $(LIBBPF_OUTPUT) $(BOOTSTRAP_OUTPUT)
  182. $(call QUIET_CLEAN, core-gen)
  183. $(Q)$(RM) -- $(OUTPUT)FEATURE-DUMP.bpftool
  184. $(Q)$(RM) -r -- $(OUTPUT)feature/
  185. install-bin: $(OUTPUT)bpftool
  186. $(call QUIET_INSTALL, bpftool)
  187. $(Q)$(INSTALL) -m 0755 -d $(DESTDIR)$(prefix)/sbin
  188. $(Q)$(INSTALL) $(OUTPUT)bpftool $(DESTDIR)$(prefix)/sbin/bpftool
  189. install: install-bin
  190. $(Q)$(INSTALL) -m 0755 -d $(DESTDIR)$(bash_compdir)
  191. $(Q)$(INSTALL) -m 0644 bash-completion/bpftool $(DESTDIR)$(bash_compdir)
  192. uninstall:
  193. $(call QUIET_UNINST, bpftool)
  194. $(Q)$(RM) -- $(DESTDIR)$(prefix)/sbin/bpftool
  195. $(Q)$(RM) -- $(DESTDIR)$(bash_compdir)/bpftool
  196. doc:
  197. $(call descend,Documentation)
  198. doc-clean:
  199. $(call descend,Documentation,clean)
  200. doc-install:
  201. $(call descend,Documentation,install)
  202. doc-uninstall:
  203. $(call descend,Documentation,uninstall)
  204. FORCE:
  205. .SECONDARY:
  206. .PHONY: all FORCE bootstrap clean install-bin install uninstall
  207. .PHONY: doc doc-clean doc-install doc-uninstall
  208. .DEFAULT_GOAL := all