# Copyright Authors of Cilium
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)

include ../../Makefile.defs

MAKEFLAGS += -r

CLANG ?= clang

FLAGS := -I$(ROOT_DIR)/bpf -I$(ROOT_DIR)/bpf/include -g

# Base CFLAGS (CLANG_FLAGS) are read from pkg/datapath/loader/compile.go
# to keep them synced with the loader
CLANG_FLAGS := $(FLAGS) $(shell $(GO) run $(ROOT_DIR)/pkg/datapath/loader/tools/clang_cflags.go)

# Create dependency files for each .o file.
CLANG_FLAGS += -MD

# Mimics the mcpu values set by cilium-agent. See GetBPFCPU().
CLANG_FLAGS += -mcpu=v3

# scapy core components including header generator and all packet definitions.
# If any of these files change, we need to trigger a header rebuild
SCAPY_CORE := $(wildcard $(ROOT_DIR)/bpf/tests/scapy/*.py)

# Autogenerated scapy pkts
SCAPY_HDR := $(ROOT_DIR)/bpf/tests/output/scapy_bytes.h


.PHONY: all clean run

ALL_TEST_OBJECTS = $(patsubst %.c, %.o, $(wildcard *.c))

ifeq ($(origin BPF_TEST), undefined)
TEST_OBJECTS = $(ALL_TEST_OBJECTS)
else
TEST_OBJECTS=$(shell echo $(ALL_TEST_OBJECTS) | tr ' ' '\n' | grep $(BPF_TEST).o)
ifeq ($(strip $(TEST_OBJECTS)),)
$(error Invalid test '$(BPF_TEST).o')
endif
endif

all: $(TEST_OBJECTS)

$(SCAPY_HDR): $(SCAPY_CORE)
	@echo "Generating scapy header $@"
	$(QUIET) $(ROOT_DIR)/bpf/tests/scapy/scapy_header_gen.py $@

%.o: %.c $(LIB) $(SCAPY_HDR)
	@$(ECHO_CC)
	@# Remove the .o file to force recompilation, only rely on make's caching, not clangs
	@rm -f $@
	$(QUIET) ${CLANG} ${CLANG_FLAGS} -c $< -o $@

%.ll: %.c $(LIB)
	@$(ECHO_CC)
	$(QUIET) ${CLANG} ${CLANG_FLAGS} -c -emit-llvm $< -o $@

%.i: %.c $(LIB)
	@$(ECHO_CC)
	$(QUIET) ${CLANG} ${CLANG_FLAGS} -E -c $< -o $@


clean:
	rm -f output/*
	rm -f $(wildcard *.ll)
	rm -f $(wildcard *.o)
	rm -f $(wildcard *.i)
	rm -f $(wildcard *.d)
	rm -f $(wildcard scapy/__pycache__/*.pyc)

-include $(TEST_OBJECTS:.o=.d)
