# Makefile for the Linux CAN-bus driver.
# Written by Arnaud Westenberg email:arnaud@wanadoo.nl
# This software is released under the GPL-License.
# Version lincan-0.2  9 Aug 2003
#
# This Makefile version is adapted from uLan Communication driver
# (C) Copyright 1999 by Pavel Pisa pisa@cmp.felk.cvut.cz
#
#*****************************************************************

# Begin of OCERA framework header
ifdef SUBDIRS
SUBDIRS =
endif
ifneq ($(wildcard ../Standalone.mk),)
# Standalone make outside of OCERA framework

all : default

.PHONY: kernel-pass utils-pass

kernel-pass : default

else
# Build in structure of OCERA framework

ifneq ($(wildcard ../../../../../ocera.mk),)
ifndef TOPDIR
include ../../../../../ocera.mk
else
LINUX_DIR = ../../../../../kernel/linux/
endif
else
all: 
	@echo -e "\nTo build LinCAN driver for OCERA framework, ocera.mk file have"
	@echo -e "to be generated first. Go to ocera/ directory and do 'make', please."
	@echo -e "If standalone build is required, mark lincan/ by 'touch ../Standalone.mk'.\n"
endif
ifdef LINUX_DIR
KERNEL_LOCATION = $(LINUX_DIR)
endif
endif
# End of OCERA framework header

# Where to look for kernel
# if not defined, sources of current running kernel are found
#KERNEL_LOCATION=/usr/src/linux
#KERNEL_LOCATION=/usr/src/linux-2.2.19
#KERNEL_LOCATION=/usr/src/linux-2.2.22
#KERNEL_LOCATION=/usr/src/linux-2.6.0
#KERNEL_LOCATION=/home/cvs/ocera/ocera-build/kernel/linux


# Enable debugging messages
#DEBUG = y

# You can comment out the hardware you don't need. This will result in a smaller
# driver. By default, all hardware is supported in the driver. See the README 
# file for a description of the supported hardware.
#   pccan  	Not to be confused with PCCCAN!!!
#   pcccan 	Not to be confused with PCCAN!!!

SUPPORTED_CARDS = pip pccan smartcan nsi cc_can104 \
	          pc_i03 pcm3680 aim104 m437 pcccan ssv \
		  bfadcan pikronisa kv_pcican msmcan virtual template

#SUPPORTED_CARDS = pcm3680 bfadcan pikronisa template

#SUPPORTED_CARDS = virtual

########## Don't change anything under this line ################

# currently running kernel
CURRENT=$(shell uname -r)
KERNEL_NEW=$(shell if [ -d /lib/modules/$(CURRENT)/build ] ; \
		then echo yes ; else echo no ; fi )

#KERNEL_LOCATION=/usr/src/kernel/$(CURRENT)
#KERNEL_LOCATION=/lib/modules/$(CURRENT)/build

ifndef KERNEL_LOCATION
ifeq ($(KERNEL_NEW),yes)
KERNEL_LOCATION=/lib/modules/$(CURRENT)/build
MODULE_CHAR_LOC=/lib/modules/$(CURRENT)/kernel/drivers/char
else
KERNEL_LOCATION=/usr/src/linux
MODULE_CHAR_LOC=/lib/modules/$(CURRENT)/misc
endif
endif

TOPDIR = $(KERNEL_LOCATION)
CONFIG_SHELL = TOPDIR=$(TOPDIR)

KERNEL_VERSION := $(shell awk -F\" '/REL/ {print $$2}' \
	$(KERNEL_LOCATION)/include/linux/version.h | awk -F\- '{print $$1}')

PROC_FS := $(shell awk -F\  '/PROC_FS/ {print $$3}' \
	$(KERNEL_LOCATION)/include/linux/autoconf.h)

DEVFS_FS := $(shell awk -F\  '/DEVFS_FS/ {print $$3}' \
	$(KERNEL_LOCATION)/include/linux/autoconf.h)

KERNEL_MODULE_V26 := $(shell echo $(KERNEL_VERSION) \
	| sed -n 's/^.*2\.[5-9]\..*$$/yes/p')

ifdef DEBUG
	EXTRA_CFLAGS += -DCAN_DEBUG
	EXTRA_CFLAGS += -ggdb
endif

ifndef MODVERSIONS
#	EXTRA_CFLAGS += -DNOVER
#else
#	EXTRA_CFLAGS += -DMODVERSIONS
endif

ifdef DEVFS_FS
	EXTRA_CFLAGS += -DWITH_DEVFS_FS
endif

ifdef PROC_FS
	O_OBJS += proc.o
endif

# Target object file if any
# this must be undefined for 2.5.xx kernels
ifndef KERNEL_MODULE_V26
O_TARGET     = can.o
endif
# Regular object files
O_OBJS	     += $(SUPPORTED_CARDS:%=%.o)
O_OBJS       += can_queue.o can_quekern.o devcommon.o main.o modparms.o \
		setup.o finish.o irq.o boardlist.o \
		sja1000p.o sja1000.o i82527.o  \
	        open.o proc.o close.o write.o read.o \
		ioctl.o ioctl_query.o select.o fasync.o
# Objects with exported symbols (-DEXPORT_SYMTAB)
OX_OBJS      = 
# Module objects 
M_OBJS       = $(O_TARGET)
# Module only objects with exported symbols (-DEXPORT_SYMTAB)
MX_OBJS      = 
# Kernel only objects 
L_OBJS       =	
# Kernel only objects with exported symbols (-DEXPORT_SYMTAB)
LX_OBJS      = 
# Additional CFLAGS
EXTRA_CFLAGS += -I .

# Linux 2.4.2 and newer build system needs next
can-objs = $(O_OBJS)
obj-y = $(O_OBJS)
obj-m = can.o

ifndef KERNEL_MODULE_V26
FINAL_MODULE_OBJS=$(obj-m)
else
FINAL_MODULE_OBJS=$(obj-m:%.o=%.ko)
endif

########## Source/target independent build of module #############

default : make_this_module
	cp $(FINAL_MODULE_OBJS) ../$(FINAL_MODULE_OBJS)

dep: make_this_module_dep

install : install_this_module

lincan_config.h: Makefile
	echo >lincan_config.h
	$(foreach card, $(SUPPORTED_CARDS), \
	  echo \#define CONFIG_OC_LINCAN_CARD_$(card) 1 >>lincan_config.h ;)
	
make_this_module: lincan_config.h
	echo Linux kernel version $(KERNEL_VERSION)
	echo Linux kernel sources $(KERNEL_LOCATION)
	echo Module target $(obj-m)
	echo Module objects $(can-objs)
	DIR=`pwd`; (cd $(KERNEL_LOCATION); make SUBDIRS=$$DIR modules)

make_this_module_dep:
	DIR=`pwd`; (cd $(KERNEL_LOCATION); make SUBDIRS=$$DIR dep)

install_this_module: make_this_module
	su -c "mkdir -v -p $(MODULE_CHAR_LOC) && cp -v $(FINAL_MODULE_OBJS) $(MODULE_CHAR_LOC)"

clean:
	rm -f $(M_OBJS) $(MX_OBJS) $(O_OBJS) $(OX_OBJS) $(obj-m) \
	      .*.o.flags .*.o.cmd .*.ko.cmd .depend lincan_config.h *~ \
	      $(obj-m:%.o=%.mod.o) $(FINAL_MODULE_OBJS) ../$(FINAL_MODULE_OBJS)

distclean: clean


ifndef KERNEL_MODULE_V26
include $(KERNEL_LOCATION)/Rules.make
endif

