.PHONY: wcfi-kern wcfi-user wcfi 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


ifeq ($(ARCH),x86_64)
default: wcfi
else
default:
	@echo "$(ARCH) not supported!"
endif

$(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


wcfi-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)__ \
	-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 wcfi_kern.c -o ctforge_wcfi_kern.o


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


wcfi-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 wcfi_load.c -o ctforge_wcfi


wcfi: $(LIBBPFA) wcfi-kern wcfi-user wcfi-load
	@echo "Success! All ok!"


clean:
	rm -f ctforge_wcfi* *.o

