CONFIG_MODULE_SIG := n
ALLOWEDKERNEL := 1

OSTYPE := $(shell uname -m)
KDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
FLT_OBJ_MOD := AmiNFFltLib.o
MODULE_NAME := AmiNFFilterPKI

# Архитектурные флаги
ifeq ($(OSTYPE),x86_64)
  ccflags-y += -DBUILD_AS_X64 -m64 -mcmodel=kernel -mno-red-zone -mno-sse -mcet-switch
else ifneq (, $(findstring 86,$(OSTYPE)))
  ccflags-y += -DBUILD_AS_X86 -m32
else ifneq (, $(findstring arm,$(OSTYPE)))
  ccflags-y += -DBUILD_AS_ARM
else ifeq ($(OSTYPE),aarch64)
  ccflags-y += -DBUILD_AS_ARM
else
  ALLOWEDKERNEL := 0
endif

# Дополнительные флаги
ccflags-y += -fno-common
ccflags-y += -Wno-misleading-indentation
ccflags-y += -fcf-protection=branch

# Disable build failure on non-critical objtool warnings (if some) on kernel 6.15 and higher
ifeq ($(CONFIG_OBJTOOL),y)
  objtool-args-y := $(filter-out --Werror, $(objtool-args-y))
endif

# Цели модуля
obj-m := $(MODULE_NAME).o
$(MODULE_NAME)-y := AmiNFFltKern.o $(FLT_OBJ_MOD)

# Основное правило
.PHONY: all

ifeq ($(ALLOWEDKERNEL),1)
all: prepare $(MODULE_NAME).ko

prepare:
	@if [ -f AmiNFFltLib.o_shipped ] && [ ! -f AmiNFFltLib.o ]; then \
		echo "[COPY] AmiNFFltLib.o_shipped -> AmiNFFltLib.o"; \
		cp AmiNFFltLib.o_shipped AmiNFFltLib.o; \
	fi
	touch .$(FLT_OBJ_MOD).cmd

$(MODULE_NAME).ko:
	@echo "[BUILD] Building kernel module..."
	@$(MAKE) -C $(KDIR) M=$(PWD) modules
	@echo "[SUCCESS] Module built successfully"

else
all:
	@echo "\nERROR: Only x86, amd64, arm and arm64 kernel versions supported!\n"
endif

clean:
	@echo "[CLEAN] Removing build files..."
	@rm -f *.mod.*
	@rm -f *.o
	@rm -f *odule*.*
	@rm -f .*.*.*
	@rm -f -r .tmp_versions

cleanfull: clean
	@echo "[CLEAN] Removing all generated files..."
	@rm -f $(MODULE_NAME).ko