.PHONY: default libbpf clean

ARCH=$(shell uname -m)
BPF_TOOL_PATH      := ../../tools/$(ARCH)
BPF_TOOL           := $(BPF_TOOL_PATH)/bpftool
BPF_TOOL_ARCHIVE   := $(BPF_TOOL).tar.gz
VMLINUXH           := ../../include/vmlinux.h
VMLINUXH_TGZ       := ../../tools/$(ARCH)/vmlinux.tar.gz
LIBBPFA            := ../../libbpf/libbpf.a
PRIVATE_KEY        := ../../../../certs/security_pkey/keys/security.key
PUBLIC_KEY         := ../../../../certs/security_pkey/keys/security_pkey.pem

CLANG              := clang
APPS               := tcpconnlat tcpstates tcptop


default:
	@echo "ctforge_tcpsnoop: make all to compile"


$(VMLINUXH):
	tar -xvf $(VMLINUXH_TGZ) -C ../../include/
	@echo "-> generate vmlinux.h done!"


$(BPF_TOOL): $(BPF_TOOL_ARCHIVE)
	@mkdir -p $(BPF_TOOL_PATH)
	@tar -xf $< -C $(BPF_TOOL_PATH)
	@chmod +x $@


$(LIBBPFA):
	@cd ../../libbpf && make


all: $(LIBBPFA) $(VMLINUXH) $(BPF_TOOL) $(APPS)
	@echo "Success! ctforge_tcpsnoop ok!"


%: %.skel.h %.so
	$(CLANG) -O2 -Wall \
	-DPROV_FILTER_FILE_PERMISSION_OFF \
	-DPROV_FILTER_SOCKET_SENDMSG_OFF \
	-D__KERNEL__ \
	-D__ASM_SYSREG_H \
	-D__$(ARCH)__ \
	-Wno-unused-value -Wno-pointer-sign \
	-Wno-compare-distinct-pointer-types \
	-Wno-gnu-variable-sized-type-not-at-end \
	-Wno-address-of-packed-member -Wno-tautological-compare \
	-Wno-unknown-warning-option \
	-ldl -g $@_load.c -o ctforge_$@


%.skel.h: %_kern.o
	$(BPF_TOOL) gen skeleton --bpffs $^ > $@
	@ls -alh $@


%_kern.o: %_kern.c
	$(CLANG) -O2 -Wall \
	-DPROV_FILTER_FILE_PERMISSION_OFF \
	-DPROV_FILTER_SOCKET_SENDMSG_OFF \
	-D__KERNEL__ \
	-D__ASM_SYSREG_H \
	-D__$(ARCH)__ \
	-D__TARGET_ARCH_$(ARCH) \
	-Wno-unused-value -Wno-pointer-sign \
	-Wno-compare-distinct-pointer-types \
	-Wno-gnu-variable-sized-type-not-at-end \
	-Wno-address-of-packed-member -Wno-tautological-compare \
	-Wno-unknown-warning-option \
	-I../../include \
	-target bpf -g -c $^ -o $@
	@ls -alh $@


%.so: %_user.c
	$(CLANG) -shared -fPIC -g -o ctforge_$@ $^ $(LIBBPFA) -lelf -lz -lpthread -I../../include -I.
	../../ctforged/ctforge-signer -z -s -k $(PRIVATE_KEY) -i ctforge_$@


clean:
	rm -f *.o
	rm -f ctforge_*
	rm -f vmlinux.h
	rm -f $(SKELAPPS)

