f6e1da5cbf
Some distributions (observed with Ubuntu 15.04) place ldlinux.c32 in a separate directory from isolinux.bin. Search for these files separately, and allow an alternative location of ldlinux.c32 to be provided via LDLINUX_C32=... on the make command line. Reported-by: Adrian Koshka <adriankoshcha@teknik.io> Tested-by: Adrian Koshka <adriankoshcha@teknik.io> Signed-off-by: Michael Brown <mcb30@ipxe.org>
142 lines
2.8 KiB
Bash
Executable File
142 lines
2.8 KiB
Bash
Executable File
#!/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
|
|
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}
|
|
|
|
# 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}
|