Makefile 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. # SPDX-License-Identifier: GPL-2.0
  2. OUTPUT := .output
  3. abs_out := $(abspath $(OUTPUT))
  4. CLANG ?= clang
  5. LLC ?= llc
  6. LLVM_STRIP ?= llvm-strip
  7. TOOLS_PATH := $(abspath ../../../../tools)
  8. BPFTOOL_SRC := $(TOOLS_PATH)/bpf/bpftool
  9. BPFTOOL_OUTPUT := $(abs_out)/bpftool
  10. DEFAULT_BPFTOOL := $(BPFTOOL_OUTPUT)/bootstrap/bpftool
  11. BPFTOOL ?= $(DEFAULT_BPFTOOL)
  12. LIBBPF_SRC := $(TOOLS_PATH)/lib/bpf
  13. LIBBPF_OUTPUT := $(abs_out)/libbpf
  14. LIBBPF_DESTDIR := $(LIBBPF_OUTPUT)
  15. LIBBPF_INCLUDE := $(LIBBPF_DESTDIR)/include
  16. BPFOBJ := $(LIBBPF_OUTPUT)/libbpf.a
  17. INCLUDES := -I$(OUTPUT) -I$(LIBBPF_INCLUDE) -I$(TOOLS_PATH)/include/uapi
  18. CFLAGS := -g -Wall
  19. VMLINUX_BTF_PATHS ?= $(if $(O),$(O)/vmlinux) \
  20. $(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux) \
  21. ../../../../vmlinux \
  22. /sys/kernel/btf/vmlinux \
  23. /boot/vmlinux-$(shell uname -r)
  24. VMLINUX_BTF ?= $(abspath $(firstword $(wildcard $(VMLINUX_BTF_PATHS))))
  25. ifeq ($(VMLINUX_BTF),)
  26. $(error Cannot find a vmlinux for VMLINUX_BTF at any of "$(VMLINUX_BTF_PATHS)")
  27. endif
  28. ifeq ($(V),1)
  29. Q =
  30. msg =
  31. else
  32. Q = @
  33. msg = @printf ' %-8s %s%s\n' "$(1)" "$(notdir $(2))" "$(if $(3), $(3))";
  34. MAKEFLAGS += --no-print-directory
  35. submake_extras := feature_display=0
  36. endif
  37. .DELETE_ON_ERROR:
  38. .PHONY: all clean
  39. SOURCES = $(wildcard *.bpf.c)
  40. TARGETS = $(SOURCES:.bpf.c=.bpf.o)
  41. all: $(TARGETS)
  42. clean:
  43. $(call msg,CLEAN)
  44. $(Q)rm -rf $(OUTPUT) $(TARGETS)
  45. %.bpf.o: %.bpf.c vmlinux.h $(BPFOBJ) | $(OUTPUT)
  46. $(call msg,BPF,$@)
  47. $(Q)$(CLANG) -g -O2 --target=bpf -Wall -Werror $(INCLUDES) \
  48. -c $(filter %.c,$^) -o $@ && \
  49. $(LLVM_STRIP) -g $@
  50. vmlinux.h: $(VMLINUX_BTF) $(BPFTOOL) | $(INCLUDE_DIR)
  51. ifeq ($(VMLINUX_H),)
  52. $(call msg,GEN,,$@)
  53. $(Q)$(BPFTOOL) btf dump file $(VMLINUX_BTF) format c > $@
  54. else
  55. $(call msg,CP,,$@)
  56. $(Q)cp "$(VMLINUX_H)" $@
  57. endif
  58. $(OUTPUT) $(LIBBPF_OUTPUT) $(BPFTOOL_OUTPUT):
  59. $(call msg,MKDIR,$@)
  60. $(Q)mkdir -p $@
  61. $(BPFOBJ): $(wildcard $(LIBBPF_SRC)/*.[ch] $(LIBBPF_SRC)/Makefile) | $(LIBBPF_OUTPUT)
  62. $(Q)$(MAKE) $(submake_extras) -C $(LIBBPF_SRC) \
  63. OUTPUT=$(abspath $(dir $@))/ prefix= \
  64. DESTDIR=$(LIBBPF_DESTDIR) $(abspath $@) install_headers
  65. ifeq ($(CROSS_COMPILE),)
  66. $(DEFAULT_BPFTOOL): $(BPFOBJ) | $(BPFTOOL_OUTPUT)
  67. $(Q)$(MAKE) $(submake_extras) -C $(BPFTOOL_SRC) \
  68. OUTPUT=$(BPFTOOL_OUTPUT)/ \
  69. LIBBPF_BOOTSTRAP_OUTPUT=$(LIBBPF_OUTPUT)/ \
  70. LIBBPF_BOOTSTRAP_DESTDIR=$(LIBBPF_DESTDIR)/ bootstrap
  71. else
  72. $(DEFAULT_BPFTOOL): | $(BPFTOOL_OUTPUT)
  73. $(Q)$(MAKE) $(submake_extras) -C $(BPFTOOL_SRC) \
  74. OUTPUT=$(BPFTOOL_OUTPUT)/ bootstrap
  75. endif