1# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) 2OUTPUT := .output 3CLANG ?= clang 4LLVM_STRIP ?= llvm-strip 5BPFTOOL ?= bin/bpftool 6LIBBPF_SRC := $(abspath ../src/cc/libbpf/src) 7LIBBPF_OBJ := $(abspath $(OUTPUT)/libbpf.a) 8INCLUDES := -I$(OUTPUT) -I../src/cc/libbpf/include/uapi 9CFLAGS := -g -O2 -Wall 10BPFCFLAGS := -g -O2 -Wall 11INSTALL ?= install 12prefix ?= /usr/local 13ARCH := $(shell uname -m | sed 's/x86_64/x86/' | sed 's/aarch64/arm64/' | sed 's/ppc64le/powerpc/' | sed 's/mips.*/mips/') 14 15ifeq ($(wildcard $(ARCH)/),) 16$(error Architecture $(ARCH) is not supported yet. Please open an issue) 17endif 18 19APPS = \ 20 bashreadline \ 21 bindsnoop \ 22 biolatency \ 23 biopattern \ 24 biosnoop \ 25 biostacks \ 26 bitesize \ 27 cachestat \ 28 cpudist \ 29 cpufreq \ 30 drsnoop \ 31 execsnoop \ 32 exitsnoop \ 33 filelife \ 34 filetop \ 35 fsdist \ 36 fsslower \ 37 funclatency \ 38 gethostlatency \ 39 hardirqs \ 40 klockstat \ 41 ksnoop \ 42 llcstat \ 43 mountsnoop \ 44 numamove \ 45 offcputime \ 46 oomkill \ 47 opensnoop \ 48 readahead \ 49 runqlat \ 50 runqlen \ 51 runqslower \ 52 softirqs \ 53 solisten \ 54 statsnoop \ 55 syscount \ 56 tcpconnect \ 57 tcpconnlat \ 58 tcprtt \ 59 tcpsynbl \ 60 vfsstat \ 61 # 62 63FSDIST_ALIASES = btrfsdist ext4dist nfsdist xfsdist 64FSSLOWER_ALIASES = btrfsslower ext4slower nfsslower xfsslower 65APP_ALIASES = $(FSDIST_ALIASES) $(FSSLOWER_ALIASES) 66 67COMMON_OBJ = \ 68 $(OUTPUT)/trace_helpers.o \ 69 $(OUTPUT)/syscall_helpers.o \ 70 $(OUTPUT)/errno_helpers.o \ 71 $(OUTPUT)/map_helpers.o \ 72 $(OUTPUT)/uprobe_helpers.o \ 73 # 74 75.PHONY: all 76all: $(APPS) $(APP_ALIASES) 77 78ifeq ($(V),1) 79Q = 80msg = 81else 82Q = @ 83msg = @printf ' %-8s %s%s\n' "$(1)" "$(notdir $(2))" "$(if $(3), $(3))"; 84MAKEFLAGS += --no-print-directory 85endif 86 87.PHONY: clean 88clean: 89 $(call msg,CLEAN) 90 $(Q)rm -rf $(OUTPUT) $(APPS) $(APP_ALIASES) 91 92$(OUTPUT) $(OUTPUT)/libbpf: 93 $(call msg,MKDIR,$@) 94 $(Q)mkdir -p $@ 95 96$(APPS): %: $(OUTPUT)/%.o $(LIBBPF_OBJ) $(COMMON_OBJ) | $(OUTPUT) 97 $(call msg,BINARY,$@) 98 $(Q)$(CC) $(CFLAGS) $^ $(LDFLAGS) -lelf -lz -o $@ 99 100$(patsubst %,$(OUTPUT)/%.o,$(APPS)): %.o: %.skel.h 101 102$(OUTPUT)/%.o: %.c $(wildcard %.h) $(LIBBPF_OBJ) | $(OUTPUT) 103 $(call msg,CC,$@) 104 $(Q)$(CC) $(CFLAGS) $(INCLUDES) -c $(filter %.c,$^) -o $@ 105 106$(OUTPUT)/%.skel.h: $(OUTPUT)/%.bpf.o | $(OUTPUT) 107 $(call msg,GEN-SKEL,$@) 108 $(Q)$(BPFTOOL) gen skeleton $< > $@ 109 110$(OUTPUT)/%.bpf.o: %.bpf.c $(LIBBPF_OBJ) $(wildcard %.h) $(ARCH)/vmlinux.h | $(OUTPUT) 111 $(call msg,BPF,$@) 112 $(Q)$(CLANG) $(BPFCFLAGS) -target bpf -D__TARGET_ARCH_$(ARCH) \ 113 -I$(ARCH)/ $(INCLUDES) -c $(filter %.c,$^) -o $@ && \ 114 $(LLVM_STRIP) -g $@ 115 116# Build libbpf.a 117$(LIBBPF_OBJ): $(wildcard $(LIBBPF_SRC)/*.[ch]) | $(OUTPUT)/libbpf 118 $(call msg,LIB,$@) 119 $(Q)$(MAKE) -C $(LIBBPF_SRC) BUILD_STATIC_ONLY=1 \ 120 OBJDIR=$(dir $@)libbpf DESTDIR=$(dir $@) \ 121 INCLUDEDIR= LIBDIR= UAPIDIR= \ 122 install 123 124$(FSSLOWER_ALIASES): fsslower 125 $(call msg,SYMLINK,$@) 126 $(Q)ln -f -s $^ $@ 127 128$(FSDIST_ALIASES): fsdist 129 $(call msg,SYMLINK,$@) 130 $(Q)ln -f -s $^ $@ 131 132install: $(APPS) $(APP_ALIASES) 133 $(call msg, INSTALL libbpf-tools) 134 $(Q)$(INSTALL) -m 0755 -d $(DESTDIR)$(prefix)/bin 135 $(Q)$(INSTALL) $(APPS) $(DESTDIR)$(prefix)/bin 136 $(Q)cp -a $(APP_ALIASES) $(DESTDIR)$(prefix)/bin 137 138# delete failed targets 139.DELETE_ON_ERROR: 140# keep intermediate (.skel.h, .bpf.o, etc) targets 141.SECONDARY: 142