xref: /linux/tools/testing/selftests/bpf/libarena/Makefile (revision 7c8d208d816d0504aa916138ae097d9cb4ed4e56)
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