1# SPDX-License-Identifier: LGPL-2.1 OR BSD-2-Clause 2# Copyright (c) 2026 Meta Platforms, Inc. and affiliates. 3 4.PHONY: clean 5 6# Defaults for standalone builds 7 8CLANG ?= clang 9BPFTOOL ?= bpftool 10LDLIBS ?= -lbpf -lelf -lz -lrt -lpthread -lzstd 11 12ifeq ($(V),1) 13Q = 14msg = 15else 16Q ?= @ 17msg = @printf ' %-8s%s %s%s\n' "$(1)" "$(if $(2), [$(2)])" "$(notdir $(3))" "$(if $(4), $(4))"; 18endif 19 20IS_LITTLE_ENDIAN = $(shell $(CC) -dM -E - </dev/null | \ 21 grep 'define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__') 22BPF_TARGET_ENDIAN ?= $(if $(IS_LITTLE_ENDIAN),--target=bpfel,--target=bpfeb) 23 24LIBARENA=$(abspath .) 25BPFDIR=$(abspath $(LIBARENA)/..) 26 27INCLUDE_DIR ?= $(BPFDIR)/tools/include 28LIBBPF_INCLUDE ?= $(INCLUDE_DIR) 29 30# Scan src/ and selftests/ to generate the final binaries 31LIBARENA_SOURCES = $(wildcard $(LIBARENA)/src/*.bpf.c) $(wildcard $(LIBARENA)/selftests/*.bpf.c) 32LIBARENA_OBJECTS = $(notdir $(LIBARENA_SOURCES:.bpf.c=.bpf.o)) 33LIBARENA_OBJECTS_ASAN = $(notdir $(LIBARENA_SOURCES:.bpf.c=_asan.bpf.o)) 34 35INCLUDES = -I$(LIBARENA)/include -I$(BPFDIR) 36ifneq ($(INCLUDE_DIR),) 37INCLUDES += -I$(INCLUDE_DIR) 38endif 39ifneq ($(LIBBPF_INCLUDE),) 40INCLUDES += -I$(LIBBPF_INCLUDE) 41endif 42 43ASAN_FLAGS = -fsanitize=kernel-address -fno-stack-protector -fno-builtin 44ASAN_FLAGS += -mllvm -asan-instrument-address-spaces=1 -mllvm -asan-shadow-addr-space=1 45ASAN_FLAGS += -mllvm -asan-use-stack-safety=0 -mllvm -asan-stack=0 46ASAN_FLAGS += -mllvm -asan-kernel=1 47ASAN_FLAGS += -mllvm -asan-constructor-kind=none 48ASAN_FLAGS += -mllvm -asan-destructor-kind=none 49 50# ENABLE_ATOMICS_TESTS required because we use arena spinlocks 51override BPF_CFLAGS += -DENABLE_ATOMICS_TESTS 52override BPF_CFLAGS += -O2 -g 53override BPF_CFLAGS += -Wno-incompatible-pointer-types-discards-qualifiers 54# Required to define our own arena-based free() 55override BPF_CFLAGS += -Wno-incompatible-library-redeclaration 56# Required for suppressing harmless vmlinux.h-related warnings. 57override BPF_CFLAGS += -Wno-missing-declarations 58override BPF_CFLAGS += $(INCLUDES) 59 60CFLAGS = -O2 -no-pie 61CFLAGS += $(INCLUDES) 62 63vpath %.bpf.c $(LIBARENA)/src $(LIBARENA)/selftests 64vpath %.c $(LIBARENA)/src $(LIBARENA)/selftests 65 66skeletons: libarena.skel.h libarena_asan.skel.h 67.PHONY: skeletons 68 69libarena_asan.skel.h: libarena_asan.bpf.o 70 $(call msg,GEN-SKEL,libarena,$@) 71 $(Q)$(BPFTOOL) gen skeleton $< name "libarena_asan" > $@ 72 73libarena.skel.h: libarena.bpf.o 74 $(call msg,GEN-SKEL,libarena,$@) 75 $(Q)$(BPFTOOL) gen skeleton $< name "libarena" > $@ 76 77libarena_asan.bpf.o: $(LIBARENA_OBJECTS_ASAN) 78 $(call msg,GEN-OBJ,libarena,$@) 79 $(Q)$(BPFTOOL) gen object $@ $^ 80 81libarena.bpf.o: $(LIBARENA_OBJECTS) 82 $(call msg,GEN-OBJ,libarena,$@) 83 $(Q)$(BPFTOOL) gen object $@ $^ 84 85%_asan.bpf.o: %.bpf.c 86 $(call msg,CLNG-BPF,libarena,$@) 87 $(Q)$(CLANG) $(BPF_CFLAGS) $(ASAN_FLAGS) -DBPF_ARENA_ASAN $(BPF_TARGET_ENDIAN) -c $< -o $@ 88 89%.bpf.o: %.bpf.c 90 $(call msg,CLNG-BPF,libarena,$@) 91 $(Q)$(CLANG) $(BPF_CFLAGS) $(BPF_TARGET_ENDIAN) -c $< -o $@ 92 93clean: 94 $(Q)rm -f *.skel.h *.bpf.o *.linked*.o 95