diff options
Diffstat (limited to 'qemu/roms/ipxe/src/util/geniso')
-rwxr-xr-x | qemu/roms/ipxe/src/util/geniso | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/qemu/roms/ipxe/src/util/geniso b/qemu/roms/ipxe/src/util/geniso new file mode 100755 index 000000000..521c929e1 --- /dev/null +++ b/qemu/roms/ipxe/src/util/geniso @@ -0,0 +1,142 @@ +#!/bin/bash +# +# Generate a isolinux ISO boot image + +function help() { + echo "usage: ${0} [OPTIONS] foo.lkrn [bar.lkrn,...]" + echo + echo "where OPTIONS are:" + echo " -h show this help" + echo " -l build legacy image with floppy emulation" + echo " -o FILE save iso image to file" +} + +LEGACY=0 +FIRST="" + +while getopts "hlo:" opt; do + case ${opt} in + h) + help + exit 0 + ;; + l) + LEGACY=1 + ;; + o) + OUT="${OPTARG}" + ;; + esac +done + +shift $((OPTIND - 1)) + +if [ -z "${OUT}" ]; then + echo "${0}: no output file given" >&2 + help + 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 + exit 1 +fi + +dir=$(mktemp -d bin/iso.dir.XXXXXX) +cfg=${dir}/isolinux.cfg + +mkisofs+=(-quiet -l -volid "iPXE" -preparer "iPXE build system" + -appid "iPXE ${VERSION} - Open Source Network Boot Firmware" + -publisher "http://ipxe.org/" -c boot.cat) + +# generate the config +cat > ${cfg} <<EOF +# These default options can be changed in the geniso script +SAY iPXE ISO boot image +TIMEOUT 30 +EOF +for f; do + if [ ! -r ${f} ]; then + echo "${f} does not exist, skipping" >&2 + continue + fi + b=$(basename ${f}) + g=${b%.lkrn} + g=${g//[^a-z0-9]} + g=${g:0:8}.krn + case "${FIRST}" in + "") + echo "DEFAULT ${b}" + FIRST=${g} + ;; + esac + echo "LABEL ${b}" + echo " KERNEL ${g}" + cp ${f} ${dir}/${g} +done >> ${cfg} + +case "${LEGACY}" in + 1) + # check for mtools + case "$(mtools -V)" in + Mtools\ version\ 3.9.9*|Mtools\ version\ 3.9.1[0-9]*|[mM]tools\ *\ [4-9].*) + ;; + *) + echo "Mtools version 3.9.9 or later is required" >&2 + exit 1 + ;; + esac + + # generate floppy image + img=${dir}/boot.img + mformat -f 1440 -C -i ${img} :: + + # copy lkrn file to floppy image + for f in ${dir}/*.krn; do + mcopy -m -i ${img} ${f} ::$(basename ${g}) + rm -f ${f} + done + + # copy config file to floppy image + mcopy -i ${img} ${cfg} ::syslinux.cfg + rm -f ${cfg} + + # write syslinux bootloader to floppy image + if ! syslinux ${img}; then + echo "${0}: failed writing syslinux to floppy image ${img}" >&2 + exit 1 + fi + + # generate the iso image + "${mkisofs[@]}" -b boot.img -output ${OUT} ${dir} + ;; + 0) + # copy isolinux bootloader + cp ${ISOLINUX_BIN} ${dir} + + # syslinux 6.x needs a file called ldlinux.c32 + LDLINUX_C32=$(dirname ${ISOLINUX_BIN})/ldlinux.c32 + if [ -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} + + # isohybrid will be used if available + if isohybrid --version >/dev/null 2>/dev/null; then + isohybrid ${OUT} >/dev/null + fi + ;; +esac + +# clean up temporary dir +rm -fr ${dir} |