# This makefile is for "local" compilation, that is compiling a driver without using the standard Linux way (make Xconfig etc...)
# Anyway to compile this driver you need to have a already configured Linux kernel source tree

# This makefile allows to build the driver outside the kernel
# you need then to specify where are located the kernel source the includes used by this driver

# Notes:
# * the source of these drivers are generally located in the kernel source directory
# in the path $(TOPDIR)/drivers/addidata/
# * the the ADDI-DATA specific includes are generally located in the kernel source directory
# in the path $(TOPDIR)/include/linux/addidata

####################################################################
# relative path of the source of the kernel to build against
# IF YOU ARE BUILDING THIS DRIVER OUTSIDE THE KERNEL SOURCE
# PLEASE ADAPT THIS VARIABLE TO YOUR LOCAL INSTALLATION
ifeq ($(KERNELSRCDIR),)
KERNELSRCDIR:=/lib/modules/$(shell uname -r)/build
endif
####################################################################

####################################################################
# relative path of the addidata include directory
# IF YOU ARE BUILDING THIS DRIVER OUTSIDE THE KERNEL SOURCE
# PLEASE ADAPT THIS VARIABLE TO YOUR LOCAL INSTALLATION
ifeq ($(ADDIDATAINC),)
ADDIDATAINC:=$(shell pwd)/../../../include/linux/addidata
endif
####################################################################

####################################################################
# Use M= instead of $(KFLAG)= is mandatory with kernel > 5.x
KFLAG := $(shell [ "$$(uname -r | cut -c1)" -ge 5 ] && echo M || echo SUBDIRS)
####################################################################


# make -f _makefile all
all:
	@echo "please choose either 2.4 or 2.6 (e.g.: make -f _makefile 2.4)"

26_deps:=checkconfig apci1710.ko ksamples/ksample_ssi_01.ko ksamples/ksample_ssi_02.ko ksamples/ksample_ssi_03.ko ksamples/ksample_ssi_04.ko ksamples/ksample_ssi_05.ko ksamples/ksample_ssi_06.ko ksamples/ksample_imp_cpt_01.ko ksamples/ksample_inc_cpt_01.ko ksamples/ksample_chronos_01.ko ksamples/ksample_chronos_02.ko ksamples/ksample_etm_01.ko ksamples/ksample_etm_02.ko ksamples/ksample_endat_01.ko ksamples/ksample_endat_02.ko ksamples/ksample_endat_03.ko ksamples/ksample_endat_04.ko ksamples/ksample_endat_05.ko ksamples/ksample_endat_06.ko ksamples/ksample_pwm_01.ko ksamples/ksample_pwm_02.ko samples

ifneq ($(WITH_BALISE_OPTION),)
26_deps+=customer/balise/ksamples/ksample_balise_01.ko customer/balise/ksamples/ksample_balise_02.ko
export WITH_BALISE_OPTION
endif

ifneq ($(WITH_EL_TIMERS_OPTION),)
26_deps+=customer/el_timers/ksamples/ksample_el_timers_01.ko
export WITH_EL_TIMERS_OPTION
endif

ifneq ($(WITH_RADAR_READER_OPTION),)
export WITH_RADAR_READER_OPTION
endif

# Sign the kernel modules
ifneq ("$(wildcard ./sign.sh)","")
sign_cmd=./sign.sh $(KERNELSRCDIR)
else
sign_cmd=@echo
endif

24_deps:=checkconfig .depend apci1710.o ksamples/ksample_ssi_01.o ksamples/ksample_ssi_02.o ksamples/ksample_ssi_03.o ksamples/ksample_ssi_04.o ksamples/ksample_ssi_05.o ksamples/ksample_ssi_06.o ksamples/ksample_imp_cpt_01.o ksamples/ksample_inc_cpt_01.o ksamples/ksample_chronos_01.o ksamples/ksample_chronos_02.o ksamples/ksample_etm_01.o  ksamples/ksample_etm_02.o ksamples/ksample_endat_01.o ksamples/ksample_endat_02.o ksamples/ksample_endat_03.ko ksamples/ksample_endat_04.ko ksamples/ksample_endat_05.ko ksamples/ksample_endat_06.ko ksamples/ksample_pwm_01.ko ksamples/ksample_pwm_02.ko samples

2.4: $(24_deps)

2.6: $(26_deps)

# make -f _makefile clean
clean: localclean

.PHONY: checkconfig .depend tests samples

localclean:
	-cd tests && make clean
	-cd samples && make clean
	-cd ksamples && make -f _makefile clean
	- find . -name '*.o' -exec rm {} \;
	- find . -name '*.ko' -exec rm {} \;
	- find . -name '*.o.flags' -exec rm {} \;
	- find . -name '.depend' -exec rm {} \;
	- find . -name '*~' -exec rm {} \;
	- find . -name '*.mod' -exec rm {} \;
	- find . -name '*.mod.c' -exec rm {} \;
	- find . -name '*.mod.o' -exec rm {} \;
	- find . -name '*.o.cmd' -exec rm {} \;
	- find . -name '*.ko.cmd' -exec rm {} \;
	- find . -name '*.o.d' -exec rm {} \;
	- find . -name '*.symvers' -exec rm {} \;
	- find . -name '.tmp_versions' -exec rm -Rf {} \;
	- find . -name 'Module.markers' -exec rm -Rf {} \;
	- find . -name 'modules.order' -exec rm -Rf {} \;

checkconfig:
	@if [ ! -e $(KERNELSRCDIR)/.config  ]; \
	then echo ".config \
	* Is your kernel configured (make xconfig)? \
	* Did you correctly adapt _makefile ?"; \
	echo "KERNELSRCDIR="$(KERNELSRCDIR);\
	echo "ADDIDATAINC="$(ADDIDATAINC);\
	exit 1; fi

# check for the sparse static code checker
sparse_path:=$(shell which sparse)

ifneq ($(sparse_path),)
$(info info: sparse found as "$(sparse_path)": activating static checking for driver code while compiling for Linux 2.6 )
SPARSE_FLAGS:="C=1"
endif


# call the kernel's build process to actually build our stuff
apci1710.o:
	$(MAKE)   $(KFLAG)=$(shell pwd) CONFIG_apci1710_IOCTL=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) modules

ksamples/ksample_ssi_01.o:
	$(MAKE) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_SSI_01=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) modules

ksamples/ksample_ssi_02.o:
	$(MAKE) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_SSI_02=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) modules

ksamples/ksample_ssi_03.o:
	$(MAKE) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_SSI_03=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) modules

ksamples/ksample_ssi_04.o:
	$(MAKE) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_SSI_04=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) modules

ksamples/ksample_ssi_05.o:
	$(MAKE) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_SSI_05=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) modules

ksamples/ksample_ssi_06.o:
	$(MAKE) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_SSI_06=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) modules

ksamples/ksample_imp_cpt_01.o:
	$(MAKE) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_IMP_CPT_01=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) modules

ksamples/ksample_inc_cpt_01.o:
	$(MAKE) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_INC_CPT_01=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) modules

ksamples/ksample_chronos_01.o:
	$(MAKE) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_CHRONOS_01=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) modules

ksamples/ksample_chronos_02.o:
	$(MAKE) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_CHRONOS_02=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) modules

ksamples/ksample_etm_01.o:
	$(MAKE) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_ETM_01=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) modules

ksamples/ksample_etm_02.o:
	$(MAKE) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_ETM_02=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) modules

ksamples/ksample_endat_01.o:
	$(MAKE) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_ENDAT_01=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) modules

ksamples/ksample_endat_02.o:
	$(MAKE) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_ENDAT_02=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) modules

ksamples/ksample_endat_03.o:
	$(MAKE) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_ENDAT_03=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) modules

ksamples/ksample_endat_04.o:
	$(MAKE) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_ENDAT_04=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) modules

ksamples/ksample_endat_05.o:
	$(MAKE) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_ENDAT_05=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) modules

ksamples/ksample_endat_06.o:
	$(MAKE) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_ENDAT_06=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) modules

ksamples/ksample_pwm_01.o:
	$(MAKE) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_PWM_01=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) modules

ksamples/ksample_pwm_02.o:
	$(MAKE) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_PWM_02=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) modules

apci1710.ko:
	$(MAKE) $(SPARSE_FLAGS) $(KFLAG)=$(shell pwd) CONFIG_apci1710_IOCTL=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) modules
	$(sign_cmd) $@

ksamples/ksample_ssi_01.ko:
	$(MAKE) $(SPARSE_FLAGS) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_SSI_01=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) KBUILD_EXTRA_SYMBOLS=$(shell pwd)/Module.symvers modules
	$(sign_cmd) $@

ksamples/ksample_ssi_02.ko:
	$(MAKE) $(SPARSE_FLAGS) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_SSI_02=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) KBUILD_EXTRA_SYMBOLS=$(shell pwd)/Module.symvers modules
	$(sign_cmd) $@

ksamples/ksample_ssi_03.ko:
	$(MAKE) $(SPARSE_FLAGS) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_SSI_03=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) KBUILD_EXTRA_SYMBOLS=$(shell pwd)/Module.symvers modules
	$(sign_cmd) $@

ksamples/ksample_ssi_04.ko:
	$(MAKE) $(SPARSE_FLAGS) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_SSI_04=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) KBUILD_EXTRA_SYMBOLS=$(shell pwd)/Module.symvers modules
	$(sign_cmd) $@

ksamples/ksample_ssi_05.ko:
	$(MAKE) $(SPARSE_FLAGS) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_SSI_05=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) KBUILD_EXTRA_SYMBOLS=$(shell pwd)/Module.symvers modules
	$(sign_cmd) $@

ksamples/ksample_ssi_06.ko:
	$(MAKE) $(SPARSE_FLAGS) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_SSI_06=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) KBUILD_EXTRA_SYMBOLS=$(shell pwd)/Module.symvers modules
	$(sign_cmd) $@

ksamples/ksample_imp_cpt_01.ko:
	$(MAKE) $(SPARSE_FLAGS) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_IMP_CPT_01=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) KBUILD_EXTRA_SYMBOLS=$(shell pwd)/Module.symvers modules
	$(sign_cmd) $@

ksamples/ksample_inc_cpt_01.ko:
	$(MAKE) $(SPARSE_FLAGS) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_INC_CPT_01=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) KBUILD_EXTRA_SYMBOLS=$(shell pwd)/Module.symvers modules
	$(sign_cmd) $@

ksamples/ksample_chronos_01.ko:
	$(MAKE) $(SPARSE_FLAGS) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_CHRONOS_01=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) KBUILD_EXTRA_SYMBOLS=$(shell pwd)/Module.symvers modules
	$(sign_cmd) $@

ksamples/ksample_chronos_02.ko:
	$(MAKE) $(SPARSE_FLAGS) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_CHRONOS_02=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) KBUILD_EXTRA_SYMBOLS=$(shell pwd)/Module.symvers modules
	$(sign_cmd) $@

ksamples/ksample_etm_01.ko:
	$(MAKE) $(SPARSE_FLAGS) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_ETM_01=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) KBUILD_EXTRA_SYMBOLS=$(shell pwd)/Module.symvers modules
	$(sign_cmd) $@

ksamples/ksample_etm_02.ko:
	$(MAKE) $(SPARSE_FLAGS) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_ETM_02=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) KBUILD_EXTRA_SYMBOLS=$(shell pwd)/Module.symvers modules
	$(sign_cmd) $@

ksamples/ksample_endat_01.ko:
	$(MAKE) $(SPARSE_FLAGS) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_ENDAT_01=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) KBUILD_EXTRA_SYMBOLS=$(shell pwd)/Module.symvers modules
	$(sign_cmd) $@

ksamples/ksample_endat_02.ko:
	$(MAKE) $(SPARSE_FLAGS) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_ENDAT_02=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) KBUILD_EXTRA_SYMBOLS=$(shell pwd)/Module.symvers modules
	$(sign_cmd) $@

ksamples/ksample_endat_03.ko:
	$(MAKE) $(SPARSE_FLAGS) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_ENDAT_03=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) KBUILD_EXTRA_SYMBOLS=$(shell pwd)/Module.symvers modules
	$(sign_cmd) $@

ksamples/ksample_endat_04.ko:
	$(MAKE) $(SPARSE_FLAGS) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_ENDAT_04=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) KBUILD_EXTRA_SYMBOLS=$(shell pwd)/Module.symvers modules
	$(sign_cmd) $@

ksamples/ksample_endat_05.ko:
	$(MAKE) $(SPARSE_FLAGS) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_ENDAT_05=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) KBUILD_EXTRA_SYMBOLS=$(shell pwd)/Module.symvers modules
	$(sign_cmd) $@

ksamples/ksample_endat_06.ko:
	$(MAKE) $(SPARSE_FLAGS) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_ENDAT_06=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) KBUILD_EXTRA_SYMBOLS=$(shell pwd)/Module.symvers modules
	$(sign_cmd) $@

ksamples/ksample_pwm_01.ko:
	$(MAKE) $(SPARSE_FLAGS) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_PWM_01=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) KBUILD_EXTRA_SYMBOLS=$(shell pwd)/Module.symvers modules
	$(sign_cmd) $@

ksamples/ksample_pwm_02.ko:
	$(MAKE) $(SPARSE_FLAGS) $(KFLAG)=$(shell pwd)/ksamples CONFIG_SAMPLE_PWM_02=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) KBUILD_EXTRA_SYMBOLS=$(shell pwd)/Module.symvers modules
	$(sign_cmd) $@

ifneq ($(WITH_BALISE_OPTION),)
customer/balise/ksamples/ksample_balise_01.ko:
	$(MAKE) $(SPARSE_FLAGS) $(KFLAG)=$(shell pwd)/customer/balise/ksamples CONFIG_SAMPLE_BALISE_01=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) KBUILD_EXTRA_SYMBOLS=$(shell pwd)/Module.symvers modules
	$(sign_cmd) $@

customer/balise/ksamples/ksample_balise_02.ko:
	$(MAKE) $(SPARSE_FLAGS) $(KFLAG)=$(shell pwd)/customer/balise/ksamples CONFIG_SAMPLE_BALISE_02=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) KBUILD_EXTRA_SYMBOLS=$(shell pwd)/Module.symvers modules
	$(sign_cmd) $@
endif

ifneq ($(WITH_EL_TIMERS_OPTION),)
customer/el_timers/ksamples/ksample_el_timers_01.ko:
	$(MAKE) $(SPARSE_FLAGS) $(KFLAG)=$(shell pwd)/customer/el_timers/ksamples CONFIG_SAMPLE_EL_TIMERS_01=m RTAIINC=$(RTAIINC) ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) KBUILD_EXTRA_SYMBOLS=$(shell pwd)/Module.symvers modules
	$(sign_cmd) $@
endif

.depend:
	$(MAKE) $(KFLAG)=$(shell pwd) CONFIG_apci1710_IOCTL=m ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) dep

install_24: apci1710.o
	$(MAKE) $(KFLAG)=$(shell pwd) CONFIG_apci1710_IOCTL=m -C $(KERNELSRCDIR) modules_install

install_26: apci1710.ko
	$(MAKE) $(KFLAG)=$(shell pwd) CONFIG_apci1710_IOCTL=m -C $(KERNELSRCDIR) modules_install
	depmod -a
	./mkudevrules.sh

# Compile the test apps
tests:
	cd tests && ADDIDATAINC=$(ADDIDATAINC) make all

# Compile the sample apps
samples:
	cd samples && ADDIDATAINC=$(ADDIDATAINC) make all

ifeq ($(ARCHIVE_DIR),)
ARCHIVE_DIR:=/tmp
endif

ifneq ($(WITH_BALISE_OPTION),)
CUSTOMER_DIST="customer/balise"
endif

ifneq ($(WITH_EL_TIMERS_OPTION),)
CUSTOMER_DIST="customer/el_timers"
endif

ifneq ($(WITH_IDV_OPTION),)
CUSTOMER_DIST="customer/idv"
endif

ifneq ($(WITH_RADAR_READER_OPTION),)
CUSTOMER_DIST="customer/radar_reader"
endif

# generates driver's package
dist: localclean
	../makedistrib apci1710 ./ ./dist/srcfiles $(ADDIDATAINC)/ ./dist/headers $(ARCHIVE_DIR) $(CUSTOMER_DIST)

