[ipxe-devel] [PATCH 1/1] [build] allow to build ISO image with EFI support (ipxe.eiso)

Christian Hesse list at eworm.de
Tue Apr 7 14:07:51 UTC 2015


From: Christian Hesse <mail at eworm.de>

Signed-off-by: Christian Hesse <mail at eworm.de>
---
 src/arch/i386/Makefile.pcbios |  6 ++++++
 src/util/geniso               | 39 ++++++++++++++++++++++++++++++---------
 2 files changed, 36 insertions(+), 9 deletions(-)

diff --git a/src/arch/i386/Makefile.pcbios b/src/arch/i386/Makefile.pcbios
index ff82373..c7a58eb 100644
--- a/src/arch/i386/Makefile.pcbios
+++ b/src/arch/i386/Makefile.pcbios
@@ -59,6 +59,12 @@ NON_AUTO_MEDIA	+= iso
 	$(QM)$(ECHO) "  [GENISO] $@"
 	$(Q)ISOLINUX_BIN=$(ISOLINUX_BIN) VERSION="$(VERSION)" bash util/geniso -o $@ $<
 
+# rule to make a non-emulation ISO boot image with EFI support
+NON_AUTO_MEDIA	+= eiso
+%eiso:	%lkrn bin-i386-efi/ipxe.efi bin-x86_64-efi/ipxe.efi util/geniso
+	$(QM)$(ECHO) "  [GENISO] $@"
+	$(Q)ISOLINUX_BIN=$(ISOLINUX_BIN) VERSION="$(VERSION)" bash util/geniso -e -o $@ $<
+
 # rule to make a floppy emulation ISO boot image
 NON_AUTO_MEDIA	+= liso
 %liso:	%lkrn util/geniso
diff --git a/src/util/geniso b/src/util/geniso
index 521c929..998370d 100755
--- a/src/util/geniso
+++ b/src/util/geniso
@@ -6,16 +6,21 @@ function help() {
 	echo "usage: ${0} [OPTIONS] foo.lkrn [bar.lkrn,...]"
 	echo
 	echo "where OPTIONS are:"
+	echo " -e	build image with EFI support"
 	echo " -h       show this help"
 	echo " -l       build legacy image with floppy emulation"
 	echo " -o FILE  save iso image to file"
 }
 
+EFI=0
 LEGACY=0
 FIRST=""
 
-while getopts "hlo:" opt; do
+while getopts "ehlo:" opt; do
 	case ${opt} in
+		e)
+			EFI=1
+			;;
 		h)
 			help
 			exit 0
@@ -37,23 +42,24 @@ if [ -z "${OUT}" ]; then
 	exit 1
 fi
 
-# There should either be mkisofs or the compatible genisoimage program
-for command in genisoimage mkisofs; do
+# We require xorriso (from libisoburn) for EFI support
+# genisoimage and mkisofs are missing some features
+for command in xorriso; do
 	if ${command} --version >/dev/null 2>/dev/null; then
-		mkisofs=(${command})
+		xorriso=(${command})
 		break
 	fi
 done
 
-if [ -z "${mkisofs}" ]; then
-	echo "${0}: mkisofs or genisoimage not found, please install or set PATH" >&2
+if [ -z "${xorriso}" ]; then
+	echo "${0}: xorriso not found, please install or set PATH" >&2
 	exit 1
 fi
 
 dir=$(mktemp -d bin/iso.dir.XXXXXX)
 cfg=${dir}/isolinux.cfg
 
-mkisofs+=(-quiet -l -volid "iPXE" -preparer "iPXE build system"
+xorriso+=(-as mkisofs -quiet -l -volid "iPXE" -preparer "iPXE build system"
 	-appid "iPXE ${VERSION} - Open Source Network Boot Firmware"
 	-publisher "http://ipxe.org/" -c boot.cat)
 
@@ -116,12 +122,27 @@ case "${LEGACY}" in
 		fi
 
 		# generate the iso image
-		"${mkisofs[@]}" -b boot.img -output ${OUT} ${dir}
+		"${xorriso[@]}" -b boot.img -output ${OUT} ${dir}
 		;;
 	0)
 		# copy isolinux bootloader
 		cp ${ISOLINUX_BIN} ${dir}
 
+		xorriso+=(-b isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table)
+
+		if [ "${EFI}" -eq 1 ]; then
+			# generate EFI image
+			img=${dir}/efiboot.img
+
+			mformat -f 2880 -C -i ${img} ::
+			mmd -i ${img} "::/EFI"
+			mmd -i ${img} "::/EFI/BOOT"
+			mcopy -m -i ${img} bin-x86_64-efi/ipxe.efi "::EFI/BOOT/BOOTX64.EFI"
+			mcopy -m -i ${img} bin-i386-efi/ipxe.efi "::EFI/BOOT/BOOTIA32.EFI"
+
+			xorriso+=(-eltorito-alt-boot -e efiboot.img -isohybrid-gpt-basdat -no-emul-boot)
+		fi
+
 		# syslinux 6.x needs a file called ldlinux.c32
 		LDLINUX_C32=$(dirname ${ISOLINUX_BIN})/ldlinux.c32
 		if [ -s ${LDLINUX_C32} ]; then
@@ -129,7 +150,7 @@ case "${LEGACY}" in
 		fi
 
 		# generate the iso image
-		"${mkisofs[@]}" -b isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -output ${OUT} ${dir}
+		"${xorriso[@]}" -output ${OUT} ${dir}
 
 		# isohybrid will be used if available
 		if isohybrid --version >/dev/null 2>/dev/null; then
-- 
2.3.5




More information about the ipxe-devel mailing list