Skip to content

Commit

Permalink
[build] Merge util/geniso and util/genliso
Browse files Browse the repository at this point in the history
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
eworm-de authored and mcb30 committed May 14, 2014
1 parent d31cf2d commit a8f037a
Show file tree
Hide file tree
Showing 3 changed files with 125 additions and 137 deletions.
8 changes: 4 additions & 4 deletions src/arch/i386/Makefile.pcbios
Expand Up @@ -49,13 +49,13 @@ LIST_NAME_mrom := ROMS
NON_AUTO_MEDIA += iso
%iso: %lkrn util/geniso
$(QM)$(ECHO) " [GENISO] $@"
$(Q)ISOLINUX_BIN=$(ISOLINUX_BIN) bash util/geniso $@ $<
$(Q)ISOLINUX_BIN=$(ISOLINUX_BIN) VERSION="$(VERSION)" bash util/geniso -o $@ $<

# rule to make a floppy emulation ISO boot image
NON_AUTO_MEDIA += liso
%liso: %lkrn util/genliso
$(QM)$(ECHO) " [GENLISO] $@"
$(Q)bash util/genliso $@ $<
%liso: %lkrn util/geniso
$(QM)$(ECHO) " [GENISO] $@"
$(Q)VERSION="$(VERSION)" bash util/geniso -l -o $@ $<

# rule to make a syslinux floppy image (mountable, bootable)
NON_AUTO_MEDIA += sdsk
Expand Down
180 changes: 121 additions & 59 deletions src/util/geniso
@@ -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}
74 changes: 0 additions & 74 deletions src/util/genliso

This file was deleted.

0 comments on commit a8f037a

Please sign in to comment.