LINUX_SRC=	/usr/src/linux

INCL_FLAGS=	-I. -I$(LINUX_SRC)/include
DEF_FLAGS=	-D__KERNEL__ -DLINUX -DLOCAL_HEADERS -DEXPORT_SYMTAB 
CONFIG_FLAGS=	-DCONFIG_SERIAL_MANY_PORTS -DCONFIG_SERIAL_MULTIPORT
BASE_FLAGS= 	-m486 -O2 -Wall $(INCL_FLAGS) $(DEF_FLAGS) $(CONFIG_FLAGS) \
			`cat .smpflag`

CFLAGS=		$(BASE_FLAGS) `cat .modflag`
GENKSYM_FLAGS=	$(BASE_FLAGS) -D__GENKSYMS__

LDFLAGS= 	-s -N 
CC=		gcc
GENKSYMS=	genksyms

VERFILE=	$(LINUX_SRC)/include/linux/modules/serial.ver
MODVERFILE=	$(LINUX_SRC)/include/linux/modversions.h

DEP_HEADERS=	serial.h serialP.h version.h \
			$(LINUX_SRC)/include/linux/version.h

all: test_version maybe_modules serial.o 

test_version:
	@ISMP='';KSMP='';cp /dev/null .smpflag; \
	if grep -q smp_ $(LINUX_SRC)/include/linux/modules/ksyms.ver ; then \
		ISMP='-SMP'; echo "-D__SMP__" > .smpflag ; \
	fi ; \
	if grep -q smp_ /proc/ksyms ; then \
		KSMP='-SMP'; \
	fi ; \
	IMOD=''; KMOD='';cp /dev/null .modflag; \
	if grep -q "#define CONFIG_MODVERSIONS" \
			$(LINUX_SRC)/include/linux/autoconf.h ; then \
		IMOD='-MOD'; echo "-DMODVERSIONS" > .modflag; \
	fi ; \
	if grep -q "kfree" /proc/ksyms && \
	   ! grep -q "kfree$$" /proc/ksyms ; then \
		KMOD='-MOD' ; \
	fi ; \
	IVER=`grep UTS_RELEASE $(LINUX_SRC)/include/linux/version.h | \
		awk '{print $$3}' | tr -d \"`$$IMOD$$ISMP; \
	KVER=`uname -r`$$KMOD$$KSMP; \
	if [ -f .kver ]; then \
	    OVER=`cat .kver`; \
	    if [ $$OVER != $$IVER ]; then \
		echo "Removing previously built driver for Linux $$OVER"; \
		make clean; \
		echo " "; \
	    fi ; \
	else \
		make clean ; \
	fi ; \
	echo $$IVER > .kver ; \
	echo Building serial driver for Linux $$IVER ; \
	echo " " ; \
	if [ $$IVER != $$KVER ]; then \
	    echo "WARNING: The current kernel is actually version $$KVER." ; \
	    echo " " ; \
	fi

maybe_modules:
	@if test -s .modflag ; then \
		make modversions.h serial.ver ; \
	fi

install:
	@LINUX_SRC=$(LINUX_SRC) sh ./setup.sh

clean:
	rm -f serial.o *~ .kver serial.ver modversions.h 
	rm -rf linux

really-clean: clean
	rm -f *.o 

serial.o: serial.c $(DEP_HEADERS)
	@echo $(CC) $(CFLAGS) -c serial.c -o serial.o ; \
	$(CC) $(CFLAGS) -c serial.c -o serial.o

serial.ver: serial.c $(DEP_HEADERS)
	@echo "Generating serial.ver..." ; \
	if test -s .smpflag ; then smp_prefix="-p smp_"; \
	else smp_prefix=; fi; \
	kver=`sed -e 's/-SMP//' -e 's/-MOD//' .kver` ; \
	$(CC) $(GENKSYM_FLAGS) -E serial.c > serial.tmp ; \
	echo $(CC) $(GENKSYM_FLAGS) -E serial.c \> serial.tmp; \
	case $$kver in \
	2.0.*)	echo $(GENKSYMS) . < serial.tmp ; \
		$(GENKSYMS) . < serial.tmp ;; \
	2.[12].*) echo $(GENKSYMS) $$smp_prefix -k $$kver \< serial.tmp ; \
		$(GENKSYMS) $$smp_prefix -k $$kver < serial.tmp \
			> serial.ver ;; \
	*)      echo "Unsupported kernel version $$kver" ;; \
	esac ; rm -f serial.tmp ; echo rm -f serial.tmp ; \
	mkdir -p linux/modules ; cp serial.ver linux/modules ; \

modversions.h: $(MODVERFILE)
	@if ! grep -q /serial.ver $(MODVERFILE) ; then \
		sed -f modversions.sed < $(MODVERFILE) > modversions.tmp ; \
	else \
		cp $(MODVERFILE) modversions.tmp ; \
	fi ; \
	if ! test -f modversions.h || \
	   ! cmp -s modverisions.h modversions.tmp ; then \
		echo "Generating modversions.h" ; \
		mv modversions.tmp modversions.h ; \
		mkdir -p linux ; cp modversions.h linux ; \
	else rm -f modversions.tmp ; fi

