# you must have installed: cdrecord mkisofs perl gcc nasm wget make install cvs
# $(ROOTDIR) should not be larger than 1.8GB to fit on a CD

BOOTCD=$(shell pwd)
MNT=/mnt/tmp
URI=http://lsmod.de/bootcd
DESTDIR=isodata
ROOTDIR=linuxroot
CDSPEED=4
COMPRESSION=6
DEV=0,0,0
WGET=wget --passive-ftp -O-
CDRECORD=cdrecord -eject -v speed=$(CDSPEED) dev=$(DEV)
BACKUPFILE=/tmp/bootcd-backup-1.tar.bz2
.EXPORT_ALL_VARIABLES:
.SILENT: help
#.PHONY:

help:
	echo -e "first time: make init"
	echo possible targets are
	echo -e "make cd - compress initrd burncd\nmake rw - compress initrd burnrw"
	echo -e "make burncd\nmake burnrw\nmake iso\nmake backup\nmake initrd\nmake compress"
	echo "make kernel - after changing .config"

all: initrdtemplate iso
common: backup kernel compress initrd
init: bin initrdtemplate cloop translucency busybox linux modifications

bin:
	$(WGET) $(URI)/bin.tar.bz2 | tar xj

rw: common burnrw
burnrw:
	cd $(DESTDIR) ; $(BOOTCD)/bin/masterbootcd | $(CDRECORD) blank=fast -
cd: common burncd
burncd:
	cd $(DESTDIR) ; $(BOOTCD)/bin/masterbootcd | $(CDRECORD) -
iso: common
	cd $(DESTDIR) ; $(BOOTCD)/bin/masterbootcd > $(BOOTCD)/bootcd.iso
compress: cloop
	cd $(ROOTDIR) ; mkisofs -quiet -D -R . | $(BOOTCD)/cloop/compressloop -c $(COMPRESSION) -b 65536 -i 2040000000 - $(BOOTCD)/$(DESTDIR)/cloop.iso
backup:
	tar cjf $(BACKUPFILE) Makefile bin linuxroot/home linuxroot/etc
	tar cjf $(ROOTDIR)/usr/src/bootcd.tar.bz2 {Makefile,bin,initrdtemplate}

kernel: deps/have_kernel
deps/have_kernel: bin deps linux linux/.config
	bin/mkkernel
	touch deps/have_kernel

initrd: busybox initrdtemplate $(DESTDIR)/isolinux/isolinux.bin
	# update initrd
	dd if=/dev/zero of=initrd.img bs=512k count=3
	mkfs -t minix -i 10000 initrd.img
	mkdir -p $(MNT)
	mount -o loop initrd.img $(MNT)
	cp -a initrdtemplate/* $(MNT)
	cd busybox ; make install PREFIX=$(MNT)
	$(MNT)/bin/dumpkmap > $(MNT)/lib/keyboard.map
	#	cd /lib && cp -a ld-* libc.so.6 libdl* libm* libcrypt* $(MNT)/lib
	chown -R root. $(MNT)
	#ldconfig -r $(MNT)
	umount $(MNT)
	gzip -c9 initrd.img > $(DESTDIR)/isolinux/initrd
	mount -o loop $(DESTDIR)/isolinux/bootlin $(MNT)
	cp -a $(DESTDIR)/isolinux/{linux,initrd,bootmsg.txt,copyleft.txt,help.txt} $(MNT)
	umount $(MNT)

deps:
	mkdir -p deps
cloop:
	$(WGET) $(URI)/cloop-3.0.0-1.tar.gz | tar xz
	ln -s cloop-3.0.0 cloop
	( cd cloop ; make )
translucency:
	$(WGET) $(URI)/cache/translucency-0.5.8.tar.gz | tar xz
	ln -s translucency-0.5.8 translucency
	( cd translucency ; make )
uclibc:
	cvs -z3 -d:pserver:anonymous@cvs.uclinux.org:/var/cvs co uclibc
	$(WGET) $(URI)/uclibc.config.bz2 | bzip2 -cd > uclibc/.config
	make -C uclibc all install

busybox: uclibc
#	$(WGET) https://www.busybox.net/downloads/busybox-0.60.5.tar.bz2 | tar xj
#	ln -s busybox-0.60.5 busybox
#	$(WGET) $(URI)/Busybox.Config.h.bz2 | bzip2 -cd > busybox/Config.h
	#$(WGET) http://translucency.sourceforge.net/dl/busybox.config > busybox/.config
	-cvs -z3 -d:pserver:anonymous@busybox.net:/var/cvs co busybox
	$(WGET) $(URI)/busybox.config.bz2 | bzip2 -cd > busybox/.config
	PATH=/usr/i386-linux-uclibc/usr/bin/:$(PATH) make -C busybox oldconfig all

initrdtemplate:
	$(WGET) $(URI)/initrdtemplate.tar.bz2 | tar xj
	$(WGET) $(URI)/isodata.tar.bz2 | tar xj
	- mv isodata $(DESTDIR)

linux:
	$(WGET) https://www.kernel.org/pub/linux/kernel/v2.4/linux-2.4.20.tar.bz2 | tar xj
	ln -s linux-2.4.20 linux
	perl -i.bootcdbak -pe 'if(/int lockdoor =/){s/1/0/}' linux/drivers/cdrom/cdrom.c
	$(WGET) $(URI)/linux.config.bz2 | bzip2 -cd > linux/.config
	#$(WGET) ftp://ftp.de.kernel.org/pub/linux/kernel/people/alan/linux-2.4/$ver/patch-$v.bz2 > patch-$v.bz2
	# cd linux ; patch -s -p1 < ../patch-$v.bz2

$(DESTDIR)/isolinux/isolinux.bin:
	$(WGET) https://www.kernel.org/pub/linux/utils/boot/syslinux/2.xx/syslinux-2.01.tar.bz2 | tar xj
	ln -s syslinux-2.01 syslinux
	cd syslinux ; make
	cp -a syslinux/isolinux.bin $(DESTDIR)/isolinux/

$(ROOTDIR):
	mkdir -p $(ROOTDIR)/{mnt,tmp,initrd,proc,floppy,cdrom,home,root}
	chmod 1777 $(ROOTDIR)/{tmp}
	cp -a /bin /sbin /lib /boot /etc /opt /dev /var /usr $(ROOTDIR)

modifications: deps/have_modifications
deps/have_modifications: bin deps $(ROOTDIR)
	# I do only the necessary changes 
	# if you want to make a real bootcd edit shadow,passwd,network,log files...
	ln bin/bootcd.* $(ROOTDIR)/etc/
	bin/addbootcd $(ROOTDIR)/`grep ^si $(ROOTDIR)/etc/inittab | cut -d: -f4`
	#echo bootcd > $(ROOTDIR)/etc/HOSTNAME #distri dependant
	#echo 192.168.11.111 bootcd.local bootcd >> $(ROOTDIR)/etc/hosts
	- rm $(ROOTDIR)/{etc/mtab,usr/src/linux,dev/cdrom}
	touch deps/have_modifications

distclean:
	- rm $(DESTDIR)/{cloop*,isolinux/{initrd,linux*}}
dist: distclean
	tar cjf bin.tar.bz2 bin
	tar cjf initrdtemplate.tar.bz2 initrdtemplate
	tar cjf isodata.tar.bz2 $(DESTDIR)
