#
#
# Copyright (C) 2004 by Oleg I. Vdovikin <oleg@cs.msu.su>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#

ROOT := $(shell (cd .. && pwd -P))
SRC := $(ROOT)/router
export TOP := $(ROOT)/gateway
export KERNEL_DIR := $(ROOT)/linux/linux

BUSYBOX=busybox-1.01
DROPBEAR=dropbear-0.47
DNSMASQ=dnsmasq-2.22
P910ND=p910nd-0.7
SAMBA=samba-2.0.10
IPROUTE2=iproute2-2.4.7-now-ss010824
E2FSPROGS=e2fsprogs-1.35
UCDSNMP=ucd-snmp-3.6.2
IPTABLES=iptables-1.2.7a
PPP=ppp-2.4.2
PPTP=pptp-1.6.0
LZMA=lzma406
LOADER=loader-0.04
NFSUTILS=nfs-utils-1.0.7
PORTMAP=portmap_4
RADVD=radvd-0.7.2
L2TP=rp-l2tp-0.4

UCLIBC=uClibc-0.9.19

ET=et-1.9.2.7-6b
WL=wl-3.90.23.0

CROSS=mipsel-uclibc-
CC=$(CROSS)gcc
LD=$(CROSS)ld
AR=$(CROSS)ar
RANLIB=$(CROSS)ranlib

all: prep custom
	@true

$(ROOT)/uClibc:
	@rm -rf $(ROOT)/$(UCLIBC) $@
	tar xjf $(UCLIBC).tar.bz2 -C $(ROOT)
	@./patch.sh $(ROOT)/$(UCLIBC) uClibc-0.9.19.diff \
		uClibc-0.9.19-resolv.patch uClibc-0.9.19-dn_expand.patch \
		uClibc-0.9.19-timezones.patch uClibc-0.9.19-trunc64.patch
	cp $(UCLIBC).config $(ROOT)/$(UCLIBC)/.config
	mv $(ROOT)/$(UCLIBC) $@

uClibc: $(ROOT)/uClibc
	make -C $^ all install CROSS=mipsel-linux-
	rm -f /opt/brcm/hndtools-mipsel-uclibc
	ln -s hndtools-mipsel-uclibc-3.2.3-full /opt/brcm/hndtools-mipsel-uclibc

custom:	loader busybox dropbear dnsmasq p910nd samba iproute2 e2fsprogs \
	iptables ppp pptp nfs-utils portmap nas radvd ucdsnmp rp-l2tp \
	ntpclient bpalogin bridge config ez-ipupdate httpd infosvr jpeg-6b lib LPRng \
	misc netconf nvram others pppoe-relay rc rcamdmips sendmail \
	shared stupid-ftpdmips test upnp utils vlan wlconf www rt2460 et.SENTRY5 libcrypto
	[ -f $(TOP)/Makefile ] || cp $(SRC)/Makefile $(TOP) && patch -d $(TOP) -p1 < Makefile.diff
	[ -f $(TOP)/Makefiles5.mk ] || cp $(SRC)/Makefiles5.* $(TOP) && patch -d $(TOP) -p1 < Makefiles5.diff
	$(MAKE) -C $(TOP) .config	
	$(MAKE) -C $(TOP)/rc clean
	$(MAKE) -C $(TOP)/infosvr clean
	$(MAKE) -C $(TOP)/vlan clean
	$(MAKE) -C $(TOP)/shared clean
	$(MAKE) -C $(TOP)/LPRng clean
	$(MAKE) -C $(TOP)/httpd clean
	[ -f $(TOP)/utils/wl ] || cp $(SRC)/mipsel-uclibc/install/utils/usr/sbin/wl $(TOP)/utils
	cp iBox_title_all_HDD.jpg $(TOP)/www/asus/web_asus_en/graph/
	rm -f $(ROOT)/wl/linux/wl.o && gunzip -c $(WL).gz > $(ROOT)/wl/linux/wl.o
	tar -C $(ROOT) -xjf asustrx.tar.bz2 
	@echo
	@echo Sources prepared for compilation
	@echo

prep:
	@mkdir -p $(TOP)

$(ROOT)/lzma: $(LZMA).zip
	@rm -rf $@ && mkdir -p $@
	unzip -q $^ -d $@
	patch -d $@ -p1 < $(LZMA).patch

lzma: $(ROOT)/lzma
	@true

et:
	[ -d $(ROOT)/$(ET).orig ] || mv $(ROOT)/et $(ROOT)/$(ET).orig
	tar -C $(ROOT) -xzf $(ET).tar.gz

kernel-mrproper:
	$(MAKE) -C $(KERNEL_DIR) mrproper
	$(MAKE) -C $(KERNEL_DIR)/arch/mips/brcm-boards/bcm947xx/compressed/ clean

kernel: lzma et kernel-mrproper 
	@echo Patching kernel...
	@./patch.sh $(KERNEL_DIR) kernel.patch kernel-usb.patch kernel-ide.patch \
		kernel-printer-asus.patch kernel-printer-13.patch kernel-printer-channel.patch \
		kernel-robo.patch kernel-printer-undo.patch kernel-mppe-mppc-0.98.patch \
		kernel-lzma.patch kernel-mksquashfs-lzma.patch kernel-trx.patch \
		kernel-netfilter-debug.patch kernel-pl2303.patch kernel-nfs-maxblksize.patch \
		kernel-netfilter-extras.patch kernel-printer-asus-2.patch kernel-syn-recv.patch \
		kernel-audigy.patch kernel-serial-irq.patch
	cp kernel.config $(KERNEL_DIR)/arch/mips/defconfig-bcm947xx

$(TOP)/loader: $(LOADER).tar.bz2
	@rm -rf $(TOP)/$(LOADER) $(TOP)/loader
	tar xjf $(LOADER).tar.bz2 -C $(TOP)
	mv $(TOP)/$(LOADER) $(TOP)/loader

loader: $(TOP)/loader
	@true

$(TOP)/busybox: $(BUSYBOX).tar.bz2 $(BUSYBOX).patch
	@rm -rf $(TOP)/$(BUSYBOX) $(TOP)/busybox
	tar xjf $(BUSYBOX).tar.bz2 -C $(TOP)
	patch -d $(TOP)/$(BUSYBOX) -p1 < $(BUSYBOX).patch
	patch -d $(TOP)/$(BUSYBOX) -p1 < $(BUSYBOX)-applets.diff
	cp $(BUSYBOX).config $(TOP)/$(BUSYBOX)/sysdeps/linux/defconfig
	mv $(TOP)/$(BUSYBOX) $(TOP)/busybox

busybox-diff:
	@rm -rf $(TOP)/$(BUSYBOX)
	tar xjf $(BUSYBOX).tar.bz2 -C $(TOP)
	make -C $(TOP)/busybox distclean
	-(cd $(TOP) && diff -BurN $(BUSYBOX) busybox) > $(BUSYBOX).patch

busybox: $(TOP)/busybox
	@true

$(TOP)/dropbear/config.h:
	@rm -rf $(TOP)/$(DROPBEAR) $(TOP)/dropbear
	tar xjf $(DROPBEAR).tar.bz2 -C $(TOP)
	patch -d $(TOP)/$(DROPBEAR) -p1 < $(DROPBEAR).patch
	cd $(TOP)/$(DROPBEAR) && \
		CC=$(CC) ./configure --host=mipsel-linux --disable-zlib --disable-shadow \
		--disable-lastlog --disable-utmp --disable-utmpx --disable-wtmp --disable-wtmpx \
		--disable-libutil --disable-loginfunc --disable-pututline --disable-pututxline
	mv $(TOP)/$(DROPBEAR) $(TOP)/dropbear

dropbear-diff: #$(TOP)/dropbear/config.h
	@rm -rf $(TOP)/$(DROPBEAR)
	tar xjf $(DROPBEAR).tar.bz2 -C $(TOP)
	(cd $(TOP) && diff -Bur $(DROPBEAR) dropbear | grep -v ^Only) > $(DROPBEAR).patch
	diffstat $(DROPBEAR).patch

dropbear: $(TOP)/dropbear/config.h
	@true

$(TOP)/e2fsprogs/Makefile:
	@rm -rf $(TOP)/$(E2FSPROGS) $(TOP)/e2fsprogs
	tar xzf $(E2FSPROGS).tar.gz -C $(TOP)
	patch -d $(TOP)/$(E2FSPROGS) -p1 < $(E2FSPROGS).patch
	mv $(TOP)/$(E2FSPROGS) $(TOP)/e2fsprogs
	cd $(TOP)/e2fsprogs && \
		CC=$(CC) AR=$(AR) RANLIB=$(RANLIB) ./configure --host=mipsel-linux \
		--disable-evms --disable-swapfs --disable-debugfs --disable-imager \
		--disable-resizer --enable-dynamic-e2fsck --with-gnu-ld --disable-nls

e2fsprogs: $(TOP)/e2fsprogs/Makefile
	@true

$(TOP)/ucdsnmp/Makefile:
	@rm -rf $(TOP)/$(UCDSNMP) $(TOP)/ucdsnmp
	tar xzf $(UCDSNMP).tar.gz -C $(TOP)
	patch -d $(TOP)/$(UCDSNMP) -p1 < $(UCDSNMP).patch
	patch -d $(TOP)/$(UCDSNMP) -p1 < ucd-snmp-3.6.2-interfaces.patch
	mv $(TOP)/$(UCDSNMP) $(TOP)/ucdsnmp
	cd $(TOP)/ucdsnmp && CC=$(CC) AR=$(AR) RANLIB=$(RANLIB) \
		ac_cv_CAN_USE_SYSCTL=no ac_cv_struct_ifnet_has_if_obytes=yes \
		ac_cv_struct_ifnet_has_if_ibytes=yes ac_cv_struct_ifnet_has_if_ibytes=yes \
		./configure --host=mipsel-linux \
		--disable-debugging --without-opaque-special-types --with-out-mib-modules="v2party" \
		--with-sys-location=Unknown --with-sys-contact=Administrator --with-logfile=/var/log/snmpd.log

ucdsnmp: $(TOP)/ucdsnmp/Makefile
	@true

$(TOP)/iproute2: $(IPROUTE2).tar.gz
	@rm -rf $(TOP)/$@
	tar xzf $^ -C $(TOP)
	patch -d $@ -p1 < $(IPROUTE2).patch && touch $@

iproute2: $(TOP)/iproute2
	@true

$(TOP)/dnsmasq: $(DNSMASQ).tar.gz
	@rm -rf $(TOP)/$(DNSMASQ) $@
	tar xzf $^ -C $(TOP)
	patch -d $(TOP)/$(DNSMASQ) -p1 < $(DNSMASQ).patch
	mv $(TOP)/$(DNSMASQ) $(TOP)/dnsmasq && touch $@

dnsmasq-diff: $(DNSMASQ).tar.gz
	@rm -rf $(TOP)/$(DNSMASQ)
	tar xzf $^ -C $(TOP)
	-make -C $(TOP)/dnsmasq clean
	-(cd $(TOP) && diff -BurN $(DNSMASQ) dnsmasq) > $(DNSMASQ).patch

dnsmasq: $(TOP)/dnsmasq
	@true

$(TOP)/p910nd: $(P910ND).tar.bz2
	@rm -rf $(TOP)/$(P910ND) $@
	tar xjf $^ -C $(TOP)
	patch -d $(TOP)/$(P910ND) -p1 < $(P910ND).patch
	mv $(TOP)/$(P910ND) $@ && touch $@

p910nd-diff:
	@rm -rf $(TOP)/$(P910ND)
	tar xjf $(P910ND).tar.bz2 -C $(TOP)
	-rm -f $(TOP)/p910nd/p910nd
	-cd $(TOP) && diff -BurN $(P910ND) p910nd > $(P910ND).patch

p910nd: $(TOP)/p910nd
	@true

$(TOP)/samba/source/Makefile: $(SAMBA).tar.gz
	@rm -rf $(TOP)/$(SAMBA) $@
	tar xzf $^ -C $(TOP)
	patch -d $(TOP)/$(SAMBA) -p1 < $(SAMBA).patch
	patch -d $(TOP)/$(SAMBA) -p1 < $(SAMBA)-security.patch
	patch -d $(TOP)/$(SAMBA) -p1 < $(SAMBA)-writex.patch
	patch -d $(TOP)/$(SAMBA) -p1 < $(SAMBA)-cp1251.patch
	tar xzvf $(SAMBA)-codepages.tar.gz -C $(TOP)/$(SAMBA)
	mv $(TOP)/$(SAMBA) $(TOP)/samba
	cd $(TOP)/samba/source && \
		ac_cv_sizeof_int=4 ac_cv_sizeof_long=4 ac_cv_sizeof_short=2 \
		samba_cv_FTRUNCATE_NEEDS_ROOT=no samba_cv_HAVE_BROKEN_FCNTL64_LOCKS=no \
		samba_cv_HAVE_BROKEN_GETGROUPS=no samba_cv_HAVE_BROKEN_READDIR=no \
		samba_cv_HAVE_FCNTL_LOCK=yes samba_cv_HAVE_FNMATCH=yes \
		samba_cv_HAVE_FTRUNCATE_EXTEND=no samba_cv_HAVE_IFACE_AIX=no \
		samba_cv_HAVE_IFACE_IFCONF=yes samba_cv_HAVE_IFACE_IFREQ=yes \
		samba_cv_HAVE_INO64_T=yes samba_cv_HAVE_IRIX_SPECIFIC_CAPABILITIES=no \
		samba_cv_HAVE_OFF64_T=yes samba_cv_HAVE_ROOT=yes \
		samba_cv_HAVE_SECURE_MKSTEMP=yes samba_cv_HAVE_SHARED_MMAP=yes \
		samba_cv_HAVE_STRUCT_FLOCK64=yes samba_cv_HAVE_SYSV_IPC=no \
		samba_cv_HAVE_TRUNCATED_SALT=no samba_cv_HAVE_UNION_SEMUN=no \
		samba_cv_HAVE_UNSIGNED_CHAR=yes samba_cv_NEED_SGI_SEMUN_HACK=no \
		samba_cv_REPLACE_INET_NTOA=no samba_cv_SIZEOF_INO_T=4 \
		samba_cv_SIZEOF_OFF_T=4 samba_cv_SYSCONF_SC_NGROUPS_MAX=yes \
		samba_cv_USE_SETRESUID=no samba_cv_USE_SETREUID=yes \
		samba_cv_USE_SETEUID=yes samba_cv_USE_SETUIDX=no \
		samba_cv_have_longlong=yes samba_cv_have_setresgid=no \
		samba_cv_have_setresuid=no samba_cv_HAVE_GETTIMEOFDAY_TZ=yes \
		CPPFLAGS="-D_GNU_SOURCE -DNDEBUG -DSHMEM_SIZE=524288 -Dfcntl=fcntl64" CFLAGS="-Os" \
		CC=$(CC) LD=$(LD) AR=$(AR) RANLIB=$(RANLIB) ./configure --host=mipsel-linux \
		--prefix=/usr --localstatedir=/var/log --libdir=/etc \
		--with-privatedir=/etc --with-lockdir=/var/lock

samba-diff: $(SAMBA).tar.gz
	@rm -rf $(TOP)/$(SAMBA)
	tar xzf $^ -C $(TOP)
	-make -C $(TOP)/samba/source clean
	(cd $(TOP) && diff -BurN $(SAMBA) samba | grep -v ^Binary.*differ$$) > $(SAMBA).patch
	diffstat $(SAMBA).patch

samba: $(TOP)/samba/source/Makefile
	@true

$(TOP)/iptables: $(IPTABLES).tar.bz2
	@rm -rf $(TOP)/$(IPTABLES) $@
	tar xjf $^ -C $(TOP)
	patch -d $(TOP)/$(IPTABLES) -p1 < $(IPTABLES).patch
	mv $(TOP)/$(IPTABLES) $@ && touch $@

iptables: $(TOP)/iptables
	@true

$(TOP)/nfs-utils/Makefile:
	@rm -rf $(TOP)/$(NFSUTILS) $(TOP)/nfs-utils
	tar xzf $(NFSUTILS).tar.gz -C $(TOP)
	patch -d $(TOP)/$(NFSUTILS) -p1 < $(NFSUTILS).patch
	mv $(TOP)/$(NFSUTILS) $(TOP)/nfs-utils
	cd $(TOP)/nfs-utils && \
		CC=$(CC) LD=$(LD) AR=$(AR) RANLIB=$(RANLIB) ./configure --host=mipsel-linux \
		--enable-nfsv3 --disable-nfsv4 --disable-gss --disable-rquotad

nfs-utils: $(TOP)/nfs-utils/Makefile
	@true

$(TOP)/portmap:
	@rm -rf $(TOP)/$(PORTMAP) $(TOP)/portmap
	tar xzf $(PORTMAP).tar.gz -C $(TOP)
	patch -d $(TOP)/$(PORTMAP) -p1 < $(PORTMAP).patch
	mv $(TOP)/$(PORTMAP) $(TOP)/portmap

portmap: $(TOP)/portmap
	@true

$(TOP)/radvd/Makefile:
	@rm -rf $(TOP)/$(RADVD) $(TOP)/radvd
	tar xzf $(RADVD).tar.gz -C $(TOP)
	patch -d $(TOP)/$(RADVD) -p1 < $(RADVD).patch
	mv $(TOP)/$(RADVD) $(TOP)/radvd
	cd $(TOP)/radvd && \
		CC=$(CC) LD=$(LD) AR=$(AR) RANLIB=$(RANLIB) ./configure --host=mipsel-linux \
		--prefix=""

radvd: $(TOP)/radvd/Makefile
	@true

$(TOP)/rp-l2tp/Makefile:
	@rm -rf $(TOP)/$(L2TP) $(TOP)/rp-l2tp
	tar xzf $(L2TP).tar.gz -C $(TOP)
	patch -d $(TOP)/$(L2TP) -p1 < $(L2TP).patch
	patch -d $(TOP)/$(L2TP) -p1 < $(L2TP)-persist.patch
	mv $(TOP)/$(L2TP) $(TOP)/rp-l2tp
	cd $(TOP)/rp-l2tp && \
		CC=$(CC) LD=$(LD) AR=$(AR) RANLIB=$(RANLIB) \
		./configure --host=mipsel-linux --prefix=/usr

rp-l2tp: $(TOP)/rp-l2tp/Makefile
	@true

$(TOP)/ppp: $(PPP).tar.gz
	@rm -rf $(TOP)/$(PPP) $@
	tar xzf $^ -C $(TOP)
	patch -d $(TOP)/$(PPP) -p1 < $(PPP)-fix.patch
	patch -d $(TOP)/$(PPP) -p1 < $(PPP).patch
	patch -d $(TOP)/$(PPP) -p1 < $(PPP)-mppe.patch
	patch -d $(TOP)/$(PPP) -p1 < $(PPP)-ip-up.patch
	patch -d $(TOP)/$(PPP) -p1 < $(PPP)-signal.patch
	mv $(TOP)/$(PPP) $@ && touch $@

$(TOP)/ppp/Makefile: $(TOP)/ppp
	cd $^ && ./configure --prefix=/usr --sysconfdir=/tmp

ppp: $(TOP)/ppp/Makefile
	@true

$(TOP)/pptp: $(PPTP).tar.gz
	@rm -rf $(TOP)/$(PPTP) $@
	tar xzf $^ -C $(TOP)
	patch -d $(TOP)/$(PPTP) -p1 < $(PPTP).patch
	mv $(TOP)/$(PPTP) $@ && touch $@

pptp: $(TOP)/pptp
	@true

nas:
	patch -d $(TOP) -p1 < $@.diff
	cp $(SRC)/mipsel-uclibc/install/nas/usr/sbin/nas $(TOP)/$@

upnp:
	[ ! -d $(SRC)/../tools/$@ ] || [ -d $(TOP)/$@ ] || \
		tar -C $(SRC)/../tools -cf - $@ | tar -C $(TOP) -xf -
	[ ! -f $@.diff ] || patch -d $(TOP) -p1 --no-backup-if-mismatch < $@.diff

upnp-diff:
	(cd .. && diff -BurN tools/upnp gateway/upnp | grep -v ^Binary.*differ$$) > upnp.diff
	diffstat upnp.diff

%:
	[ ! -d $(SRC)/$* ] || [ -d $(TOP)/$* ] || \
		tar -C $(SRC) -cf - $* | tar -C $(TOP) -xf -
	[ ! -f $*.diff ] || patch -d $(TOP) -p1 --no-backup-if-mismatch < $*.diff

www-diff:
	(cd .. && diff -BurN router/www/asus/web_asus_en gateway/www/asus/web_asus_en | grep -v ^Binary.*differ$$) > www.diff
	(cd .. && diff -BuN router/www/asus/ gateway/www/asus/ | grep -v ^Binary.*differ$$) >> www.diff
	diffstat www.diff

%-diff:
	(cd .. && diff -BurN router/$* gateway/$* | grep -v ^Binary.*differ$$) > $*.diff
	diffstat $*.diff


