# 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:=/usr/src/linux/
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
####################################################################
KFLAG := $(shell [ "$$(uname -r | cut -c1)" -ge 5 ] && echo M || echo SUBDIRS)

# make -f _makefile
all: samples_26

# make -f _makefile 2.4 or 2.6
2.4: checkconfig .depend samples_24

2.6: checkconfig avert samples_26

.PHONY: checkconfig .depend avert

# make -f _makefile clean
clean: localclean

localclean:	
	- 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.o' -exec rm {} \;
	- find . -name '*.o.cmd' -exec rm {} \;
	- find . -name '*.ko.cmd' -exec rm {} \;
	- find . -name '*.mod.c' -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
samples_24: checkconfig ksample00.o ksample03.o ksample06.o ksample07.o ksample08.o ksample10.o ksample11.o ksample12.o ksample13.o
samples_26: checkconfig ksample00.ko ksample03.ko ksample06.ko ksample07.ko ksample08.ko ksample10.ko ksample11.ko ksample12.ko ksample13.ko

# 2.4

#here we tell the Makefile that we want to compile the target modules
#the target "modules" will compile all files in "obj-m" variable
#to compile only one target, we use a variable CONFIG_APCI3600_SAMPLExx=m
#that will be set for each target samplexx.o of this file (_makefile)
ksample00.o: ksample00.ko

ksample03.o: ksample03.ko

ksample06.o: ksample06.ko

ksample07.o: ksample07.ko

ksample08.o: ksample08.ko

ksample09.o: ksample09.ko

ksample10.o: ksample10.ko

ksample11.o: ksample11.ko

ksample12.o: ksample12.ko

ksample13.o: ksample13.ko
#2.6

ksample00.ko: 
	cp ../Module.symvers ./Module.symvers
	$(MAKE) $(SPARSE_FLAGS) $(KFLAG)=$(shell pwd) CONFIG_APCI3600_SAMPLE00=m ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) KBUILD_EXTRA_SYMBOLS=$(shell pwd)/../Module.symvers modules
	
ksample03.ko: 
	cp ../Module.symvers ./Module.symvers
	$(MAKE) $(SPARSE_FLAGS) $(KFLAG)=$(shell pwd) CONFIG_APCI3600_SAMPLE03=m ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) KBUILD_EXTRA_SYMBOLS=$(shell pwd)/../Module.symvers modules

ksample06.ko: 
	cp ../Module.symvers ./Module.symvers
	$(MAKE) $(SPARSE_FLAGS) $(KFLAG)=$(shell pwd) CONFIG_APCI3600_SAMPLE06=m ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) KBUILD_EXTRA_SYMBOLS=$(shell pwd)/../Module.symvers modules

ksample07.ko: 
	cp ../Module.symvers ./Module.symvers
	$(MAKE) $(SPARSE_FLAGS) $(KFLAG)=$(shell pwd) CONFIG_APCI3600_SAMPLE07=m ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) KBUILD_EXTRA_SYMBOLS=$(shell pwd)/../Module.symvers modules

ksample08.ko: 
	cp ../Module.symvers ./Module.symvers
	$(MAKE) $(SPARSE_FLAGS) $(KFLAG)=$(shell pwd) CONFIG_APCI3600_SAMPLE08=m ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) KBUILD_EXTRA_SYMBOLS=$(shell pwd)/../Module.symvers modules

ksample09.ko: 
	cp ../Module.symvers ./Module.symvers
	$(MAKE) $(SPARSE_FLAGS) $(KFLAG)=$(shell pwd) CONFIG_APCI3600_SAMPLE09=m ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) KBUILD_EXTRA_SYMBOLS=$(shell pwd)/../Module.symvers modules

ksample10.ko: 
	cp ../Module.symvers ./Module.symvers
	$(MAKE) $(SPARSE_FLAGS) $(KFLAG)=$(shell pwd) CONFIG_APCI3600_SAMPLE10=m ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) KBUILD_EXTRA_SYMBOLS=$(shell pwd)/../Module.symvers modules

ksample11.ko: 
	cp ../Module.symvers ./Module.symvers
	$(MAKE) $(SPARSE_FLAGS) $(KFLAG)=$(shell pwd) CONFIG_APCI3600_SAMPLE11=m ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) KBUILD_EXTRA_SYMBOLS=$(shell pwd)/../Module.symvers modules

ksample12.ko: 
	cp ../Module.symvers ./Module.symvers
	$(MAKE) $(SPARSE_FLAGS) $(KFLAG)=$(shell pwd) CONFIG_APCI3600_SAMPLE12=m ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) KBUILD_EXTRA_SYMBOLS=$(shell pwd)/../Module.symvers modules

ksample13.ko: 
	cp ../Module.symvers ./Module.symvers
	$(MAKE) $(SPARSE_FLAGS) $(KFLAG)=$(shell pwd) CONFIG_APCI3600_SAMPLE13=m ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) KBUILD_EXTRA_SYMBOLS=$(shell pwd)/../Module.symvers modules

.depend:
	$(MAKE)  $(KFLAG)=$(shell pwd) CONFIG_sample00_IOCTL=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) dep
	$(MAKE)  $(KFLAG)=$(shell pwd) CONFIG_sample03_IOCTL=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) dep
	$(MAKE)  $(KFLAG)=$(shell pwd) CONFIG_sample06_IOCTL=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) dep
	$(MAKE)  $(KFLAG)=$(shell pwd) CONFIG_sample07_IOCTL=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) dep
	$(MAKE)  $(KFLAG)=$(shell pwd) CONFIG_sample08_IOCTL=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) dep
	$(MAKE)  $(KFLAG)=$(shell pwd) CONFIG_sample09_IOCTL=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) dep
	$(MAKE)  $(KFLAG)=$(shell pwd) CONFIG_sample10_IOCTL=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) dep
	$(MAKE)  $(KFLAG)=$(shell pwd) CONFIG_sample11_IOCTL=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) dep
	$(MAKE)  $(KFLAG)=$(shell pwd) CONFIG_sample12_IOCTL=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) dep
	$(MAKE)  $(KFLAG)=$(shell pwd) CONFIG_sample13_IOCTL=m  ADDIDATAINC=$(ADDIDATAINC) -C $(KERNELSRCDIR) dep

