# Generates a bootable ISO image that can be transferred to external media, such as CDs or USB sticks. # This will install, in addition to your kernel, the bootloader GRUB (https://www.gnu.org/software/grub/). # # The target 'gemu-iso' is used to test the image generated with 'iso'. # # Assuming that a USB mass-storage devices is connected as, for instance /dev/sdc, the target 'usb-sdc' # can be used to make your device bootable (requires root access, substitute sdc with the matching device). # Alternatively, you can burn the .iso file directly to CD. DD = dd XORRISO = xorriso MKISO = grub-mkrescue ISODIR = $(BUILDDIR)-iso ISOGRUBCFG = boot/grub/grub.cfg ISOKERNEL = boot/kernel ISOINITRD = initrd GRUBTITLE = $(shell id -un)s $(PROJECT) GRUBTIMEOUT = 2 GRUBBIN = /usr/lib/grub/i386-pc # Default ISO target iso: $(ISOFILE) # Create Grub config $(ISODIR)/$(ISOGRUBCFG): @echo "GEN $@" @mkdir -p $(dir $@) @$(echo) "set timeout=$(GRUBTIMEOUT)\nset default=0\n\nmenuentry \"$(GRUBTITLE)\" {\n\tmultiboot /$(ISOKERNEL)\n\tmodule /$(ISOINITRD)\n\tboot\n}" > $@ # Strip debug symbols from kernel binary $(ISODIR)/$(ISOKERNEL): all @echo "STRIP $@" @mkdir -p $(dir $@) $(VERBOSE) $(STRIP) --strip-debug --strip-unneeded -p -o $@ $(KERNEL) # copy inital ramdisk $(ISODIR)/$(ISOINITRD): all @echo "CPY $@" @mkdir -p $(dir $@) @if [ -s $(INITRD) ] ; then cp -a $(INITRD) $@ ; else touch $@ ; fi # Pack to ISO $(ISOFILE): $(ISODIR)/$(ISOKERNEL) $(ISODIR)/$(ISOINITRD) $(ISODIR)/$(ISOGRUBCFG) @echo "ISO $@" @which $(XORRISO) >/dev/null || echo "Xorriso cannot be found - if building the ISO fails, this may be the reason!" >&2 $(VERBOSE) $(MKISO) -d $(GRUBBIN) -o $@ $(ISODIR) # Run ISO in QEMU/KVM %-iso: $(ISOFILE) @${MAKE} -s QEMUKERNEL="-cdrom $<" $* # Copy ISO to USB device usb: $(ISOFILE) ifeq (,$(USBDEV)) @echo "The environment variable USBDEV must contain the path to the USB mass-storage device:" >&2 @lsblk -o TYPE,KNAME,SIZE,MODEL -a -p | grep "^disk" | cut -b 6- @exit 1 else $(VERBOSE) $(DD) if=$< of=$(USBDEV) bs=4M status=progress && sync endif # Shorthand to copy ISO to a specific USB device usb-%: @$(MAKE) USBDEV=/dev/$* usb # Burn ISO to CD cd: $(ISOFILE) ifeq (,$(CDRWDEV)) @echo "The environment variable CDRWDEV must contain the path to the CD/DVD writer" >&2 @exit 1 else $(VERBOSE) $(XORRISO) -as cdrecord -v dev=$(CDRWDEV) -dao $< endif # Shorthand to nurn ISO to specific CD device cd-%: @$(MAKE) CDRWDEV=/dev/$* cd # The standard target 'clean' removes the whole generated system, the object files, and the dependency files. clean:: @echo "RM $(ISODIR)" $(VERBOSE) rm -rf "$(ISODIR)" "$(ISODIR)$(OPTTAG)" "$(ISODIR)$(NOOPTTAG)" "$(ISODIR)$(DBGTAG)" "$(ISODIR)$(VERBOSETAG)" # Documentation help:: @$(echo) "Bootable Images\n" \ " \e[3miso\e[0m Generates a bootable system image (File: $(ISOFILE))\n\n" \ " \e[3m*-iso\e[0m Simulate the system by booting from the virtual CD drive. (e.g. qemu-iso)\n\n" \ " \e[3musb\e[0m Generates a bootable USB mass-storage device; the environment\n" \ " variable \e[4mUSBDEV\e[0m should point to the USB device\n\n" \ " \e[3mcd\e[0m Generates a bootable CD; the environment variable \e[4mCDRWDEV\e[0m\n" \ " should point to the CD writer\n\n" # Phony targets .PHONY: iso cd usb help