DIETLIBC = dietlibc-0.21
UCLIBC = uClibc-0.9.15
BUSYBOX = busybox-0.60.4
WIRELESS_TOOLS = wireless_tools.25
#HOSTAP = hostap-2002-09-12
HOSTAP = hostap-2002-10-12
#HOSTAP = hostap-cvs
PCMCIA = pcmcia-cs-3.1.34
BRIDGE-UTILS = bridge-utils-0.9.6
NETFILTER = iptables-1.2.7a
KERNEL_PATH = /usr/src/linux-2.4.19-hostap
INITRD_SIZE = 2000k

curr-dir := $(shell pwd)
cdslash := $(shell pwd|sed -e '1,$$s/\//\\\//g')
kernslash := $(shell echo $(KERNEL_PATH)|sed -e '1,$$s/\//\\\//g')
download := $(curr-dir)/downloads
builddir := $(curr-dir)/build

distdir = $(curr-dir)/nfsroot

all: checksys dirs uclibc busybox wireless-tools hostap pcmcia netfilter bridge-utils kernel devices init

DIRECTORIES = $(distdir)/proc $(distdir)/lib/modules $(distdir)/etc/pcmcia $(distdir)/dev $(distdir)/tmp $(distdir)/config $(download) $(builddir)
dirs: $(DIRECTORIES)

$(DIRECTORIES):
	mkdir -p $@

.PHONY: checksys dirs uclibc busybox wireless-tools hostap pcmcia netfilter bridge-utils kernel devices init bootdisk

#######################################
# System checks                       #
#######################################

checksys: $(KERNEL_PATH)/arch/i386/boot/bzImage

$(KERNEL_PATH)/arch/i386/boot/bzImage:
	@echo '#################################################################'
	@echo '# You need to compile your own kernel in $$KERNEL_PATH           #'
	@echo '# Use the config provided in the files-dir as an example config #'
	@echo '#################################################################'
	@exit 1

#######################################
# uClibc                              #
#######################################

uclibc: uclibc/bin/i386-uclibc-gcc

$(download)/$(UCLIBC).tar.bz2:
	cd $(download) && wget http://www.kernel.org/pub/linux/libs/uclibc/$(UCLIBC).tar.bz2

$(builddir)/$(UCLIBC)/extra/Configs/Config.i386: $(download)/$(UCLIBC).tar.bz2
	cd $(builddir) && tar xvjf $(download)/$(UCLIBC).tar.bz2
	touch $(builddir)/$(UCLIBC)/extra/Configs/Config.i386

$(builddir)/$(UCLIBC)/Config: $(builddir)/$(UCLIBC)/extra/Configs/Config.i386
	sed -e "1,\$$s/^DEVEL_PREFIX.*$$/DEVEL_PREFIX = $(cdslash)\/uclibc/" $(builddir)/$(UCLIBC)/extra/Configs/Config.i386 >$(builddir)/$(UCLIBC)/Config

$(builddir)/$(UCLIBC)/.built: $(builddir)/$(UCLIBC)/Config
	cd $(builddir)/$(UCLIBC) && $(MAKE)
	touch $(builddir)/$(UCLIBC)/.built

uclibc/bin/i386-uclibc-gcc: $(builddir)/$(UCLIBC)/.built
	cd $(builddir)/$(UCLIBC) && $(MAKE) install


#######################################
# BusyBox                             #
#######################################
busybox: $(distdir)/bin/busybox

$(download)/$(BUSYBOX).tar.gz:
	cd $(download) && wget http://www.busybox.net/downloads/$(BUSYBOX).tar.gz

$(builddir)/$(BUSYBOX)/Makefile: $(download)/$(BUSYBOX).tar.gz
	cd $(builddir) && tar xvzf $(download)/$(BUSYBOX).tar.gz
	touch $(builddir)/$(BUSYBOX)/Makefile

$(builddir)/$(BUSYBOX)/Makefile.hostap: $(builddir)/$(BUSYBOX)/Makefile
	sed -e '1,$$s/^DOSTATIC =.*$$/DOSTATIC = true/' $(builddir)/$(BUSYBOX)/Makefile >$(builddir)/$(BUSYBOX)/Makefile.hostap
	echo "#define BB_IFCONFIG" >>$(builddir)/$(BUSYBOX)/Config.h
	echo "#define BB_FEATURE_IFCONFIG_STATUS" >>$(builddir)/$(BUSYBOX)/Config.h
	echo "#define BB_FEATURE_IFCONFIG_HW" >>$(builddir)/$(BUSYBOX)/Config.h
	echo "#define BB_FEATURE_IFCONFIG_BROADCAST_PLUS" >>$(builddir)/$(BUSYBOX)/Config.h
	echo "#define BB_INSMOD" >>$(builddir)/$(BUSYBOX)/Config.h
	echo "#define BB_ROUTE" >>$(builddir)/$(BUSYBOX)/Config.h

$(builddir)/$(BUSYBOX)/.built: $(builddir)/$(BUSYBOX)/Makefile.hostap
	cd $(builddir)/$(BUSYBOX) && PATH="$(curr-dir)/uclibc/usr/bin":$${PATH} $(MAKE) -f Makefile.hostap
	touch $(builddir)/$(BUSYBOX)/.built

$(distdir)/bin/busybox: $(builddir)/$(BUSYBOX)/.built
	cd $(builddir)/$(BUSYBOX) && ./install.sh $(distdir)
	-rm $(distdir)/linuxrc
	-rm $(distdir)/sbin/init


#######################################
# Devices                             #
#######################################

devices: $(distdir)/dev/console $(distdir)/dev/fd0 $(distdir)/dev/initrd

$(distdir)/dev/console:
	mknod $(distdir)/dev/console c 5 1

$(distdir)/dev/fd0:
	mknod $(distdir)/dev/fd0 b 2 0

$(distdir)/dev/initrd:
	mknod $(distdir)/dev/initrd b 1 250

#######################################
# Wireless Tools                      #
#######################################

wireless-tools: $(distdir)/sbin/iwconfig $(distdir)/sbin/iwpriv

$(download)/$(WIRELESS_TOOLS).tar.gz:
	cd $(download) && wget http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/$(WIRELESS_TOOLS).tar.gz

$(builddir)/$(WIRELESS_TOOLS)/Makefile: $(download)/$(WIRELESS_TOOLS).tar.gz
	cd $(builddir) && tar xvzf $(download)/$(WIRELESS_TOOLS).tar.gz
	touch $(builddir)/$(WIRELESS_TOOLS)/Makefile

$(builddir)/$(WIRELESS_TOOLS)/Makefile.hostap: $(builddir)/$(WIRELESS_TOOLS)/Makefile
	sed -e '1,$$s/^CC =.*$$/CC = gcc -static/' $(builddir)/$(WIRELESS_TOOLS)/Makefile >$(builddir)/$(WIRELESS_TOOLS)/Makefile.hostap

$(builddir)/$(WIRELESS_TOOLS)/.built: $(builddir)/$(WIRELESS_TOOLS)/Makefile.hostap
	cd $(builddir)/$(WIRELESS_TOOLS) && PATH="$(curr-dir)/uclibc/usr/bin":$${PATH} $(MAKE) -f Makefile.hostap
	touch $(builddir)/$(WIRELESS_TOOLS)/.built

$(distdir)/sbin/iwconfig: $(builddir)/$(WIRELESS_TOOLS)/.built
	cp $(builddir)/$(WIRELESS_TOOLS)/iwconfig $(distdir)/sbin/iwconfig
	strip $(distdir)/sbin/iwconfig

$(distdir)/sbin/iwpriv: $(builddir)/$(WIRELESS_TOOLS)/.built
	cp $(builddir)/$(WIRELESS_TOOLS)/iwpriv $(distdir)/sbin/iwpriv
	strip $(distdir)/sbin/iwpriv


#######################################
# HOSTAP-Driver                       #
#######################################

hostap: $(distdir)/lib/modules/hostap.o

$(download)/$(HOSTAP).tar.gz:
	cd $(download) && wget http://hostap.epitest.fi/releases/$(HOSTAP).tar.gz

$(builddir)/$(HOSTAP)/Makefile: $(download)/$(HOSTAP).tar.gz
	cd $(builddir) && tar xvzf $(download)/$(HOSTAP).tar.gz
	touch $(builddir)/$(HOSTAP)/Makefile

$(builddir)/$(HOSTAP)/Makefile.hostap: $(builddir)/$(HOSTAP)/Makefile
	sed -e '1,$$s/^KERNEL_PATH=.*$$/KERNEL_PATH=$(kernslash)/' $(builddir)/$(HOSTAP)/Makefile >$(builddir)/$(HOSTAP)/Makefile.hostap

$(builddir)/$(HOSTAP)/.built: $(builddir)/$(HOSTAP)/Makefile.hostap
	cd $(builddir)/$(HOSTAP) && $(MAKE) -f Makefile.hostap pccard plx pci
	cd $(builddir)/$(HOSTAP)/utils && PATH="$(curr-dir)/uclibc/usr/bin":$${PATH} CC='gcc -static' make
	touch $(builddir)/$(HOSTAP)/.built

$(distdir)/lib/modules/hostap.o: $(builddir)/$(HOSTAP)/.built
	cp $(builddir)/$(HOSTAP)/driver/modules/hostap_cs.o $(distdir)/lib/modules
	cp $(builddir)/$(HOSTAP)/driver/modules/hostap_plx.o $(distdir)/lib/modules
	cp $(builddir)/$(HOSTAP)/driver/modules/hostap_pci.o $(distdir)/lib/modules
	cp $(builddir)/$(HOSTAP)/driver/modules/hostap_crypt.o $(distdir)/lib/modules
	cp $(builddir)/$(HOSTAP)/driver/modules/hostap_crypt_wep.o $(distdir)/lib/modules
	cp $(builddir)/$(HOSTAP)/utils/prism2_param $(distdir)/sbin
	cp $(builddir)/$(HOSTAP)/utils/hostap_diag $(distdir)/sbin
	strip $(distdir)/sbin/hostap_diag
	cp $(builddir)/$(HOSTAP)/utils/hostap_crypt_conf $(distdir)/sbin
	strip $(distdir)/sbin/hostap_crypt_conf
	cp $(builddir)/$(HOSTAP)/driver/modules/hostap.o $(distdir)/lib/modules


#######################################
# Kernel stuff                        #
#######################################

kernel: $(distdir)/lib/modules/ds.o

$(distdir)/lib/modules/ds.o:
	cp $(KERNEL_PATH)/drivers/pcmcia/pcmcia_core.o $(distdir)/lib/modules
	-cp $(KERNEL_PATH)/drivers/pcmcia/i82365.o $(distdir)/lib/modules
	-cp $(KERNEL_PATH)/drivers/pcmcia/i82092.o $(distdir)/lib/modules
	-cp $(KERNEL_PATH)/drivers/pcmcia/yenta_socket.o $(distdir)/lib/modules
	-cp $(KERNEL_PATH)/drivers/pcmcia/tcic.o $(distdir)/lib/modules
	cp $(KERNEL_PATH)/drivers/pcmcia/ds.o $(distdir)/lib/modules


#######################################
# pcmcia-cs                           #
#######################################

pcmcia: $(distdir)/sbin/cardmgr $(distdir)/etc/pcmcia/config

$(download)/$(PCMCIA).tar.gz:
	cd $(download) && wget http://pcmcia-cs.sourceforge.net/ftp/$(PCMCIA).tar.gz

$(builddir)/$(PCMCIA)/Makefile: $(download)/$(PCMCIA).tar.gz
	cd $(builddir) && tar xvzf $(download)/$(PCMCIA).tar.gz
	touch $(builddir)/$(PCMCIA)/Makefile

$(builddir)/$(PCMCIA)/config.out: $(builddir)/$(PCMCIA)/Makefile
	cd $(builddir)/$(PCMCIA) && ./Configure -n --kernel=$(KERNEL_PATH) --ucc="gcc -static" --cardbus --pnp --srctree

$(builddir)/$(PCMCIA)/.built: $(builddir)/$(PCMCIA)/config.out
	cd $(builddir)/$(PCMCIA) && PATH="$(curr-dir)/uclibc/usr/bin":$${PATH} $(MAKE) all
	touch $(builddir)/$(PCMCIA)/.built

$(distdir)/sbin/cardmgr: $(builddir)/$(PCMCIA)/.built
	cp $(builddir)/$(PCMCIA)/cardmgr/cardmgr $(distdir)/sbin
	strip $(distdir)/sbin/cardmgr

$(distdir)/etc/pcmcia/config:
	cp files/pcmcia-config $(distdir)/etc/pcmcia/config

#######################################
# Init                                #
#######################################

init: $(distdir)/sbin/init $(distdir)/config/config

$(distdir)/sbin/init: files/init
	cp files/init $(distdir)/sbin
	-ln -s /sbin/init $(distdir)/linuxrc
	chmod 755 $(distdir)/sbin/init

$(distdir)/config/config: files/config
	cp files/config $(distdir)/config/config

#######################################
# Netfilter                           #
#######################################

netfilter: $(distdir)/sbin/iptables

$(download)/$(NETFILTER).tar.bz2:
	cd $(download) && wget http://www.netfilter.org/files/$(NETFILTER).tar.bz2

$(builddir)/$(NETFILTER)/Makefile: $(download)/$(NETFILTER).tar.bz2
	cd $(builddir) && tar xvjf $(download)/$(NETFILTER).tar.bz2
	touch $(builddir)/$(NETFILTER)/Makefile

$(builddir)/$(NETFILTER)/Makefile.hostap: $(builddir)/$(NETFILTER)/Makefile
	echo "NO_SHARED_LIBS = 1" >$(builddir)/$(NETFILTER)/Makefile.hostap
	cat $(builddir)/$(NETFILTER)/Makefile >>$(builddir)/$(NETFILTER)/Makefile.hostap

$(builddir)/$(NETFILTER)/.built: $(builddir)/$(NETFILTER)/Makefile.hostap
	cd $(builddir)/$(NETFILTER) && PATH="$(curr-dir)/uclibc/usr/bin":$${PATH} $(MAKE) -f Makefile.hostap KERNEL_DIR=$(KERNEL_PATH) iptables
	touch $(builddir)/$(NETFILTER)/.built

$(distdir)/sbin/iptables: $(builddir)/$(NETFILTER)/.built
	cp $(builddir)/$(NETFILTER)/iptables $(distdir)/sbin
	strip $(distdir)/sbin/iptables

#######################################
# Bridge-Utils                        #
#######################################

bridge-utils: $(distdir)/sbin/brctl $(distdir)/sbin/brctld

$(download)/$(BRIDGE-UTILS).tar.gz:
	cd $(download) && wget http://bridge.sourceforge.net/bridge-utils/$(BRIDGE-UTILS).tar.gz

$(builddir)/bridge-utils/configure: $(download)/$(BRIDGE-UTILS).tar.gz
	cd $(builddir) && tar xvzf $(download)/$(BRIDGE-UTILS).tar.gz
	touch $(builddir)/bridge-utils/configure

$(builddir)/bridge-utils/Makefile: $(builddir)/bridge-utils/configure
	cd $(builddir)/bridge-utils && CC='gcc -static' PATH="$(curr-dir)/uclibc/usr/bin":$${PATH} ./configure --prefix=/

$(builddir)/bridge-utils/.built: $(builddir)/bridge-utils/Makefile
	cd $(builddir)/bridge-utils && PATH="$(curr-dir)/uclibc/usr/bin":$${PATH} $(MAKE)
	touch $(builddir)/bridge-utils/.built

$(distdir)/sbin/brctl: $(builddir)/bridge-utils/.built
	cp $(builddir)/bridge-utils/brctl/brctl $(distdir)/sbin/brctl
	strip $(distdir)/sbin/brctl

$(distdir)/sbin/brctld: $(builddir)/bridge-utils/.built
	cp $(builddir)/bridge-utils/brctl/brctld $(distdir)/sbin/brctld
	strip $(distdir)/sbin/brctld

#######################################
# Tagged Kernel                       #
#######################################

tagged-kernel: $(KERNEL_PATH)/arch/i386/boot/bzImage
	mknbi-linux --ip=dhcp --append='console=tty0 console=ttyS0,9600' $(KERNEL_PATH)/arch/i386/boot/bzImage >tagged-kernel

#######################################
# Bootdisk                            #
#######################################

bootdisk: initrd.gz mountpoint diskimage

initrd: mountpoint
	dd if=/dev/zero of=initrd.temp bs=$(INITRD_SIZE) count=1
	mke2fs -F -m0 initrd.temp
	mount -t ext2 -o loop initrd.temp mountpoint
	cp -vax nfsroot/* mountpoint/
	rm mountpoint/config/config
	umount mountpoint
	mv initrd.temp initrd

initrd.gz: initrd
	gzip -f -9 initrd

mountpoint:
	mkdir mountpoint

syslinux:
	dd if=/dev/zero of=tempimage bs=1k count=1440
	mkfs.msdos tempimage
	syslinux tempimage
	mv tempimage syslinux

mountpoint/initrd.gz: mountpoint initrd.gz syslinux
	mount -o loop -t msdos syslinux mountpoint
	cp initrd.gz mountpoint

mountpoint/linux: mountpoint mountpoint/initrd.gz $(KERNEL_PATH)/arch/i386/boot/bzImage
	cp $(KERNEL_PATH)/arch/i386/boot/bzImage mountpoint/linux

mountpoint/SYSLINUX.CFG: files/SYSLINUX.CFG
	cp files/SYSLINUX.CFG mountpoint/SYSLINUX.CFG

mountpoint/config: files/config
	cp files/config mountpoint/config

diskimage: mountpoint/initrd.gz mountpoint/linux mountpoint/SYSLINUX.CFG mountpoint/config
	umount mountpoint
	mv syslinux diskimage
