.PHONY: default kern libbpf user

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


default:
	@echo "ctforge_rosnoop: 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) kern user load
	@echo "Success! ctforge_rosnoop ok!"


kern: $(BPF_TOOL) $(VMLINUXH)
	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 rosnoop_kern.c -o rosnoop_kern.o
	@ls -alh rosnoop_kern.o
	$(BPF_TOOL) gen skeleton --bpffs rosnoop_kern.o > rosnoop.skel.h
	@ls -alh rosnoop.skel.h


user: $(LIBBPFA)
	clang -shared -fPIC -g -o ctforge_rosnoop.so rosnoop_user.c $(LIBBPFA) -lelf -lz -lpthread -I../../include -I.
	../../ctforged/ctforge-signer -z -s -k $(PRIVATE_KEY) -i ctforge_rosnoop.so


load:
	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 rosnoop_load.c -o ctforge_rosnoop


clean:
	rm -f rosnoop.skel.h
	rm -f *.o
	rm -f vmlinux.h
	rm -f ctforge_rosnoop*

