# Copyright Authors of Cilium # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) FLAGS := -I$(ROOT_DIR)/bpf/include -I$(ROOT_DIR)/bpf -D__NR_CPUS__=$(shell nproc --all) -O2 -g CLANG_FLAGS := ${FLAGS} -target bpf -std=gnu89 -nostdinc -emit-llvm # eBPF verifier enforces unaligned access checks where necessary, so don't # let clang complain too early. CLANG_FLAGS += -Wall -Wextra -Werror -Wshadow CLANG_FLAGS += -Wno-address-of-packed-member CLANG_FLAGS += -Wno-unknown-warning-option CLANG_FLAGS += -Wno-gnu-variable-sized-type-not-at-end CLANG_FLAGS += -Wdeclaration-after-statement CLANG_FLAGS += -Wimplicit-int-conversion -Wenum-conversion LLC_FLAGS := -march=bpf # Mimics the mcpu values set by cilium-agent. See GetBPFCPU(). ifeq ("$(KERNEL)","49") LLC_FLAGS += -mcpu=v1 else ifeq ("$(KERNEL)","netnext") LLC_FLAGS += -mcpu=v3 else LLC_FLAGS += -mcpu=v2 endif # BUILD_PERMUTATIONS_DEP is a dummy file dependency that ensures all targets # are rebuilt when the 'build_all' target is run. BUILD_PERMUTATIONS_DEP := .rebuild_all LIB := $(shell find $(ROOT_DIR)/bpf -name '*.h') $(BUILD_PERMUTATIONS_DEP) BPF_C := $(patsubst %.o,%.c,$(BPF)) BPF_ASM := $(patsubst %.o,%.s,$(BPF)) CLANG ?= clang LLC ?= llc HOST_CC ?= gcc HOST_STRIP ?= strip ifeq ($(CROSS_ARCH),arm64) HOST_CC = aarch64-linux-gnu-gcc HOST_STRIP = aarch64-linux-gnu-strip else ifeq ($(CROSS_ARCH),amd64) HOST_CC = x86_64-linux-gnu-gcc HOST_STRIP = x86_64-linux-gnu-strip endif # Define all at the top here so that Makefiles which include this one will hit # the 'all' target first (which we expect to be overridden by the includer). all: .PHONY: $(BUILD_PERMUTATIONS_DEP) $(BUILD_PERMUTATIONS_DEP): @touch $(BUILD_PERMUTATIONS_DEP) force: %.ll: %.c $(LIB) @$(ECHO_CC) $(QUIET) ${CLANG} ${CLANG_FLAGS} -c $< -o $@ %.s: %.ll @$(ECHO_CC) $(QUIET) ${LLC} $(LLC_FLAGS) -filetype=asm -o $@ $(patsubst %.s,%.ll,$@) CHECKPATCH_IMAGE := quay.io/cilium/cilium-checkpatch:2f0f4f512e795d5668ea4e7ef0ba85abc75eb225@sha256:f307bf0315954e8b8c31edc1864d949bf211b0c6522346359317d757b5a6cea0 ifneq ($(CHECKPATCH_DEBUG),) # Run script with "bash -x" CHECKPATCH_IMAGE_AND_ENTRY := \ --entrypoint /bin/bash $(CHECKPATCH_IMAGE) -x /checkpatch/checkpatch.sh else # Use default entrypoint CHECKPATCH_IMAGE_AND_ENTRY := $(CHECKPATCH_IMAGE) endif checkpatch: @$(ECHO_CHECK) "(checkpatch)" $(QUIET) $(CONTAINER_ENGINE) container run --rm \ --workdir /workspace \ --volume $(CURDIR)/..:/workspace \ --user "$(shell id -u):$(shell id -g)" \ -e GITHUB_REF=$(GITHUB_REF) -e GITHUB_REPOSITORY=$(GITHUB_REPOSITORY) \ $(CHECKPATCH_IMAGE_AND_ENTRY) $(CHECKPATCH_ARGS) coccicheck: $(QUIET) $(foreach TARGET,$(shell find $(ROOT_DIR)/contrib/coccinelle/ -name '*.cocci'), \ spatch --no-show-diff --sp-file ${TARGET} --include-headers --very-quiet --dir . ; ) check: coccicheck checkpatch @$(ECHO_CHECK)/*.c $(QUIET) sparse -Wsparse-all ${FLAGS} $(ROOT_DIR)/$(RELATIVE_DIR)/*.c $(QUIET) $(CLANG) ${CLANG_FLAGS} --analyze $(ROOT_DIR)/$(RELATIVE_DIR)/*.c $(QUIET) $(foreach SUBDIR,$(SUBDIRS), \ $(MAKE) $(SUBMAKEOPTS) -C $(SUBDIR) $@ &&) true preprocess: $(LIB) $(QUIET) $(foreach TARGET,$(shell find $(ROOT_DIR)/$(RELATIVE_DIR)/ -name 'bpf_*.c'), \ echo " GEN $(patsubst %.c,%.i,${TARGET})"; \ ${CLANG} $(FLAGS) -E -target bpf -c ${TARGET} -o $(patsubst %.c,%.i,${TARGET}); ) $(QUIET) $(foreach SUBDIR,$(SUBDIRS), \ $(MAKE) $(SUBMAKEOPTS) -C $(SUBDIR) $@ &&) true assembly: $(BPF_C) $(LIB) $(BPF_ASM) $(QUIET) $(foreach SUBDIR,$(SUBDIRS), \ $(MAKE) $(SUBMAKEOPTS) -C $(SUBDIR) $@ &&) true .PHONY: all force checkpatch coccicheck check preprocess assembly