#
###############################################################
# Larry Feng
# 2005-03-22
################################################################

-include ./buildenv.mk

.PHONY: all clean iso pxe

all: pxe

RAMDISK_SIZE = 80000
VERSION = $(shell uname -r)
CURR_KERNEL = /boot/vmlinuz-$(VERSION)
ISO_KERNEL = iso/isolinux/vmlinuz
ISO_IMAGE = DSRECv30bxxx-$(RAWNAME).iso

iso: $(ISO_IMAGE)

$(ISO_IMAGE): pxe $(ISO_KERNEL)
	dd if=/dev/zero of=initrd.img bs=1K count=$(RAMDISK_SIZE)
	echo "y" | mkfs -t ext2 initrd.img
	umount initrd || exit 0
	mount -o loop initrd.img initrd
	cp -a rootfs/* initrd/
#	ntpdate clock.redhat.com
	# date > initrd/DateTime
	umount initrd
	gzip -c initrd.img > iso/isolinux/initrd.img
	splash -s -f bootsplash/config/bootsplash-640x480.cfg \
		>> iso/isolinux/initrd.img
	# date > iso/DateTime
	mv iso/isolinux/isolinux.cfg tmp/isolinux.cfg
	sed s/ramdisk=[0-9]*/ramdisk=$(RAMDISK_SIZE)/ tmp/isolinux.cfg \
		> iso/isolinux/isolinux.cfg
	rm -f tmp/isolinux.cfg
	mkisofs -o $(ISO_IMAGE) -J -R -V RecoveryCD \
		-b isolinux/isolinux.bin -c boot.cat -no-emul-boot \
		-boot-load-size=4 -boot-info-table \
		iso

$(ISO_KERNEL): $(CURR_KERNEL)
	cp -f $? $@

COMPONENTS = P_dirs P_dev P_sysvinit P_basetools P_initscripts \
	P_module_init_tools P_exttools P_perl P_nettools P_process_tools \
	P_iscsi P_boot_loader P_Xserver P_recover P_nss P_busybox

ifeq ("$(ENABLE_ENCRYPT)", "yes")
	COMPONENTS += P_IMA
endif

PXE_KERNEL = /tftpboot/X86PC/UNDI/RecoveryCD/vmlinuz

.PHONY: $(COMPONENTS)

pxe: select_oem $(COMPONENTS) $(PXE_KERNEL)


select_oem:
#	perl setconfig.pl

##############################################################################
# Prepare dirs

P_dirs: rootfs/bin rootfs/sbin rootfs/etc rootfs/proc rootfs/var rootfs/tmp \
	rootfs/lib/modules rootfs/usr/bin  rootfs/dev rootfs/root rootfs/sys \
	rootfs/usr/local rootfs/mnt iso/isolinux

rootfs/bin:
	mkdir -p $@
rootfs/sbin:
	mkdir $@
rootfs/etc:
	mkdir $@
rootfs/proc:
	mkdir $@
rootfs/var:
	mkdir $@
rootfs/tmp:
	mkdir $@
	chmod 777 $@
rootfs/lib/modules:
	mkdir -p $@
rootfs/usr/bin:
	mkdir -p $@
rootfs/dev:
	mkdir $@
rootfs/root:
	mkdir $@
	chmod 700 $@
rootfs/sys:
	mkdir $@
rootfs/usr/local:
	mkdir rootfs/usr/local
	mkdir rootfs/usr/local/{bin,sbin,lib,etc}
rootfs/mnt:
	mkdir rootfs/mnt
	mkdir rootfs/mnt/{floppy,cdrom,usb}
iso/isolinux:
	mkdir -p $@

##############################################################################
# Prepare dev nodes
P_dev:
	echo "Making P_dev"
	tar xfvz dev.tar.gz -C rootfs/ >/dev/null
	cp -af /dev/log rootfs/dev

##############################################################################
# The kernel

$(PXE_KERNEL): $(CURR_KERNEL)
	if [ -d $(shell dirname $@) ]; then \
		 cp -f $? $@; \
	fi
	cp -ar /lib/modules/$(shell uname -r) rootfs/lib/modules

##############################################################################
# Prepare sysvinit tools
P_sysvinit: rootfs/sbin/init rootfs/sbin/halt rootfs/sbin/shutdown \
	rootfs/sbin/reboot rootfs/bin/ldd rootfs/sbin/ldconfig \
	rootfs/sbin/initlog rootfs/lib/libc.so.6 rootfs/lib/ld-linux.so.2

rootfs/sbin/init: /sbin/init
	cp -af $? $@

rootfs/sbin/shutdown: /sbin/shutdown
	cp -af $? $@

rootfs/sbin/halt: /sbin/halt
	cp -af $? $@

rootfs/sbin/reboot: /sbin/reboot
	cp -af $? $@

rootfs/sbin/initlog: /sbin/initlog
	cp -af $? $@

rootfs/lib/libc.so.6: /lib/libc.so.6
	cp -f $? $@

rootfs/lib/ld-linux.so.2: /lib/ld-linux.so.2
	cp -f $? $@
	> rootfs/etc/ld.so.conf

rootfs/sbin/ldconfig: /sbin/ldconfig
	cp -f $? $@
	
rootfs/bin/ldd: /usr/bin/ldd
	cp -af $? $@

###########################################################################
# Base tools, including:
# bash, agetty, mkdir, mount, umount, ls, cat, cp, rm, mv, vi
P_basetools: rootfs/sbin/agetty rootfs/bin/bash rootfs/bin/ls rootfs/bin/cat \
	rootfs/bin/mkdir rootfs/bin/rm rootfs/bin/mount rootfs/bin/umount \
	rootfs/bin/cp rootfs/bin/mv rootfs/bin/vi rootfs/bin/chmod \
	rootfs/bin/date rootfs/bin/wc rootfs/bin/touch rootfs/bin/expr \
	rootfs/bin/uname rootfs/bin/clear rootfs/bin/ln \
	rootfs/sbin/klogd rootfs/sbin/syslogd rootfs/bin/mknod \
	rootfs/lib/libtermcap.so.2 rootfs/lib/libdl.so.2 \
	rootfs/lib/libsepol.so.1 rootfs/lib/libselinux.so.1 \
	rootfs/lib/libacl.so.1 rootfs/lib/libattr.so.1 \
	rootfs/sbin/usleep rootfs/sbin/dmsetup rootfs/sbin/od \
	rootfs/sbin/scsi_id rootfs/lib/libdevmapper.so.1.02

rootfs/sbin/agetty: /sbin/agetty
	cp -af $? $@

rootfs/bin/bash: /bin/bash
	cp -af $? $@
	ln -sf bash rootfs/bin/sh

rootfs/bin/ls: /bin/ls
	cp -af $? $@

rootfs/bin/cat: /bin/cat
	cp -af $? $@

rootfs/bin/mkdir: /bin/mkdir
	cp -af $? $@

rootfs/bin/cp: /bin/cp
	cp -af $? $@

rootfs/bin/rm: /bin/rm
	cp -af $? $@

rootfs/bin/mount: /bin/mount
	cp -af $? $@

rootfs/bin/umount: /bin/umount
	cp -af $? $@

rootfs/bin/mv: /bin/mv
	cp -af $? $@

rootfs/bin/vi: /bin/vi
	cp -af $? $@
	mkdir -p rootfs/usr/share/terminfo/l
	cp -f /usr/share/terminfo/l/linux rootfs/usr/share/terminfo/l/linux
rootfs/bin/chmod: /bin/chmod
	cp -af $? $@

rootfs/bin/date: /bin/date
	cp -af $? $@

rootfs/bin/wc: /usr/bin/wc
	cp -af $? $@

rootfs/bin/touch: /bin/touch
	cp -af $? $@

rootfs/bin/expr: /usr/bin/expr
	cp -af $? $@

rootfs/bin/uname: /bin/uname
	cp -af $? $@

rootfs/bin/clear: /usr/bin/clear
	cp -af $? $@

rootfs/bin/ln: /bin/ln
	cp -af $? $@

rootfs/sbin/klogd: /sbin/klogd
	cp -af $? $@

rootfs/sbin/syslogd: /sbin/syslogd
	cp -af $? $@

rootfs/bin/mknod: /bin/mknod
	cp -af $? $@
	
rootfs/lib/libtermcap.so.2: /lib/libtermcap.so.2
	cp -f $? $@

rootfs/lib/libdl.so.2: /lib/libdl.so.2
	cp -f $? $@

rootfs/lib/libsepol.so.1: /lib/libsepol.so.1
	cp -f $? $@

rootfs/lib/libselinux.so.1: /lib/libselinux.so.1
	cp -f $? $@

rootfs/lib/libacl.so.1: /lib/libacl.so.1
	cp -f $? $@

rootfs/lib/libattr.so.1: /lib/libattr.so.1
	cp -f $? $@

rootfs/sbin/usleep: /bin/usleep
	cp -f $? $@

rootfs/sbin/dmsetup: /sbin/dmsetup
	cp -f $? $@

rootfs/sbin/od: /usr/bin/od
	cp -f $? $@

rootfs/sbin/scsi_id: /sbin/scsi_id
	cp -f $? $@

rootfs/lib/libdevmapper.so.1.02: /lib/libdevmapper.so.1.02
	cp -f $? $@

########################################################################
# module_init_tools
P_module_init_tools: rootfs/sbin/insmod rootfs/sbin/rmmod rootfs/sbin/lsmod \
	rootfs/sbin/depmod rootfs/sbin/modprobe rootfs/sbin/modinfo

rootfs/sbin/insmod: /sbin/insmod
	cp -af $? $@
	[ -f $?.old ] && cp -af $?.old $@.old || exit 0
rootfs/sbin/rmmod: /sbin/rmmod
	cp -af $? $@
	[ -f $?.old ] && cp -af $?.old $@.old || exit 0
rootfs/sbin/lsmod: /sbin/lsmod
	cp -af $? $@
	[ -f $?.old ] && cp -af $?.old $@.old || exit 0
rootfs/sbin/depmod: /sbin/depmod
	cp -af $? $@
	[ -f $?.old ] && cp -af $?.old $@.old || exit 0
rootfs/sbin/modprobe: /sbin/modprobe
	cp -af $? $@
	[ -f $?.old ] && cp -af $?.old $@.old || exit 0
rootfs/sbin/modinfo: /sbin/modinfo
	cp -af $? $@
	[ -f $?.old ] && cp -af $?.old $@.old || exit 0

########################################################################
# initscripts
P_initscripts:
	cd initscripts; make install

########################################################################
# extension tools
# including: tr, sed, grep, find, awk, sort, head, tail, tac
P_exttools: rootfs/bin/tr rootfs/bin/sed rootfs/bin/grep rootfs/bin/find \
	rootfs/bin/awk rootfs/bin/sort rootfs/bin/sort rootfs/bin/head \
	rootfs/bin/tail rootfs/bin/tac rootfs/bin/top rootfs/sbin/sfdisk \
	rootfs/sbin/fdisk rootfs/bin/raw rootfs/bin/setterm \
	rootfs/bin/eject rootfs/sbin/mkfs.vfat \
	rootfs/lib/libpcre.so.0 rootfs/lib/libm.so.6 rootfs/lib/librt.so.1 \
	rootfs/lib/libpthread.so.0 rootfs/lib/libproc-3.2.3.so \
	rootfs/lib/libncurses.so.5 rootfs/lib/libgpm.so.1 rootfs/lib/libsysfs.so.1

rootfs/bin/tr: /usr/bin/tr
	cp -af $? $@

rootfs/bin/sed: /bin/sed
	cp -af $? $@

rootfs/bin/grep: /bin/grep
	cp -af $? $@
	cp -af /bin/egrep rootfs/bin/egrep

rootfs/bin/find: /usr/bin/find
	cp -af $? $@

rootfs/bin/awk: /usr/bin/awk
	cp /usr/bin/gawk rootfs/bin/gawk
	ln -sf gawk rootfs/bin/awk

rootfs/bin/sort: /bin/sort
	cp -af $? $@

rootfs/bin/head: /usr/bin/head
	cp -af $? $@

rootfs/bin/tail: /usr/bin/tail
	cp -af $? $@

rootfs/bin/tac: /usr/bin/tac
	cp -af $? $@

rootfs/bin/top: /usr/bin/top
	cp -af $? $@

rootfs/sbin/sfdisk: /sbin/sfdisk
	cp -af $? $@

rootfs/sbin/fdisk: /sbin/fdisk
	cp -af $? $@

rootfs/bin/raw: /usr/bin/raw
	cp -af $? $@

rootfs/bin/setterm: /usr/bin/setterm
	cp -af $? $@

rootfs/bin/eject: /usr/bin/eject
	cp -af $? $@
	
rootfs/sbin/mkfs.vfat: /sbin/mkfs.vfat
	cp -af $? $@
	
rootfs/lib/libpcre.so.0: /lib/libpcre.so.0
	cp -f $? $@

rootfs/lib/libm.so.6: /lib/libm.so.6
	cp -f $? $@

rootfs/lib/librt.so.1: /lib/librt.so.1
	cp -f $? $@

rootfs/lib/libpthread.so.0: /lib/libpthread.so.0
	cp -f $? $@

rootfs/lib/libproc-3.2.3.so: /lib/libproc-3.2.3.so
	cp -f $? $@

rootfs/lib/libncurses.so.5: /usr/lib/libncurses.so.5
	cp  -f $? $@

rootfs/lib/libgpm.so.1: /usr/lib/libgpm.so.1
	cp -f $? $@

rootfs/lib/libsysfs.so.1: /usr/lib/libsysfs.so.1
	cp -f $? $@

########################################################################
# Perl 5.8.0
P_perl: rootfs/usr/bin/perl rootfs/usr/lib/perl5.cramfs \
	rootfs/lib/libnsl.so.1 rootfs/lib/libcrypt.so.1 \
	rootfs/lib/libutil.so.1 rootfs/lib/libexpat.so.0
	
rootfs/usr/bin/perl: /usr/bin/perl
	cp -f $? $@

rootfs/usr/lib/perl5.cramfs: /usr/lib/perl5
	mkdir -p rootfs/usr/lib/perl5 
	mkcramfs $? $@

rootfs/lib/libnsl.so.1: /lib/libnsl.so.1
	cp -f $? $@

rootfs/lib/libcrypt.so.1: /lib/libcrypt.so.1
	cp -f $? $@

rootfs/lib/libutil.so.1: /lib/libutil.so.1
	cp -f $? $@

rootfs/lib/libexpat.so.0: /usr/lib/libexpat.so.0
	cp -f $? $@

########################################################################
# network tools
P_nettools: rootfs/sbin/ifconfig rootfs/sbin/route rootfs/bin/ping \
	rootfs/sbin/dhclient \
	rootfs/lib/libresolv.so.2

rootfs/sbin/ifconfig: /sbin/ifconfig
	cp -af $? $@

rootfs/sbin/route: /sbin/route
	cp -af $? $@

rootfs/bin/ping: /bin/ping
	cp -af $? $@

rootfs/lib/libresolv.so.2: /lib/libresolv.so.2
	cp -f $? $@

rootfs/sbin/dhclient: /sbin/dhclient
	cp -f $? $@
	echo "timeout 5;" > rootfs/etc/dhclient.conf
	echo "request routers, domain-name-servers;" >> rootfs/etc/dhclient.conf

##########################################################################
# nss
P_nss: rootfs/lib/libnss_files.so.1 rootfs/lib/libnss_files.so.2 \
	rootfs/lib/libnss_dns.so.1 rootfs/lib/libnss_dns.so.2 \
	rootfs/lib/libnss_wins.so.2 \
	rootfs/lib/libresolv.so.2 \
	rootfs/lib/liblber.so.2 rootfs/lib/libldap.so.2 \
	rootfs/lib/libgssapi_krb5.so.2 rootfs/lib/libkrb5.so.3 \
	rootfs/lib/libk5crypto.so.3 rootfs/lib/libcom_err.so.3 \
	rootfs/lib/libsasl.so.7 rootfs/lib/libssl.so.4 \
	rootfs/lib/libgdbm.so.2 rootfs/lib/libcrypto.so.4 \
	rootfs/lib/libpam.so.0 rootfs/lib/libz.so.1 \
	rootfs/etc/nsswitch.conf rootfs/etc/hosts

rootfs/lib/libnss_files.so.1: /lib/libnss_files.so.1
	cp -f $? $@

rootfs/lib/libnss_files.so.2: /lib/libnss_files.so.2
	cp -f $? $@

rootfs/lib/libnss_dns.so.1: /lib/libnss_dns.so.1
	cp -f $? $@

rootfs/lib/libnss_dns.so.2: /lib/libnss_dns.so.2
	cp -f $? $@

rootfs/lib/libnss_wins.so.2: /lib/libnss_wins.so
	cp -f $? $@

rootfs/lib/liblber.so.2: /usr/lib/liblber.so.2
	cp -f $? $@

rootfs/lib/libldap.so.2: /usr/lib/libldap.so.2
	cp -f $? $@

rootfs/lib/libgssapi_krb5.so.2: /usr/lib/libgssapi_krb5.so.2
	cp -f $? $@

rootfs/lib/libkrb5.so.3: /usr/lib/libkrb5.so.3
	cp -f $? $@
	
rootfs/lib/libk5crypto.so.3: /usr/lib/libk5crypto.so.3
	cp -f $? $@

rootfs/lib/libcom_err.so.3: /usr/lib/libcom_err.so.3
	cp -f $? $@

rootfs/lib/libsasl.so.7: /usr/lib/libsasl.so.7
	cp -f $? $@

rootfs/lib/libssl.so.4: /lib/libssl.so.4
	cp -f $? $@

rootfs/lib/libgdbm.so.2: /usr/lib/libgdbm.so.2
	cp -f $? $@

rootfs/lib/libcrypto.so.4: /lib/libcrypto.so.4
	cp -f $? $@

rootfs/lib/libpam.so.0: /lib/libpam.so.0
	cp -f $? $@

rootfs/lib/libz.so.1: /usr/lib/libz.so.1
	cp -f $? $@

rootfs/lib/liblaus.so.1: /lib/liblaus.so.1
	cp -f $? $@

rootfs/etc/nsswitch.conf:
	echo "hosts: files wins dns" > $@

rootfs/etc/hosts:
	echo "127.0.0.1 localhost" > $@

rootfs/etc/resolv.conf:
	> $@

##########################################################################
# Process tools
P_process_tools: rootfs/bin/kill rootfs/bin/sleep rootfs/bin/sync \
	rootfs/sbin/killall5 rootfs/bin/ps rootfs/sbin/consoletype

rootfs/bin/kill: /bin/kill
	cp -af $? $@

rootfs/bin/sleep: /bin/sleep
	cp -af $? $@

rootfs/bin/sync: /bin/sync
	cp -af $? $@

rootfs/sbin/killall5: /sbin/killall5
	cp -af $? $@
	ln -s killall5 rootfs/sbin/pidof

rootfs/bin/ps: /bin/ps
	cp -af $? $@

rootfs/sbin/consoletype: /sbin/consoletype
	cp -af $? $@

########################################################################
# iscsi initiator
P_iscsi: rootfs/sbin/iscsi

rootfs/sbin/iscsi: /etc/init.d/iscsi
	sed s%/etc/init.d/functions%/etc/rc.d/functions% $? > $@
	patch -p1 -i iscsi.diff
	chmod +x $@
	cp -af /sbin/iscsi* rootfs/sbin

#######################################################################
# boot loader
P_boot_loader:
	cd bootloader; make install

########################################################################
# X server
P_Xserver:
#	cd X11R6; make install

########################################################################
# recover programs
P_recover:
	cd recover; make install
########################################################################
# busybox
P_busybox:
	cd busybox; make install
	
########################################################################
# IMA
P_IMA:
	cd IMA; make install

########################################################################
.PHONY: iso_clean pxe_clean

clean: iso_clean pxe_clean

pxe_clean:
	rm -rf rootfs/* $(PXE_KERNEL)
iso_clean:
	rm -rf iso $(ISO_IMAGE)

