Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[build] Merge util/geniso and util/genliso
Rework geniso and genliso to provide a single merged utility for generating ISO images. Modified-by: Michael Brown <mcb30@ipxe.org> Signed-off-by: Michael Brown <mcb30@ipxe.org>
- Loading branch information
Showing
3 changed files
with
125 additions
and
137 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,80 +1,142 @@ | ||
#!/bin/bash | ||
# | ||
# Generate a isolinux ISO boot image | ||
# | ||
# geniso foo.iso foo.lkrn | ||
# | ||
# the ISO image is the first argument so that a list of .lkrn images | ||
# to include can be specified | ||
# | ||
case $# in | ||
0|1) | ||
echo Usage: $0 foo.iso foo.lkrn ... | ||
exit 1 | ||
;; | ||
esac | ||
|
||
# This should be the default location of the isolinux.bin file | ||
isolinux_bin=${ISOLINUX_BIN:-util/isolinux.bin} | ||
if [ ! -r $isolinux_bin ] | ||
then | ||
echo $0: $isolinux_bin not found, please install, or set ISOLINUX_BIN in arch/i386/Makefile correctly | ||
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 | ||
mkisofs=`which mkisofs genisoimage 2>/dev/null | head -n1` | ||
if [ -z $mkisofs ] | ||
then | ||
echo $0: mkisofs or genisoimage not found, please install or set PATH | ||
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 | ||
|
||
# isohybrid will be used if available | ||
isohybrid=`which isohybrid 2>/dev/null` | ||
dir=$(mktemp -d bin/iso.dir.XXXXXX) | ||
cfg=${dir}/isolinux.cfg | ||
|
||
out=$1 | ||
shift | ||
dir=`mktemp -d bin/iso.dir.XXXXXX` | ||
cfg=$dir/isolinux.cfg | ||
cp $isolinux_bin $dir | ||
mkisofs+=(-quiet -l -volid "iPXE" -preparer "iPXE build system" | ||
-appid "iPXE ${VERSION} - Open Source Network Boot Firmware" | ||
-publisher "http://ipxe.org/" -c boot.cat) | ||
|
||
# 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 | ||
|
||
cat > $cfg <<EOF | ||
# generate the config | ||
cat > ${cfg} <<EOF | ||
# These default options can be changed in the geniso script | ||
SAY iPXE ISO boot image | ||
TIMEOUT 30 | ||
EOF | ||
first= | ||
for f | ||
do | ||
if [ ! -r $f ] | ||
then | ||
echo $f does not exist, skipping 1>&2 | ||
for f; do | ||
if [ ! -r ${f} ]; then | ||
echo "${f} does not exist, skipping" >&2 | ||
continue | ||
fi | ||
b=$(basename $f) | ||
b=$(basename ${f}) | ||
g=${b%.lkrn} | ||
g=${g//[^a-z0-9]}.krn | ||
case "$first" in | ||
"") | ||
echo DEFAULT $b | ||
;; | ||
g=${g//[^a-z0-9]} | ||
g=${g:0:8}.krn | ||
case "${FIRST}" in | ||
"") | ||
echo "DEFAULT ${b}" | ||
FIRST=${g} | ||
;; | ||
esac | ||
first=$g | ||
echo LABEL $b | ||
echo "" KERNEL $g | ||
cp $f $dir/$g | ||
done >> $cfg | ||
$mkisofs -quiet -l -o $out -c boot.cat -b isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table $dir | ||
rm -fr $dir | ||
if [ -n "$isohybrid" ] | ||
then | ||
$isohybrid $out >/dev/null | ||
fi | ||
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} |
This file was deleted.
Oops, something went wrong.