BASEDIR=$(shell pwd)


########################################
# USER CONFIGS
########################################

#PATH to linux source/headers
#LINUX=/usr/src/linux
LINUX=/lib/modules/$(shell uname -r)/build

#where to find actual things (mISDN, andmISDNuser, also chan_misdn)
HTTP_MISDN_SRC=http://isdn.jolly.de/download/v3.1
HTTP_MISDNUSER_SRC=http://isdn.jolly.de/download/v3.1

MISDN_TGZ=mISDN_for_PBX4Linux-3.0.tar.gz
MISDNUSER_TGZ=mISDNuser_for_PBX4Linux-3.0.tar.gz


# Here you could set a release for example
HTTP_CHAN_MISDN_SRC=http://www.beronet.com/download/chan_misdn/releases/V0.2/
CHAN_MISDN_TGZ=chan_misdn.tar.gz


MISDNUSERCC=$(shell sed -ne "s/HOSTCC.*=.*\(gcc.*\)/\1/p" $(LINUX)/Makefile | grep gcc || echo gcc )

########################################
# USER CONFIGS END
########################################

#Internals
MISDNDIR=$(BASEDIR)/mISDN
MISDNUSERDIR=$(BASEDIR)/mISDNuser
CHAN_MISDNDIR=$(BASEDIR)/chan_misdn

MISDN_SRC=$(MISDNDIR)/drivers/isdn/hardware/mISDN
MISDN_INC=$(MISDNDIR)/include

EXTRAFLAGS+=-DMISDNUSER_JOLLY

#EXTRA_CONFIGS=$(shell cat $(LINUX)/.config | sed -e "s/\#//g" )
CONFIGS+=CONFIG_MISDN_DRV=m CONFIG_MISDN_DSP=m 
CONFIGS+=CONFIG_MISDN_HFCMULTI=m 
CONFIGS+=CONFIG_MISDN_HFCPCI=m
CONFIGS+=CONFIG_MISDN_HFCUSB=m
#CONFIGS+=CONFIG_MISDN_AVM_FRITZ=m
CONFIGS+=$(EXTRA_CONFIGS)

MISDNUSER_LIBS=$(MISDNUSERDIR)/libmISDN.a $(MISDNUSERDIR)/libisdnnet.a

all: test_preempt $(CHAN_MISDNDIR)/chan_misdn.so


$(CHAN_MISDNDIR)/chan_misdn.so: $(CHAN_MISDNDIR) MISDN_MAKE_MODS $(MISDNUSER_LIBS)
#
# Make the chan_misdn stuff
#
	@echo
	@echo "Makeing chan_misdn"
	@echo "=================="
	@echo

	if ! grep touched_by_crich $(CHAN_MISDNDIR)/Makefile ; then \
		echo  "#touched_by_crich" > $(CHAN_MISDNDIR)/tmpMakefile; \
		echo "CFLAGS+=-I$(MISDNUSERDIR)/include -I$(MISDN_INC) -I$(MISDNUSERDIR)/i4lnet/" >>  $(CHAN_MISDNDIR)/tmpMakefile; \
		cat $(CHAN_MISDNDIR)/Makefile >> $(CHAN_MISDNDIR)/tmpMakefile; \
		mv $(CHAN_MISDNDIR)/tmpMakefile $(CHAN_MISDNDIR)/Makefile; \
		sed -i -e "s@MISDNUSER=.*@MISDNUSER=$(MISDNUSERDIR)@" $(CHAN_MISDNDIR)/Makefile; \
	fi
	cd $(CHAN_MISDNDIR);  make EXTRA_CFLAGS="-I$(MISDNUSERDIR)/include -I$(MISDN_INC) -I$(MISDNUSERDIR)/i4lnet/ $(EXTRAFLAGS)" MISDNUSER=$(MISDNUSERDIR)



#$(MISDN_MODS): $(MISDNDIR)
MISDN_MAKE_MODS: $(MISDNDIR) 

#
# Make The mISDN stuff
#
	@echo
	@echo "Makeing mISDN"
	@echo "============="
	@echo
	if ! diff $(MISDNDIR)/include/linux/mISDNif.h /usr/include/linux/mISDNif.h > /dev/null 2>/dev/null ; then cp $(MISDNDIR)/include/linux/mISDNif.h /usr/include/linux/mISDNif.h ; fi
	if ! diff $(MISDNDIR)/include/linux/mISDNif.h $(LINUX)/include/linux/mISDNif.h > /dev/null 2>/dev/null ; then cp $(MISDNDIR)/include/linux/mISDNif.h $(LINUX)/include/linux/mISDNif.h ; fi
	if ! diff $(MISDNDIR)/include/linux/isdn_compat.h /usr/include/linux/isdn_compat.h >/dev/null 2>/dev/null ; then cp $(MISDNDIR)/include/linux/isdn_compat.h /usr/include/linux/isdn_compat.h ; fi
	if ! diff $(MISDNDIR)/include/linux/isdn_compat.h $(LINUX)/include/linux/isdn_compat.h >/dev/null 2>/dev/null ; then cp $(MISDNDIR)/include/linux/isdn_compat.h $(LINUX)/include/linux/isdn_compat.h ; fi
	cp $(MISDNDIR)/drivers/isdn/hardware/mISDN/Makefile.v2.6 $(MISDNDIR)/drivers/isdn/hardware/mISDN/Makefile

	cd $(LINUX) ; make SUBDIRS=$(MISDN_SRC) modules $(CONFIGS) 


$(MISDNUSER_LIBS): $(MISDNUSERDIR)
#
# Make the mISDNuser stuff
#
	@echo
	@echo "Makeing mISDNuser"
	@echo "================="
	@echo
	if ! grep touched_by_crich $(MISDNUSERDIR)/Makefile ; then \
		sed -i -e "s@export CFLAGS@CFLAGS+=-I$(MISDN_INC)\nexport CFLAGS\n#touched_by_crich@" $(MISDNUSERDIR)/Makefile ; \
	fi
	echo $(MISDNUSERCC)
	cd  $(MISDNUSERDIR); export CC=$(MISDNUSERCC) ; make 



$(MISDN_TGZ):
	if [ ! -d $(MISDNDIR) ] ; then wget $(HTTP_MISDN_SRC)/$(MISDN_TGZ); fi

$(MISDNUSER_TGZ):
	if [ ! -d $(MISDNUSERDIR) ] ; then wget $(HTTP_MISDNUSER_SRC)/$(MISDNUSER_TGZ); fi

$(CHAN_MISDN_TGZ):
	if [ ! -d $(CHAN_MISDNDIR) ] ; then wget $(HTTP_CHAN_MISDN_SRC)/$(CHAN_MISDN_TGZ); fi

$(MISDNDIR): $(MISDN_TGZ)
	if [ ! -d $(MISDNDIR) ] ; then tar xzf $(MISDN_TGZ) ; \
		patch -p1 -d $(MISDNDIR) < patches/mISDN_echo_cancel.patch; \
		patch -p1 -d $(MISDNDIR) < patches/mISDN_fedora.patch; \
	fi

$(MISDNUSERDIR): $(MISDNUSER_TGZ)
	if [ ! -d $(MISDNUSERDIR) ] ; then tar xzf $(MISDNUSER_TGZ); \
		patch -p1 -d $(MISDNUSERDIR) < patches/mISDNuser-dup-strL2State.patch; \
		patch -p1 -d $(MISDNUSERDIR) < patches/mISDNuser-kernel-header-abuse.patch; \
	fi

$(CHAN_MISDNDIR): $(CHAN_MISDN_TGZ)
	if [ ! -d $(CHAN_MISDNDIR) ] ; then tar xzf $(CHAN_MISDN_TGZ); fi


install: all
	cd $(LINUX) ; make SUBDIRS=$(MISDN_SRC) modules_install 

	depmod
	cd $(CHAN_MISDNDIR); make install

snapshot:
	rm -rf /tmp/install-misdn
	mkdir /tmp/install-misdn
	mkdir /tmp/install-misdn/patches
	cp Makefile README /tmp/install-misdn/
	cp patches/*.patch /tmp/install-misdn/patches/
	cd /tmp ; tar czf install-misdn.tar.gz install-misdn


GCCVERSION=$(shell $(CC) --version  | grep GCC  | cut -d " " -f 3  | cut -d "." -f 1)
test_preempt:
	@if  grep 'CONFIG_DEBUG_SPINLOCK=y' $(LINUX)/.config   ; then \
		echo -e "\n\n!!!!!!!!!!!!!!!!!!!!!!!!!!\nDisable the DEBUG_SPINLOCK Setting in your Kernel Config.\n with this option set, mISDN will not work! \n\n" ;\
		read ; \
		exit 1 ; \
	fi
	@if  grep 'CONFIG_DEBUG_SPINLOCK_SLEEP=y' $(LINUX)/.config   ; then \
		echo -e "\n\n!!!!!!!!!!!!!!!!!!!!!!!!!!\nDisable the DEBUG_SPINLOCK_SLEEP Setting in your Kernel Config.\n with this option set, mISDN will not work! \n\n" ;\
		read ; \
		exit 1 ; \
	fi
	@if  grep 'CONFIG_SMP=y' $(LINUX)/.config   ; then \
		echo -e "\n\n!!!!!!!!!!!!!!!!!!!!!!!!!!\nDisable the SMP Setting in your Kernel Config.\n\n" ; \
		read ; \
		exit 1 ; \
	fi
	@if test "$(GCCVERSION)" -gt 3 ; then \
		echo -e "\n\n!!!!!!!!!!!!!!!!!!!!!!!!!!\nYou're using GCC 4! Please downgrade to gcc-3.x and type:\nexport CC=gcc-3.x\nbefore issuing make again.\nyou won't have success with gcc-4!\n\n" ; \
		read ; \
		exit 1 ; \
	fi




.PHONY: install all snapshot test_preempt MISDN_MAKE_MODS

clean:
	rm -rf mISDN/drivers/isdn/hardware/mISDN/*.o
	rm -rf mISDN/drivers/isdn/hardware/mISDN/*.ko
	rm -rf *~
	make -C mISDNuser clean
	make -C $(CHAN_MISDNDIR) clean

update:
	if [ -d TMP ]; then rm -rf TMP; fi
	mkdir TMP
	wget -PTMP/ http://www.beronet.com/downloads/install-misdn.tar.gz
	tar zxf TMP/install-misdn.tar.gz --directory=TMP/
	rm -rf chan_misdn chan_misdn.tar.gz mISDN mISDN_for_PBX4Linux-3.0.tar.gz mISDNuser mISDNuser_for_PBX4Linux-3.0.tar.gz patches README
	mv TMP/install-misdn/* .
	rm -rf TMP
	make

	@ echo
	@ echo "You've successfully updated your mISDN Sources!"
	@ echo "Install them via \"make install\"."
	@ echo
