# Makefile for diskless network boot Linux TEMP ?= /tmp ARCH = i386 CROSS_COMPILE = ROOTFSDIR = $(shell pwd)/rootfs.d KERNELVER = linux-2.6.33.3 KERNELDIST = $(KERNELVER).tar.bz2 KERNELURL = ftp.kernel.org/pub/linux/kernel/v2.6/$(KERNELDIST) KERNELSRC = $(shell pwd)/$(KERNELVER) BUSYBOX_VERSION = 1.16.1 BUSYBOX_NAME = busybox BUSYBOX_SRC = $(BUSYBOX_NAME)-$(BUSYBOX_VERSION) BUSYBOX_DIST = $(BUSYBOX_NAME)-$(BUSYBOX_VERSION).tar.bz2 BUSYBOX_SERVER = http://www.busybox.net/downloads BUSYBOX_URL = $(BUSYBOX_SERVER)/$(BUSYBOX_DIST) SYSLINUXVER = syslinux-3.86 SYSLINUXDIST = $(SYSLINUXVER).tar.bz2 SYSLINUXURL = http://www.kernel.org/pub/linux/utils/boot/syslinux/$(SYSLINUXDIST) SYSLINUXSRC = $(shell pwd)/$(SYSLINUXVER) .PHONY: kernel.menuconfig kernel busybox.menuconfig busybox pxelinux download install clean reallyclean distclean default: linux.kernel linux.pxelinux linux.iso ############################################################################### $(TEMP)/$(BUSYBOX_DIST): wget -nv -P $(TEMP) $(BUSYBOX_URL) $(BUSYBOX_SRC): $(TEMP)/$(BUSYBOX_DIST) tar xjf $(TEMP)/$(BUSYBOX_DIST) busybox.menuconfig: $(BUSYBOX_SRC) cp busybox.config $(BUSYBOX_SRC)/.config $(MAKE) -C $(BUSYBOX_SRC) menuconfig CROSS_COMPILE=$(CROSS_COMPILE) $(MAKE) -C $(BUSYBOX_SRC) oldconfig CROSS_COMPILE=$(CROSS_COMPILE) cp $(BUSYBOX_SRC)/.config busybox.config $(BUSYBOX_SRC)/skeleton: $(BUSYBOX_SRC) cp busybox.config $(BUSYBOX_SRC)/.config $(MAKE) -C $(BUSYBOX_SRC) oldconfig CROSS_COMPILE=$(CROSS_COMPILE) $(MAKE) -C $(BUSYBOX_SRC) CROSS_COMPILE=$(CROSS_COMPILE) $(MAKE) -C $(BUSYBOX_SRC) install CROSS_COMPILE=$(CROSS_COMPILE) CONFIG_PREFIX=./skeleton touch $@ busybox: $(BUSYBOX_SRC)/skeleton ############################################################################### # Build the root file system image initramfs.cpio.gz: $(BUSYBOX_SRC)/skeleton rm -rf $(ROOTFSDIR) fakeroot sh -c "./populate.sh BUSYBOXSRC=$(BUSYBOX_SRC) ROOTFSDIR=$(ROOTFSDIR) ; cd $(ROOTFSDIR) ; find . -print0 | cpio -ov -0 --format=newc | gzip -9 >../$@" initramfs: initramfs.cpio.gz ############################################################################### # Download Linux kernel distribution tarball $(TEMP)/$(KERNELDIST): wget -nv -P $(TEMP) $(KERNELURL) $(KERNELSRC): $(TEMP)/$(KERNELDIST) tar xjf $(TEMP)/$(KERNELDIST) # Configure the Linux kernel kernel.menuconfig: $(KERNELSRC) make -C $(KERNELSRC) mrproper ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) cp kernel.config $(KERNELSRC)/.config make -C $(KERNELSRC) menuconfig ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) make -C $(KERNELSRC) oldconfig ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) cp $(KERNELSRC)/.config kernel.config touch kernel.configured kernel.configured: $(KERNELSRC) kernel.config make -C $(KERNELSRC) mrproper ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) cp kernel.config $(KERNELSRC)/.config make -C $(KERNELSRC) oldconfig ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) touch kernel.configured # Build the Linux kernel $(KERNELSRC)/arch/i386/boot/bzImage: kernel.configured initramfs.cpio.gz make -C $(KERNELSRC) bzImage ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) linux.kernel: $(KERNELSRC)/arch/$(ARCH)/boot/bzImage cp $< $@ kernel: linux.kernel ############################################################################### # Download Syslinux distribution $(TEMP)/$(SYSLINUXDIST): wget -nv -P $(TEMP) $(SYSLINUXURL) $(SYSLINUXSRC): $(TEMP)/$(SYSLINUXDIST) tar xjf $(TEMP)/$(SYSLINUXDIST) cp $(SYSLINUXSRC)/core/pxelinux.asm $(SYSLINUXSRC)/core/pxelinux.asm.original cd $(SYSLINUXSRC) ; patch -p0 <../pxelinux.patch $(MAKE) -C $(SYSLINUXSRC)/core spotless # Compile pxelinux and isolinux $(SYSLINUXSRC)/core/pxelinux.0: $(SYSLINUXSRC) $(MAKE) -C $(SYSLINUXSRC)/core pxelinux.0 isolinux.bin touch $? touch $@ linux.pxelinux: $(SYSLINUXSRC)/core/pxelinux.0 cp $(SYSLINUXSRC)/core/pxelinux.0 linux.pxelinux pxelinux: linux.pxelinux ############################################################################### # Build ISO image with isolinux and kernel linux.iso: linux.kernel linux.pxelinux linux.config mkdir -p cdrom/isolinux install -cm 0644 $(SYSLINUXSRC)/core/isolinux.bin cdrom/isolinux install -cm 0444 linux.config cdrom/isolinux/isolinux.cfg install -cm 0444 linux.kernel cdrom/isolinux mkisofs -l -o linux.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table cdrom ############################################################################### # download source distributions download: $(KERNELDIST) $(BUSYBOX_DIST) $(SYSLINUXDIST) # Install to /tftpboot install: linux.kernel linux.pxelinux linux.config scp linux.kernel linux.pxelinux linux.config $(TFTPSERVER)/tftpboot # Clean out working files, except the kernel clean: -rm initramfs.cpio.gz -rm linux.pxelinux -rm linux.kernel -rm linux.iso -rm -rf $(ROOTFSDIR) -rm -rf cdrom # Clean out all working files reallyclean: clean -rm kernel.configured -rm -rf $(KERNELSRC) -rm -rf $(BUSYBOX_SRC) -rm -rf $(SYSLINUXSRC) # Return source tree to pristine state distclean: reallyclean -rm $(KERNELDIST) -rm $(BUSYBOX_DIST) -rm $(SYSLINUXDIST)