From: Christian Hesse <m...@eworm.de> Signed-off-by: Christian Hesse <m...@eworm.de> --- src/arch/x86/Makefile.pcbios | 6 +++++ src/util/geniso | 52 ++++++++++++++++++++++++++++++++++---------- 2 files changed, 46 insertions(+), 12 deletions(-)
diff --git a/src/arch/x86/Makefile.pcbios b/src/arch/x86/Makefile.pcbios index 18a6f75..9cb3e0b 100644 --- a/src/arch/x86/Makefile.pcbios +++ b/src/arch/x86/Makefile.pcbios @@ -82,6 +82,12 @@ NON_AUTO_MEDIA += iso $(Q)ISOLINUX_BIN=$(ISOLINUX_BIN) LDLINUX_C32=$(LDLINUX_C32) \ 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 ff090d4..7694036 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,17 +42,25 @@ if [ -z "${OUT}" ]; then exit 1 fi -# There should either be mkisofs or the compatible genisoimage program -for command in genisoimage mkisofs; do - if ${command} --version >/dev/null 2>/dev/null; then - mkisofs=(${command}) - break - fi -done - -if [ -z "${mkisofs}" ]; then - echo "${0}: mkisofs or genisoimage not found, please install or set PATH" >&2 +# We need xorriso (from libisoburn) for EFI support, so try that first. +if xorriso --version >/dev/null 2>/dev/null; then + mkisofs=(xorriso -as mkisofs) +elif [ ${EFI} -eq 1 ]; then + echo "${0}: xorriso not found, but required for EFI support. Please install." >&2 exit 1 +else + # fall back to mkisofs or the compatible genisoimage program + for command in genisoimage mkisofs; do + if ${command} --version >/dev/null 2>/dev/null; then + mkisofs=(${command}) + break + fi + done + + if [ -z "${mkisofs}" ]; then + echo "${0}: mkisofs or genisoimage not found, please install or set PATH" >&2 + exit 1 + fi fi dir=$(mktemp -d bin/iso.dir.XXXXXX) @@ -122,13 +135,28 @@ case "${LEGACY}" in # copy isolinux bootloader cp ${ISOLINUX_BIN} ${dir} + mkisofs+=(-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" + + mkisofs+=(-eltorito-alt-boot -e efiboot.img -isohybrid-gpt-basdat -no-emul-boot) + fi + # syslinux 6.x needs a file called ldlinux.c32 if [ -n "${LDLINUX_C32}" -a -s "${LDLINUX_C32}" ]; then cp ${LDLINUX_C32} ${dir} fi # generate the iso image - "${mkisofs[@]}" -b isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -output ${OUT} ${dir} + "${mkisofs[@]}" -output ${OUT} ${dir} # isohybrid will be used if available if isohybrid --version >/dev/null 2>/dev/null; then -- 2.7.1 _______________________________________________ ipxe-devel mailing list ipxe-devel@lists.ipxe.org https://lists.ipxe.org/mailman/listinfo.cgi/ipxe-devel