MXVER := `awk '{if($$2=="MX_SER_VERSION"){print $$3}}' ../../mx_ver.h | sed s/\"//g`

TARGET_DRIVER1 := mxser
TARGET_DRIVER2 := mxupcie

PWD		:= $(shell pwd)
LVER		:= $(shell uname -r)
CPU_ARCH	:= $(shell uname -m)

CPLD_PATH	:= ../CPLD/Source
MOD_DIR		:= /lib/modules/$(LVER)/kernel/drivers/char/
KER_DVR1_DIR	:= /lib/modules/$(LVER)/kernel/drivers/tty/$(TARGET_DRIVER1).ko
KDIR		:= /lib/modules/$(LVER)/build

DISTRI		:= $(shell grep "^ID=" /etc/os-release | cut -d '=' -f 2- | tr -d '"')
K_RELEASE	:= $(shell uname -r)
K_SUFFIX	:= $(shell echo "$(K_RELEASE)" | cut -d '-' -f 2)
DISTRI_VERSION	:= $(shell echo "$(K_SUFFIX)" | grep -o -E '[0-9]+' | head -n 1)

EXTRA_CFLAGS += -DOS_LINUX

# Set distribution version to 0 if it doesn's exist
ifeq ($(DISTRI_VERSION),)
	DISTRI_VERSION := 0
endif

# Add architectures into build flags
ifeq ($(CPU_ARCH), loongarch64)
        EXTRA_CFLAGS += -DLOONG_ARCH
else ifeq ($(CPU_ARCH), aarch64)
        EXTRA_CFLAGS += -DARM64_ARCH
endif

# Add build flag for Red Hat distribution family
ifneq ($(filter centos rhel rocky almalinux,$(DISTRI)),)
    EXTRA_CFLAGS += -DREDHAT_BASE
endif

# Add distribution version into build flags
EXTRA_CFLAGS += -DDISTRI_VERSION=$(DISTRI_VERSION)

##############################################################
all: module
install: module
	@mkdir -p /lib/modules/$(LVER)/kernel/drivers/char/
	$(shell [ -e $(MOD_DIR)/mxser.ko.gz ] && mv $(MOD_DIR)/mxser.ko.gz $(MOD_DIR)/mxser.ko.gz.bk)
	@cp -f ./$(TARGET_DRIVER1).ko /lib/modules/$(LVER)/kernel/drivers/char/
	@cp -f ./$(TARGET_DRIVER2).ko /lib/modules/$(LVER)/kernel/drivers/char/
	@mkdir -p /lib/modules/$(LVER)/misc/
	@cp -f ./$(TARGET_DRIVER1).ko /lib/modules/$(LVER)/misc/
	@cp -f ./$(TARGET_DRIVER2).ko /lib/modules/$(LVER)/misc/
ifeq ($(KER_DVR1_DIR), $(wildcard $(KER_DVR1_DIR)))
	@mv /lib/modules/$(LVER)/kernel/drivers/tty/$(TARGET_DRIVER1).ko /lib/modules/$(LVER)/kernel/drivers/tty/$(TARGET_DRIVER1).bak
	@depmod -a
	@mv /lib/modules/$(LVER)/kernel/drivers/tty/$(TARGET_DRIVER1).bak /lib/modules/$(LVER)/kernel/drivers/tty/$(TARGET_DRIVER1).ko
else
	@depmod -a
endif
	@echo " "
	@echo "**********************************************************************"
	@echo -n " MOXA Smartio/Industio Family Multiport Board Driver "
	@echo $(MXVER)
	@echo " installed successfully."
	@echo "**********************************************************************"

ifneq ($(KERNELRELEASE),)
obj-m := $(TARGET_DRIVER1).o $(TARGET_DRIVER2).o 
$(TARGET_DRIVER2)-objs := mxpcie.o ${CPLD_PATH}/cpld.o ${CPLD_PATH}/gpio.o
else

module: envchk
	@$(MAKE) -s -C $(KDIR) M=$(PWD) EXTRA_CFLAGS="$(EXTRA_CFLAGS)" modules 2>> build.log \
	&& cp -f ./build.log ../../build.log \
	&& exit 0 \
	|| echo "Build Fail! Please check build.log for further information" \
	&& echo "and send it to support@moxa.com." \
	&& cp -f ./build.log ../../build.log \
	&& exit 1

envchk:
	@./mxconf | tee build.log

clean: clean_local

endif

uninstall: clean_lib unload_driver remove_msg

clean_local:
	@rm -f *.o
	@rm -rf ./.tmp_versions
	@rm -f $(TARGET_DRIVER1).mod*
	@rm -f $(TARGET_DRIVER2).mod*
	@rm -f .$(TARGET_DRIVER1)*
	@rm -f .$(TARGET_DRIVER2)*
	@rm -f $(TARGET_DRIVER1).ko
	@rm -f $(TARGET_DRIVER2).ko
	@rm -f mxpcie.dwo
	@rm -f mxser.dwo
	@rm -f .modules.order.cmd
	@rm -f .Module.symvers.cmd
	@rm -f .cache.mk
	@rm -f mxpcie.o.ur-safe
	@rm -f mxser.o.ur-safe
	@rm -f mxpcie.o
	@rm -f .mxpcie.o.cmd
	@rm -f mxupcie.o	
	@rm -f .mxupcie.o.cmd
	@rm -f *.symvers
	@rm -f *.log
	@rm -f ../../*.log
	@rm -f *.markers
	@rm -f *.order
	@rm -f ${CPLD_PATH}/*.o
	@rm -f ${CPLD_PATH}/.cpld.o.cmd ${CPLD_PATH}/.gpio.o.cmd
	@rm -f ${CPLD_PATH}/*.dwo

clean_lib:
	@rm -f /lib/modules/$(LVER)/kernel/drivers/char/$(TARGET_DRIVER1).ko
	@rm -f /lib/modules/$(LVER)/kernel/drivers/char/$(TARGET_DRIVER2).ko
	@rm -f /lib/modules/$(LVER)/misc/$(TARGET_DRIVER1).ko
	@rm -f /lib/modules/$(LVER)/misc/$(TARGET_DRIVER2).ko
	@rm -f /dev/mxser
	@rm -f /dev/mxupcie
	@rm -f /etc/moxa/moxa_unbind
	@rm -f /etc/systemd/system/moxa_unbind.service
	@depmod -a

unload_driver:	
	@if lsmod | grep -q $(TARGET_DRIVER1) ; then rmmod $(TARGET_DRIVER1) ; fi
	@if lsmod | grep -q $(TARGET_DRIVER2) ; then rmmod $(TARGET_DRIVER2) ; fi

remove_msg:
	@echo "**********************************************************************"
	@echo -n " MOXA Smartio/Industio Family Multiport Board Driver "
	@echo $(MXVER)
	@echo " removed compeleted."
	@echo "**********************************************************************"

