| # SPDX-License-Identifier: GPL-2.0 | |
| # BPF object and skeleton rules for one flavor. | |
| # Included by the main Makefile for default outputs and by runners | |
| # for their flavor. Unflavored runners require the default outputs first. | |
| # | |
| # Parameters (variables defined by the includer): | |
| # RDIR output directory of this flavor | |
| # FLAVOR flavor name, empty for the default | |
| # BINARY runner binary name, for build-log messages | |
| # BPF_CC BPF compiler | |
| # BPF_CC_MSG build-log tag (CLNG-BPF/GCC-BPF) | |
| # BPF_CC_FLAGS per-flavor compiler flags | |
| # BPF_SYS_INCLUDES system include flags for $(BPF_CC) | |
| # BPF_DEFINES extra defines (-DENABLE_ATOMICS_TESTS) | |
| # BPF objects and skeletons | |
| ifneq ($(BPF_CC),) | |
| BPF_SRCS := $(notdir $(wildcard progs/*.c)) | |
| BPF_OBJS := $(patsubst %.c,$(RDIR)/%.bpf.o,$(BPF_SRCS)) | |
| SKEL_BLACKLIST := btf__% test_pinning_invalid.c test_sk_assign.c | |
| LINKED_SKELS := test_static_linked.skel.h linked_funcs.skel.h \ | |
| linked_vars.skel.h linked_maps.skel.h linked_arena.skel.h \ | |
| test_subskeleton.skel.h test_subskeleton_lib.skel.h \ | |
| test_usdt.skel.h tracing_multi.skel.h \ | |
| tracing_multi_module.skel.h \ | |
| tracing_multi_intersect.skel.h \ | |
| tracing_multi_session.skel.h | |
| LSKELS := fexit_sleep.c trace_printk.c trace_vprintk.c map_ptr_kern.c \ | |
| core_kern.c core_kern_overflow.c test_ringbuf.c \ | |
| test_ringbuf_n.c test_ringbuf_map_key.c test_ringbuf_write.c \ | |
| test_ringbuf_overwrite.c callx_rodata.c | |
| LSKELS_SIGNED := fentry_test.c fexit_test.c atomics.c | |
| # Generate both light skeleton and libbpf skeleton for these | |
| LSKELS_EXTRA := test_ksyms_module.c test_ksyms_weak.c kfunc_call_test.c \ | |
| kfunc_call_test_subprog.c test_global_percpu_data.c | |
| SKEL_BLACKLIST += $(LSKELS) $(LSKELS_SIGNED) | |
| test_static_linked.skel.h-deps := test_static_linked1.bpf.o test_static_linked2.bpf.o | |
| linked_funcs.skel.h-deps := linked_funcs1.bpf.o linked_funcs2.bpf.o | |
| linked_vars.skel.h-deps := linked_vars1.bpf.o linked_vars2.bpf.o | |
| linked_maps.skel.h-deps := linked_maps1.bpf.o linked_maps2.bpf.o | |
| linked_arena.skel.h-deps := linked_arena1.bpf.o linked_arena2.bpf.o | |
| # In the subskeleton case, we want the test_subskeleton_lib.subskel.h file | |
| # but that's created as a side-effect of the skel.h generation. | |
| test_subskeleton.skel.h-deps := test_subskeleton_lib2.bpf.o test_subskeleton_lib.bpf.o test_subskeleton.bpf.o | |
| test_subskeleton_lib.skel.h-deps := test_subskeleton_lib2.bpf.o test_subskeleton_lib.bpf.o | |
| test_usdt.skel.h-deps := test_usdt.bpf.o test_usdt_multispec.bpf.o | |
| tracing_multi.skel.h-deps := tracing_multi_attach.bpf.o tracing_multi_check.bpf.o | |
| tracing_multi_module.skel.h-deps := tracing_multi_attach_module.bpf.o tracing_multi_check.bpf.o | |
| tracing_multi_intersect.skel.h-deps := tracing_multi_intersect_attach.bpf.o tracing_multi_check.bpf.o | |
| tracing_multi_session.skel.h-deps := tracing_multi_session_attach.bpf.o tracing_multi_check.bpf.o | |
| LINKED_BPF_OBJS := $(foreach skel,$(LINKED_SKELS),$($(skel)-deps)) | |
| LINKED_BPF_SRCS := $(patsubst %.bpf.o,%.c,$(LINKED_BPF_OBJS)) | |
| SKELS := $(patsubst %.c,$(RDIR)/%.skel.h, \ | |
| $(filter-out $(SKEL_BLACKLIST) $(LINKED_BPF_SRCS),$(BPF_SRCS))) | |
| LSKELS_H := $(patsubst %.c,$(RDIR)/%.lskel.h,$(LSKELS) $(LSKELS_EXTRA)) | |
| LSKELS_SIGNED_H := $(patsubst %.c,$(RDIR)/%.lskel.h,$(LSKELS_SIGNED)) | |
| LINKED_SKELS_H := $(addprefix $(RDIR)/,$(LINKED_SKELS)) | |
| ALL_SKELS := $(SKELS) $(LSKELS_H) $(LSKELS_SIGNED_H) $(LINKED_SKELS_H) | |
| HEADERS_FOR_BPF_OBJS := $(wildcard $(BPFDIR)/*.bpf.h) \ | |
| $(wildcard $(CURDIR)/libarena/include/*.[ch]) \ | |
| $(addprefix $(BPFDIR)/, bpf_core_read.h \ | |
| bpf_endian.h \ | |
| bpf_helpers.h \ | |
| bpf_tracing.h) | |
| # The following tests contain C code that, although technically legal, | |
| # triggers GCC warnings that cannot be disabled: declaration of | |
| # anonymous struct types in function parameter lists. | |
| progs/btf_dump_test_case_bitfields.c-bpf_gcc-CFLAGS := -Wno-error | |
| progs/btf_dump_test_case_namespacing.c-bpf_gcc-CFLAGS := -Wno-error | |
| progs/btf_dump_test_case_packing.c-bpf_gcc-CFLAGS := -Wno-error | |
| progs/btf_dump_test_case_padding.c-bpf_gcc-CFLAGS := -Wno-error | |
| progs/btf_dump_test_case_syntax.c-bpf_gcc-CFLAGS := -Wno-error | |
| cmd_bpf_compile = $(BPF_CC) $(BPF_CFLAGS) $(BPF_SYS_INCLUDES) $(BPF_DEFINES) \ | |
| $($<-CFLAGS) $($<-$(FLAVOR)-CFLAGS) $(BPF_CC_FLAGS) -c $< -o $@ $(call skip_on_fail,BPF) | |
| $(BPF_OBJS): $(RDIR)/%.bpf.o: progs/%.c progs/*.h \ | |
| $(INCLUDE_DIR)/vmlinux.h $(HEADERS_FOR_BPF_OBJS) \ | |
| | $(RDIR) $(BPFOBJ) | |
| $(call msg,$(BPF_CC_MSG),$(BINARY),$@) | |
| $(Q)$(cmd_bpf_compile) | |
| GEN_SKEL := ./gen_bpf_skel.sh | |
| cmd_bpf_gen_skel = $(call skip_if_missing,SKEL,$<,$(@:.skel.h=.subskel.h))printf \ | |
| ' %-8s%s %s\n' 'GEN-SKEL' ' [$(BINARY)]' '$(notdir $@)'; \ | |
| BPFTOOL=$(BPFTOOL) $(GEN_SKEL) --name $* \ | |
| --skel $@ --subskel $(@:.skel.h=.subskel.h) $< $(call \ | |
| skip_on_fail,SKEL,$(@:.skel.h=.subskel.h)) | |
| $(SKELS): $(RDIR)/%.skel.h: $(RDIR)/%.bpf.o $(BPFTOOL) $(GEN_SKEL) | $(RDIR) | |
| $(Q)$(cmd_bpf_gen_skel) | |
| cmd_bpf_gen_lskel = $(call skip_if_missing,SKEL,$<)printf \ | |
| ' %-8s%s %s\n' 'GEN-SKEL' ' [$(BINARY)]' '$(notdir $@)'; \ | |
| BPFTOOL=$(BPFTOOL) $(GEN_SKEL) --name $*_lskel --lskel \ | |
| --skel $@ $< $(call skip_on_fail,SKEL) | |
| $(LSKELS_H): $(RDIR)/%.lskel.h: $(RDIR)/%.bpf.o $(BPFTOOL) $(GEN_SKEL) | $(RDIR) | |
| $(Q)$(cmd_bpf_gen_lskel) | |
| cmd_bpf_gen_signed_lskel = $(call skip_if_missing,SKEL,$<)printf \ | |
| ' %-8s%s %s\n' 'GEN-SKEL' ' [$(BINARY) (signed)]' '$(notdir $@)'; \ | |
| BPFTOOL=$(BPFTOOL) PRIVATE_KEY=$(PRIVATE_KEY) \ | |
| VERIFICATION_CERT=$(VERIFICATION_CERT) \ | |
| $(GEN_SKEL) --sign --name $*_lskel \ | |
| --skel $@ $< $(call skip_on_fail,SKEL) | |
| $(LSKELS_SIGNED_H): $(RDIR)/%.lskel.h: $(RDIR)/%.bpf.o $(BPFTOOL) \ | |
| $(GEN_SKEL) $(PRIVATE_KEY) $(VERIFICATION_CERT) | $(RDIR) | |
| $(Q)$(cmd_bpf_gen_signed_lskel) | |
| cmd_bpf_link_skel = $(call skip_if_missing,SKEL,$(addprefix $(RDIR)/,\ | |
| $($*.skel.h-deps)),$(@:.skel.h=.subskel.h))printf \ | |
| ' %-8s%s %s\n' 'LINK-BPF' ' [$(BINARY)]' '$(notdir $(@:.skel.h=.bpf.o))'; \ | |
| printf ' %-8s%s %s\n' 'GEN-SKEL' ' [$(BINARY)]' '$(notdir $@)'; \ | |
| BPFTOOL=$(BPFTOOL) $(GEN_SKEL) --name $* \ | |
| --skel $@ --subskel $(@:.skel.h=.subskel.h) \ | |
| $(addprefix $(RDIR)/,$($*.skel.h-deps)) $(call \ | |
| skip_on_fail,SKEL,$(@:.skel.h=.subskel.h)) | |
| # .SECONDEXPANSION here allows to correctly expand %-deps variables as prerequisites | |
| .SECONDEXPANSION: | |
| $(LINKED_SKELS_H): $(RDIR)/%.skel.h: $$(addprefix $(RDIR)/,$$($$*.skel.h-deps)) \ | |
| $(BPFTOOL) $(GEN_SKEL) | $(RDIR) | |
| $(Q)$(cmd_bpf_link_skel) | |
| # Programs in C++. No skeletons: gcc doesn't build them. | |
| ifeq ($(BPF_CC),$(CLANG)) | |
| CXX_OBJS := $(patsubst progs/%.cpp,$(RDIR)/%.bpf.o,$(wildcard progs/*.cpp)) | |
| BPF_OBJS += $(CXX_OBJS) | |
| $(CXX_OBJS): $(RDIR)/%.bpf.o: progs/%.cpp | $(RDIR) | |
| $(call msg,$(BPF_CC_MSG),$(BINARY),$@) | |
| $(Q)$(BPF_CC) -x c++ -g -Wall -Werror -fexceptions -funwind-tables -fno-rtti \ | |
| $(BPF_CC_FLAGS) -c $< -o $@ $(call skip_on_fail,BPF) | |
| endif | |
| endif # BPF_CC |