# History:
#	2004/02/09 Matthew	Add ipv4 link-local addressing

export PATH=/usr/local/uclibc/bin:/bin:/usr/bin:/sbin:/usr/sbin

def_model       := $(strip $(shell if [ -f .lock ]; then cat .lock; fi))
def_company     := $(strip $(shell if [ -f .lock2 ]; then cat .lock2; fi))
def_model_ext   := $(strip $(shell if [ -f .lock3 ]; then cat .lock3; fi))

include config

# To make the following parameters to take effect,
# we should pass the variable into subdirectory.
ifeq ($(CONFIG_ARCH),MIPS_R3000)
COMMON_FLAGS	= -mips1 -mcpu=r3000
endif

ifeq ($(CONFIG_ARCH),MIPS_R4000)
COMMON_FLAGS	= -mips2 -mcpu=r4000
endif

RAMTMP		= /tmp/ramtmp
MOUNTPT 	= /mnt/xtmp0

INITRD 		= ramdisk
INITRDMOUNTPT	= /mnt/xtmp1
TARGET		= ramdisk.o
INITRDGZ	= ramdisk.gz

#GPP_INCLUDE_PATH = -I/usr/local/uclibc/include/c++/3.2 \
#		-I/usr/local/uclibc/include/c++/3.2/mipsel-linux
ifeq ($(CONFIG_STANDLIBC),y)
CROSS_COMPILE   =/usr/local/mipsel-linux/sbin/mipsel-linux-
else
CROSS_COMPILE   = mipsel-uclibc-
endif

CC		= $(CROSS_COMPILE)gcc
LD		= $(CROSS_COMPILE)ld
AR		= $(CROSS_COMPILE)ar
AS		= $(CROSS_COMPILE)as
STRIP           = $(CROSS_COMPILE)strip
RANLIB		= $(CROSS_COMPILE)ranlib
#GPP		= $(CROSS_COMPILE)g++ $(GPP_INCLUDE_PATH)

#export CROSS_COMPILE STRIP LD AR AS RANLIB COMPANY_NAME model GPP
export CROSS_COMPILE STRIP LD AR AS RANLIB COMPANY_NAME model

ORIG	= stage
ETC_DIR	= $(ORIG)/etc
RCS_SCRIPT_DIR	= $(ETC_DIR)/rc.d
INIT_SCRIPT_DIR	= $(RCS_SCRIPT_DIR)/init.d
USER_SCRIPT_DIR	= $(ORIG)/usr/sbin

SUBDIRS = \
	libmlinux \
	ash-0.4.8 \
	busybox-0.51 \
	util/getcfg util/pidof util/reboot util/sguard \
	util/Simple_IPv4_Link_Local_Addressing \
#	spooler/printer_server \
#	spooler/Broadcast \
#	ftp \

BIN_FILES = \
	ash-0.4.8/sh \
	busybox-0.51/busybox \
	util/getcfg/getcfg \
	util/pidof/pidof \
	util/reboot/reboot \
	util/sguard/sguard \
	util/Simple_IPv4_Link_Local_Addressing/AVH-IPv4LL \
#	spooler/printer_server/prnserver \
#	spooler/Broadcast/prnbcast \
#	ftp/ftp/ftp \

INIT_SCRIPTS = S19network S21start_hbled
USER_SCRIPTS =
ONCE_SCRIPTS = rcS
ETC_FILES = fstab passwd group inittab protocols services

ifeq ($(CONFIG_DHCP_CLIENT),y)
BIN_FILES += dhcp/dhcpcd 
ifeq ($(CONFIG_BPA),y)
BIN_FILES += bpalogin-2.0.1/bpalogin
endif
USER_SCRIPTS += dhcpc.script
endif

ifeq ($(CONFIG_DHCP_SERVER),y)
BIN_FILES += dhcp/dhcpd
INIT_SCRIPTS += S25dhcpd
endif

ifeq ($(CONFIG_NETPRN),y)
BIN_FILES += spooler/printer_server/prnserver spooler/Broadcast/prnbcast
SUBDIRS += spooler/printer_server spooler/Broadcast
endif

ifeq ($(CONFIG_DHCP_CLIENT),y)
SUBDIRS	+= dhcp bpalogin-2.0.1
else
ifeq ($(CONFIG_DHCP_SERVER),y)
SUBDIRS += dhcp
endif
endif

ifeq ($(CONFIG_ROUTER),y)
BIN_FILES += \
	iptables-1.2.4/iptables \
	routed/routed/routed	\
	rp-pppoe-2.6/pppoe  \
	dnsmasq-1.10/dnsmasq \
	ppp-2.4.0/pppd/pppd \
	ppp-2.4.0/chat/chat

SUBDIRS += iptables-1.2.4 ppp-2.4.0 rp-pppoe-2.6 routed dnsmasq-1.10 
INIT_SCRIPTS += S19network S30masq S40ipfilter S26routed S22ipalias S36dnsmasq
USER_SCRIPTS += adsl-connect adsl-start adsl-status adsl-stop adsl-setup
endif

ifeq ($(CONFIG_PPTP_SERVER),y)
BIN_FILES += pptpd-1.0.1/pptpd pptpd-1.0.1/pptpctrl 
SUBDIRS += pptpd-1.0.1
#ONCE_SCRIPTS += S45pptpd
INIT_SCRIPTS += S45pptpd
endif

ifeq ($(CONFIG_PPTP_CLIENT),y)
BIN_FILES += pptp-1.1.0/pptp
SUBDIRS += pptp-1.1.0
endif

ifeq ($(CONFIG_DDNS),y)
BIN_FILES += ez-ipupdate-3.0.10/ez-ipupdate util/monddns/monddns
SUBDIRS += ez-ipupdate-3.0.10 util/monddns
INIT_SCRIPTS += S20ddns
ETC_FILES += ddns.conf
SUBDIRS += dhrp
BIN_FILES +=dhrp/dhrpc
endif

ifeq ($(CONFIG_SNMP),y)
BIN_FILES += snmpd/snmpd 
SUBDIRS += snmpd 
INIT_SCRIPTS += S70snmpd
ETC_FILES += snmpd.conf
endif

ifeq ($(CONFIG_UPNP_MMS),y)
BIN_FILES += upnp_mms/upnp_mms
SUBDIRS += upnp_mms
INIT_SCRIPTS += S94upnp_mms
endif

ifeq ($(CONFIG_NTP),y)
SUBDIRS += ntp
BIN_FILES += ntp/ntpdate/ntpdate 
INIT_SCRIPTS += S99sntp
endif

ifeq ($(CONFIG_FTP),y)
SUBDIRS += bftpd
BIN_FILES += bftpd/bftpd
INIT_SCRIPTS += S53ftpd
endif

ifeq ($(CONFIG_WWW_SERVER),y)
SUBDIRS += boa/src
BIN_FILES += boa/src/boa
INIT_SCRIPTS += S91w3s
endif

ifeq ($(CONFIG_IPSEC),y)
SUBDIRS += freeswan-1.93
BIN_FILES += mawk/mawk
SUBDIRS += mawk

IPSECDIR = freeswan-1.93
IPSEC_SCRIPTDIR = $(IPSECDIR)/utils

#IPSEC_BIN_FILES = \
	$(IPSECDIR)/pluto/pluto $(IPSECDIR)/pluto/whack \
	$(IPSECDIR)/utils/_copyright $(IPSECDIR)/utils/ranbits $(IPSECDIR)/utils/rsasigkey \
	$(IPSECDIR)/klips/utils/spi $(IPSECDIR)/klips/utils/eroute $(IPSECDIR)/klips/utils/spigrp $(IPSECDIR)/klips/utils/tncfg $(IPSECDIR)/klips/utils/klipsdebug $(IPSECDIR)/klips/utils/pf_key

IPSEC_BIN_FILES = \
	$(IPSECDIR)/pluto/pluto $(IPSECDIR)/pluto/whack \
	$(IPSECDIR)/utils/_copyright \
	$(IPSECDIR)/klips/utils/spi $(IPSECDIR)/klips/utils/eroute $(IPSECDIR)/klips/utils/spigrp $(IPSECDIR)/klips/utils/tncfg $(IPSECDIR)/klips/utils/klipsdebug $(IPSECDIR)/klips/utils/pf_key

IPSEC_SCRIPT_FILES = \
	auto barf look manual newhostkey showdefaults showhostkey send-pr \
	_include _confread _keycensor _secretcensor _updown _realsetup _startklips _plutorun _plutoload

#ONCE_SCRIPTS += S80ipsec
INIT_SCRIPTS += S80ipsec
USER_SCRIPTS += ipsec
endif

ifeq ($(CONFIG_PRINTER_SERVER),y)
BIN_FILES += \
	util/hotplug/hotplug	\
	lpr/lpr/lpr	\
	lpr/lpd/lpd	\
	lpr/lpc/lpc	\
	lpr/lpq/lpq	\
	lpr/lprm/lprm

SUBDIRS += lpr util/hotplug
#ONCE_SCRIPTS += S39printer
endif

ifeq ($(CONFIG_NAS),y)
ifneq ($(CONFIG_USB_STORAGE_SERVER),y)
BIN_FILES += \
	e2fsprog-mipsel/misc/mke2fs \

SUBDIRS += e2fsprog-mipsel
endif
#	e2fsprog-mipsel/e2fsck/e2fsck \
#	e2fsprog-mipsel/misc/tune2fs \


ifeq ($(CONFIG_CIFS),y) 
BIN_FILES += \
	samba-2.2.0/source/bin/smbd \
	samba-64bit/source/nmbd \
	samba-64bit/source/smbpasswd \
	samba-64bit/source/smbrun \

SUBDIRS += des samba-64bit/source samba-2.2.0/source
ifeq ($(CONFIG_USB_STORAGE_SERVER),y)
INIT_SCRIPTS += S50smbd S10passwd
else
INIT_SCRIPTS += S50smbd S10passwd S49hdinit
endif
endif

ifeq ($(CONFIG_NFS),y)
BIN_FILES += nfs-utils/utils/nfsd/rpc.nfsd nfs-utils/utils/mountd/rpc.mountd nfs-utils/utils/exportfs/rpc.exportfs portmap/portmap
SUBDIRS += nfs-utils portmap 
INIT_SCRIPTS += S52nfsd
endif

ifeq ($(CONFIG_ATALK),y)
ifneq ($(CONFIG_STANDLIBC),y)
BIN_FILES += atalk/etc/afpd/afpd atalk/etc/atalkd/atalkd atalk/bin/nbp/nbprgstr atalk/bin/nbp/nbpunrgstr 
SUBDIRS += atalk
INIT_SCRIPTS += S51atalk
else
BIN_FILES += atalk.stdlib/etc/afpd/afpd atalk.stdlib/etc/atalkd/atalkd atalk.stdlib/bin/nbp/nbprgstr atalk.stdlib/bin/nbp/nbpunrgstr 
SUBDIRS += atalk.stdlib
#SUBDIRS += netatalk
INIT_SCRIPTS += S51atalk
endif
endif

ifeq ($(CONFIG_MAIL_SERVER),y)
BIN_FILES += qmail/maildirmake qmail/qmail-clean qmail/qmail-getpw \
qmail/qmail-local qmail/qmail-lspawn qmail/qmail-newu qmail/qmail-pop3d qmail/qmail-popup qmail/qmail-queue \
qmail/qmail-remote qmail/qmail-rspawn qmail/qmail-send qmail/qmail-smtpd qmail/qmail-start \
tcpserver/tcpserver softlimit/softlimit chkpass/checkpassword util/mail/mailexe

SUBDIRS += qmail tcpserver softlimit chkpass util/mail

QMAIL_SCRIPT_FILES = datemail elq mailsubj pinq qail qmail-qstat \
		     run-smtpd run-pop3d varqmail.tgz

INIT_SCRIPTS += S55checkmaildir S90maild
endif
endif

ifeq ($(CONFIG_RENDEZVOUS), y)
	INIT_SCRIPTS += S93Rendezvous

	SUBDIRS += mDNSResponder-58.3/mDNSPosix
	
	BIN_FILES += mDNSResponder-58.3/mDNSPosix/build/mDNSResponderPosix
endif


LIB_FILES += libmlinux/libmlinux.so

DEP_MODEL_DIRS= libmlinux util/getcfg util/pidof util/reboot mawk busybox-0.51

export BIN_FILES LIB_FILES IPSEC_BIN_FILES IPSEC_SCRIPT_FILES QMAIL_SCRIPT_FILES

.PHONY: all
all: lockconfig $(TARGET)

lockconfig :
ifneq ($(CONFIG_MODEL),$(def_model))
	@( \
	echo -n $(CONFIG_MODEL) > .lock; \
	)
	make clean_dep_model
endif
ifneq ($(CONFIG_COMPANY_NAME),$(def_company))
	@( \
	echo -n $(CONFIG_COMPANY_NAME) > .lock2; \
	)
	make clean_dep_model
endif
ifneq ($(CONFIG_MODEL_EXT),$(def_model_ext))
	@( \
	echo -n $(CONFIG_MODEL_EXT) > .lock3; \
	)
	make clean_dep_model
endif


$(TARGET): subdirs $(INITRD)
	@echo "MAKING RELOCATABLE OBJECT"
	gzip -9vfc $(INITRD) > $(INITRDGZ)
	#bzip2 -9c $(INITRD) > $(INITRDGZ)
	$(LD) -T initrd.ld -M -Map $(INITRD).map -b binary -o $@ $(INITRDGZ) 
	cp -f $(TARGET) ../linux/ramdisk.o

subdirs: premakeapp $(patsubst %, _dir_%, $(SUBDIRS))

premakeapp:
ifeq ($(CONFIG_STANDLIBC),y)
	cp -af samba-2.2.0/source/Makefile.lfs samba-2.2.0/source/Makefile
	cp -af samba-2.2.0/source/include/config.lfs samba-2.2.0/source/include/config.h
else
	cp -af samba-2.2.0/source/Makefile.sfs samba-2.2.0/source/Makefile
	cp -af samba-2.2.0/source/include/config.sfs samba-2.2.0/source/include/config.h
endif
	

$(patsubst %, _dir_%, $(SUBDIRS)) : dummy
	@echo '======== BUILDING IN $(patsubst _dir_%,%, $@) ==================='
ifeq ($(CONFIG_MAIL_SERVER),y)
	if [ "$(patsubst _dir_%,%, $@)" = "busybox-0.51" ]; then \
		echo 'update busybox-0.51 Config.mail' ; \
		cp -af busybox-0.51/Config.mail busybox-0.51/Config.h ;\
	fi
else
	if [ "$(patsubst _dir_%,%, $@)" = "busybox-0.51" ]; then \
		echo 'update busybox-0.51 Config.mail' ; \
		cp -af busybox-0.51/Config.mail busybox-0.51/Config.h ;\
	fi
endif

	$(MAKE) -C $(patsubst _dir_%, %, $@) CC=$(CC) LD=$(LD) AR=$(AR) AS=$(AS) STRIP=$(STRIP) RANLIB=$(RANLIB) MOUNTPT=$(MOUNTPT)

$(INITRD): dummy
	@echo '======== BUILDING $@ ==================='
	@if [ $$UID -ne 0 ]; then \
		echo ; \
		echo '******** ERROR: You must be root to build initrd' ; \
		echo ; \
		exit 1 ; \
	fi
	@echo "REMOVING OLD AND UNWANTED FILES AND $@"
	find stage \( -name '*.old' -o -name '.jrc' \) -print | xargs rm -f
	find stage \( -type b -o -type c -o -type l \) -print | xargs rm -f
	rm -f $@

	@# Before writing loop device file, unmount it first.
	@# Otherwise, related process will block.
	grep "$(MOUNTPT)" /etc/mtab > /dev/null ; [ $$? = 0 ] && umount $(MOUNTPT) 2> /dev/null ; true
	grep "$(INITRDMOUNTPT)" /etc/mtab > /dev/null ; [ $$? = 0 ] && umount $(INITRDMOUNTPT) 2> /dev/null ; true

	@echo "CREATING RAMDISK OF SIZE $(CONFIG_RDSIZE) on $@"
	dd if=/dev/zero of=$@ bs=1k count=$(CONFIG_RDSIZE)
	dd if=/dev/zero of=$(RAMTMP) bs=1k count=$(CONFIG_RDSIZE)
	@echo "MAKING ext2 FILESYSTEM ON RAMDISK"
	mke2fs -vFm0 -N 800 $@ $(CONFIG_RDSIZE)
	mke2fs -vFm0 -N 800 $(RAMTMP) $(CONFIG_RDSIZE)
	@echo "MOUNTING RAMDISK ON $(MOUNTPT)"
	if [ \! -e $(MOUNTPT) ]; then mkdir $(MOUNTPT) ; fi
	mkdir -p $(INITRDMOUNTPT)
	mount -o loop $(RAMTMP) $(MOUNTPT)
	@df $(MOUNTPT)
	@echo "COPYING ORIGINAL FILES FROM stage DIRECTORY TO $(MOUNTPT)"
	#(cd stage ; find * \( -type f -o -type b -o -type c -o -type l \) -print | \
		tar cTf - - ) | (cd $(MOUNTPT) && tar xf - )
	install -d $(MOUNTPT)/bin $(MOUNTPT)/dev
	cp $(ORIG)/dev/MAKEDEV $(MOUNTPT)/dev
ifeq ($(CONFIG_STANDLIBC),y)
	cp -a $(ORIG)/lib.libc25 $(MOUNTPT)/lib
else
	cp -a $(ORIG)/lib $(MOUNTPT)
endif
	@echo "COPY NECESSARY FILES TO $(MOUNTPT)"
	@( \
	install -d $(MOUNTPT)/etc/ppp; \
	mkdir -p $(MOUNTPT)/sbin; \
	for i in $$BIN_FILES; do \
		$(STRIP) -o $(MOUNTPT)/sbin/`basename $$i` $$i; \
		chmod +x $(MOUNTPT)/sbin/`basename $$i`; \
		echo "$(STRIP) -o $(MOUNTPT)/sbin/`basename $$i` $$i"; \
	done; \
	mkdir -p $(MOUNTPT)/lib; \
	for i in $$LIB_FILES; do \
		$(STRIP) -o $(MOUNTPT)/lib/`basename $$i` $$i; \
		chmod +x $(MOUNTPT)/lib/`basename $$i`; \
		echo "$(STRIP) -o $(MOUNTPT)/lib/`basename $$i` $$i"; \
	done; \
	install -d $(MOUNTPT)/etc/rc.d/init.d; \
	for i in $(patsubst %, $(INIT_SCRIPT_DIR)/%, $(INIT_SCRIPTS)); do \
		cp $$i $(MOUNTPT)/etc/rc.d/init.d/`basename $$i`; \
	done; \
	for i in $(patsubst %, $(ETC_DIR)/%, $(ETC_FILES)); do \
		cp $$i $(MOUNTPT)/etc/`basename $$i`; \
	done; \
	for i in $(patsubst %, $(RCS_SCRIPT_DIR)/%, $(ONCE_SCRIPTS)); do \
		cp $$i $(MOUNTPT)/etc/rc.d/`basename $$i`; \
	done; \
	install -d $(MOUNTPT)/usr/sbin; \
	for i in $(patsubst %, $(USER_SCRIPT_DIR)/%, $(USER_SCRIPTS)); do \
		cp $$i $(MOUNTPT)/usr/sbin/`basename $$i`; \
	done; \
	install -d $(MOUNTPT)/var/run; \
	)

ifeq ($(CONFIG_PPTP_SERVER),y)
	cp $(ETC_DIR)/ppp/options $(MOUNTPT)/etc/ppp;
endif

ifeq ($(CONFIG_UPNP_IGD),y)
	install -d $(MOUNTPT)/etc/linuxigd
	cp -a linux-igd/etc/* $(MOUNTPT)/etc/linuxigd
endif

ifeq ($(CONFIG_IPSEC),y)
	@( \
	install -d $(MOUNTPT)/usr/local/lib/ipsec; \
	for i in $$IPSEC_BIN_FILES; do \
		$(STRIP) -o $(MOUNTPT)/usr/local/lib/ipsec/`basename $$i` $$i; \
		chmod +x $(MOUNTPT)/usr/local/lib/ipsec/`basename $$i`; \
		echo "$(STRIP) -o $(MOUNTPT)/usr/local/lib/ipsec/`basename $$i` $$i"; \
	done; \
	for i in $$IPSEC_SCRIPT_FILES; do \
		cp $(IPSEC_SCRIPTDIR)/$$i $(MOUNTPT)/usr/local/lib/ipsec/$$i; \
		chmod +x $(MOUNTPT)/usr/local/lib/ipsec/`basename $$i`; \
		echo "chmod +x $(MOUNTPT)/usr/local/lib/ipsec/`basename $$i`"; \
	done; \
	)
endif

ifeq ($(CONFIG_MAIL_SERVER),y)
	@( \
	for i in $$QMAIL_SCRIPT_FILES; do \
		echo "cp qmail/$$i $(MOUNTPT)/sbin/$$i" ; \
		cp qmail/$$i $(MOUNTPT)/sbin/$$i; \
		chmod +x $(MOUNTPT)/sbin/$$i ; \
	done; \
	)
endif

	@echo "MAKING DEVICE NODE IN $(MOUNTPT)"
	(cd $(MOUNTPT)/dev ; ./MAKEDEV lp std ptyp ptyq consoleonly ttyS0 ttyS1 hda hdb hdc hdd sda sdb sdc sdd sde sdf sdg sdh sdi sdj usblp0 usblp1 loop pg sg scd fd;)
	(cd $(MOUNTPT) ; rm -f dev/MAKEDEV ; rm -rf lost+found)
	@echo "MAKING SYMBOLIC LINKS"
ifeq ($(CONFIG_STANDLIBC),y)
	./makesymlinks.stdlibc $(MOUNTPT)
else
	./makesymlinks $(MOUNTPT)
endif
	(cd $(MOUNTPT) ; mkdir proc mnt tmp )
	(cd $(MOUNTPT) ; chmod 777 mnt tmp )
	(cd $(MOUNTPT) ; chown -R root.root . )
	mount -o loop $(INITRD) $(INITRDMOUNTPT)
	(cd $(INITRDMOUNTPT) ; rm -rf lost+found)

ifeq ($(CONFIG_NAS),y)
	install -d $(MOUNTPT)/etc/samba;
	install -d $(MOUNTPT)/var/locks;
	install -d $(MOUNTPT)/var/spool/lpd;
	install -d $(MOUNTPT)/var/run/bftpd;
	cp -a nas/* $(MOUNTPT)
	./rmrootfscvs $(MOUNTPT)
endif

ifeq ($(CONFIG_MAIL_SERVER),y)
	cp -a mailconf/* $(MOUNTPT)
endif

	(cd $(MOUNTPT) ; tar cf - * | tar xf - --directory $(INITRDMOUNTPT) ) 
	@df $(INITRDMOUNTPT)
	@echo "UNMOUNTING $(MOUNTPT) $(INITRDMOUNTPT)"
	umount $(MOUNTPT)
	umount $(INITRDMOUNTPT)
	rm -f $(RAMTMP)

clean: $(patsubst %, _clean_%, $(SUBDIRS)) dummy
	rm -f $(TARGET) $(INITRD) $(INITRDGZ) $(STAGEFILES)
	rm -rf stage/sbin stage/usr/bin
	find . -name '*.[soda]' -type f -print | xargs rm -f
	find * -name '.jrc' -type f -print | xargs rm -f
	find * -name '*.bak' -type f -print | xargs rm -f
	find stage -type l -print | xargs rm -f
	find stage \( -type b -o -type c \) -print | xargs rm -f

$(patsubst %, _clean_%, $(SUBDIRS)) : dummy
	@echo '======== CLEANING IN $(patsubst _clean_%,%, $@) ==================='
	$(MAKE) -i -C $(patsubst _clean_%, %, $@) clean

clean_dep_model: $(patsubst %, _clean_dep_model_%, $(DEP_MODEL_DIRS))
	rm -f $(TARGET) $(INITRD) $(INITRDGZ) $(STAGEFILES)
	rm -rf stage/sbin stage/usr/bin

$(patsubst %, _clean_dep_model_%, $(DEP_MODEL_DIRS)) : dummy
	@echo '======== CLEANING IN $(patsubst _clean_dep_model_%,%, $@) ========='
	$(MAKE) -i -C $(patsubst _clean_dep_model_%, %, $@) clean
dummy:

