#! /bin/sh
set -e

# Copyright (C) 1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012  Free Software Foundation, Inc.
#
# GRUB is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# GRUB is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GRUB.  If not, see <http://www.gnu.org/licenses/>.

prefix="/usr"
exec_prefix="${prefix}"
datarootdir="${prefix}/share"
bindir="${exec_prefix}/bin"

libdir="${exec_prefix}/lib"
PACKAGE_NAME=GRUB2
PACKAGE_TARNAME=grub2
PACKAGE_VERSION=2.00
datadir="${datarootdir}"
if [ "x$pkgdatadir" = x ]; then
    pkgdatadir="${datadir}/grub2"
fi

self=`basename $0`

export TEXTDOMAIN=grub2
export TEXTDOMAINDIR="${datarootdir}/locale"

. "${pkgdatadir}/grub-mkconfig_lib"

modules=

pkglib_DATA="moddep.lst command.lst fs.lst partmap.lst parttool.lst \
handler.lst video.lst crypto.lst terminal.lst"

grub_mkimage="${bindir}/grub2-mkimage"

grub_compress_file () {
    if [ "$compressor" != "" ] ; then
        "$compressor" $compressor_opts "$1" > "$2"
    else
        cp -f "$1" "$2"
    fi
}

grub_install_files () {
    grub_install_files_source_directory="$1"
    grub_install_files_target_directory="$2"
    grub_install_files_platform="$3"
    
    mkdir -p "${grub_install_files_target_directory}"/"${grub_install_files_platform}"
    
    for file in "${grub_install_files_target_directory}"/*.mod \
"${grub_install_files_target_directory}"/*.lst \
"${grub_install_files_target_directory}"/*.img \
"${grub_install_files_target_directory}"/efiemu??.o \
"${grub_install_files_target_directory}"/"${grub_install_files_platform}"/*.mod \
"${grub_install_files_target_directory}"/"${grub_install_files_platform}"/*.lst \
"${grub_install_files_target_directory}"/"${grub_install_files_platform}"/*.img \
"${grub_install_files_target_directory}"/"${grub_install_files_platform}"/efiemu??.o;
    do
	if test -f "$file" && [ "`basename $file`" != menu.lst ]; then
	    rm -f "$file" || exit 1
	fi
    done

    if [ x"$install_modules" = xall ]; then
	for file in "${grub_install_files_source_directory}/"*.mod; do
	    grub_compress_file "$file" "${grub_install_files_target_directory}"/"${grub_install_files_platform}/$(basename "$file")"
	done
    else
	modules1=
	modules2="$install_modules"
	while [ x"$modules2" != x ]; do
	    modules3=
	    for x in $modules2; do
		modules3="$modules3 $(grep "^$x:" "${grub_install_files_source_directory}/moddep.lst" | sed 's,^[^:]*:,,')"
	    done
	    modules1="$modules1 $modules2"
	    modules2="$modules3"
	done
	for file in $(echo "$modules1" | sed 's, ,\n,g' |sort -u); do
	    grub_compress_file "${grub_install_files_source_directory}/$file.mod" "${grub_install_files_target_directory}"/"${grub_install_files_platform}/$file.mod"
	done
    fi
    
    for file in ${pkglib_DATA} efiemu32.o efiemu64.o; do
	if test -f "${grub_install_files_source_directory}/${file}"; then
            grub_compress_file "${grub_install_files_source_directory}/${file}" "${grub_install_files_target_directory}"/"${grub_install_files_platform}/${file}"
	fi
    done
    
    # Copy gettext files
    mkdir -p "${grub_install_files_target_directory}"/locale

    for file in "${grub_install_files_target_directory}"/locale/*.mo; do
	if test -f "$file"; then
	    rm -f "$file" || exit 1
	fi
    done

    if [ x"$install_locales" = xall ]; then
	for file in "${grub_install_files_source_directory}"/po/*.mo; do
	    if test -f "$file"; then
		grub_compress_file "$file" "${grub_install_files_target_directory}"/locale/"$(basename "$file")"
	    fi
	done
	for dir in "${localedir}"/*; do
	    if test -f "$dir/LC_MESSAGES/grub2.mo" && ! test -f "${grub_install_files_target_directory}"/locale/"${dir##*/}.mo"; then
		grub_compress_file "$dir/LC_MESSAGES/grub2.mo" "${grub_install_files_target_directory}"/locale/"${dir##*/}.mo"
	    fi
	done
    else
	for locale in $install_locales; do
	    if test -f "${grub_install_files_source_directory}"/po/$locale.mo; then
		grub_compress_file "${grub_install_files_source_directory}"/po/locale.mo "${grub_install_files_target_directory}"/locale/$locale.mo
	    elif test -f "${localedir}/$locale/LC_MESSAGES/grub2.mo"; then
		grub_compress_file "${localedir}/$locale/LC_MESSAGES/grub2.mo" "${grub_install_files_target_directory}"/locale/$locale.mo
	    fi
	done
    fi
    for theme in ${install_themes} ; do
	if test -f "${pkgdatadir}"/themes/"${theme}"/theme.txt; then
	    mkdir -p "${grub_install_files_target_directory}"/themes/"${theme}"
	    for file in "${pkgdatadir}"/themes/"${theme}"/*; do
		grub_compress_file "$file" "${grub_install_files_target_directory}"/themes/"${theme}"/"$(basename "$file")"
	    done
	fi
    done

    for font in ${install_fonts} ; do
	if test -f "${pkgdatadir}"/"$font".pf2; then
	    mkdir -p "${grub_install_files_target_directory}"/fonts
	    grub_compress_file "${pkgdatadir}"/"$font".pf2 "${grub_install_files_target_directory}"/fonts/"$font".pf2
	fi
    done
}

grub_print_install_files_help () {
    print_option_help "--modules=$(gettext "MODULES")" "$(gettext "pre-load specified modules MODULES")"
    print_option_help "--install-modules=$(gettext "MODULES")" "$(gettext "install only MODULES and their dependencies [default=all]")"
    print_option_help "--themes=THEMES" "$(gettext_printf "install THEMES [default=%s]" "starfield")"
    print_option_help "--fonts=FONTS" "$(gettext_printf "install FONTS [default=%s]" "unicode")"
    print_option_help "--locales=LOCALES" "$(gettext_printf "install only LOCALES [default=all]")"
    print_option_help "--compress[=no,xz,gz,lzo]" "$(gettext "compress GRUB files [optional]")"
    # TRANSLATORS: platform here isn't identifier. It can be translated.
    dir_msg="$(gettext_printf "use images and modules under DIR [default=%s/<platform>]" "${libdir}/grub2")"
    print_option_help "-d, --directory=$(gettext "DIR")" "$dir_msg"
    print_option_help  "--grub-mkimage=$(gettext "FILE")" "$(gettext "use FILE as grub-mkimage")"
    print_option_help "-v, --version" "$(gettext "print the version information and exit")"
}

install_modules=all
install_themes=starfield
install_fonts=unicode
install_locales=all
compress=no
grub_decompression_module=""
compressor=""
compressor_opts=""
source_directory=""

argument () {
  opt=$1
  shift

  if test $# -eq 0; then
      gettext_printf "%s: option requires an argument -- \`%s'\n" "$0" "$opt" 1>&2
      exit 1
  fi
  echo $1
}

grub_parse_compress () {
    compress="$1"
    case x"$compress" in
	xno) ;;
	xgz)
	    compressor=`which gzip || true`
	    grub_decompression_module="gzio"
	    compressor_opts="--best --stdout";;
	xxz)
	    compressor=`which xz || true`
	    grub_decompression_module="xzio gcry_crc"
	    compressor_opts="--lzma2=dict=128KiB --check=none --stdout";;
	xlzo)
	    compressor=`which lzop || true`
	    grub_decompression_module="lzopio adler32 gcry_crc"
	    compressor_opts="-9 -c";;
	*)
	    gettext_printf "Unrecognized compression \`%s'\n" "$compress" 1>&2
	    usage
	    exit 1
    esac
}

grub_process_install_options () {
    option=$1
    shift

    grub_process_install_options_consumed=0

    case "$option" in
	--install-modules)
	    install_modules=`argument $option "$@"`; grub_process_install_options_consumed=2; return ;;
	--install-modules=*)
            install_modules=`echo "$option" | sed 's/--install-modules=//'`; grub_process_install_options_consumed=1; return ;;
	--themes)
	    install_themes=`argument $option "$@"`; grub_process_install_options_consumed=2; return ;;
	--themes=*)
            install_themes=`echo "$option" | sed 's/--themes=//'`; grub_process_install_options_consumed=1; return ;;
	--fonts)
	    install_fonts=`argument $option "$@"`; grub_process_install_options_consumed=2; return ;;
	--fonts=*)
            install_fonts=`echo "$option" | sed 's/--fonts=//'`; grub_process_install_options_consumed=1; return ;;
	--locales)
	    install_locales=`argument $option "$@"`; grub_process_install_options_consumed=2; return ;;
	--locales=*)
            install_locales=`echo "$option" | sed 's/--locales=//'`; grub_process_install_options_consumed=1; return ;;
	--compress)
	    grub_parse_compress `argument $option "$@"`; grub_process_install_options_consumed=2; return ;;
        --compress=*)
            grub_parse_compress `echo "${option}" | sed 's/--compress=//'`; grub_process_install_options_consumed=1; return ;;
	--directory | -d)
	    source_directory=`argument $option "$@"`; grub_process_install_options_consumed=2 ;;
	--directory=*)
	    source_directory=`echo "$option" | sed 's/--directory=//'` grub_process_install_options_consumed=1;;

	# For backwards compatibility
	--override-directory)
	    source_directory=`argument $option "$@"`; grub_process_install_options_consumed=2 ;;
	--override-directory=*)
	    source_directory=`echo "$option" | sed 's/--override-directory=//'` grub_process_install_options_consumed=1;;

	--grub-mkimage)
	    grub_mkimage=`argument $option "$@"`; grub_process_install_options_consumed=2 ;;
        --grub-mkimage=*)
	    grub_mkimage=`echo "$option" | sed 's/--grub-mkimage=//'`;grub_process_install_options_consumed=1 ;;
        --modules)
	    modules=`argument $option "$@"`; grub_process_install_options_consumed=2;;
        --modules=*)
	    modules=`echo "$option" | sed 's/--modules=//'` grub_process_install_options_consumed=1;;
        -v | --version)
	    echo "$self (${PACKAGE_NAME}) ${PACKAGE_VERSION}"
	    exit 0 ;;
    esac
}

export grub_decompression_module
#!/bin/sh

# Make GRUB rescue image
# Copyright (C) 1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010  Free Software Foundation, Inc.
#
# GRUB is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# GRUB is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GRUB.  If not, see <http://www.gnu.org/licenses/>.

# Initialize some variables.

multiboot_dir="${libdir}/grub2/i386-multiboot"
coreboot_dir="${libdir}/grub2/i386-coreboot"
qemu_dir="${libdir}/grub2/i386-qemu"
mipsel_qemu_dir="${libdir}/grub2/mipsel-qemu_mips"
loongson_dir="${libdir}/grub2/mipsel-loongson"
mips_qemu_dir="${libdir}/grub2/mips-qemu_mips"
pc_dir="${libdir}/grub2/i386-pc"
i386_ieee1275_dir="${libdir}/grub2/i386-ieee1275"
efi32_dir="${libdir}/grub2/i386-efi"
efi64_dir="${libdir}/grub2/x86_64-efi"
ia64_dir="${libdir}/grub2/ia64-efi"
sparc64_dir="${libdir}/grub2/sparc64-ieee1275"
arcs_dir="${libdir}/grub2/mips-arc"
arc_dir="${libdir}/grub2/mipsel-arc"
ppc_dir="${libdir}/grub2/powerpc-ieee1275"
rom_directory=
grub_render_label="${bindir}/grub2-render-label"
grub_glue_efi="${bindir}/grub2-glue-efi"
label_font="${pkgdatadir}/unicode.pf2"
label_color="black"
label_bgcolor="white"
product_name="${PACKAGE_NAME}"
product_version="${PACKAGE_VERSION}"

xorriso=xorriso

localedir="${datarootdir}/locale"

# Usage: usage
# Print the usage.
usage () {
    gettext_printf "Usage: %s [OPTION] SOURCE...\n" "$self"
    # TRANSLATORS: it generates one single image which is bootable through any method.
    gettext "Make GRUB CD-ROM, disk, pendrive and floppy bootable image."; echo
    echo
    filetrans="$(gettext FILE)"
    print_option_help "-h, --help" "$(gettext "print this message and exit")"
    print_option_help "-o, --output=$filetrans" "$(gettext "save output in FILE [required]")"
    grub_print_install_files_help
    print_option_help "--rom-directory=$(gettext "DIR")" "$(gettext "save ROM images in DIR [optional]")"
    # TRANSLATORS: xorriso is a program for creating ISOs and burning CDs
    print_option_help "--xorriso=$filetrans" "$(gettext "use FILE as xorriso [optional]")"
    print_option_help "--grub-glue-efi=$filetrans" "$(gettext "use FILE as grub-glue-efi")"
    print_option_help "--grub-render-label=$filetrans" "$(gettext "use FILE as grub-render-label")"
    print_option_help "--label-font=$filetrans" "$(gettext "use FILE as font for label")"
    print_option_help "--label-color=$(gettext "COLOR")" "$(gettext "use COLOR for label")"
    print_option_help "--label-bgcolor=$(gettext "COLOR")" "$(gettext "use COLOR for label background")"
    print_option_help "--product-name=$(gettext "STRING")" "$(gettext "use STRING as product name")"
    print_option_help "--product-version=$(gettext "STRING")" "$(gettext "use STRING as product version")"
    print_option_help "--sparc-boot" "$(gettext "enable sparc boot. Disables HFS+, APM, ARCS and boot as disk image for i386-pc")"
    print_option_help "--arcs-boot" "$(gettext "enable ARCS (big-endian mips machines, mostly SGI) boot. Disables HFS+, APM, sparc64 and boot as disk image for i386-pc")"
    echo
    gettext_printf "%s generates a bootable rescue image with specified source files, source directories, or mkisofs options listed by the output of \`%s'\n" "xorriso -as mkisofs -help" "$self" | grub_fmt
    echo
    gettext "Option -- switches to native xorriso command mode."; echo
    echo
    gettext "Report bugs to <bug-grub@gnu.org>."; echo
    gettext "Mail xorriso support requests to <bug-xorriso@gnu.org>."; echo
}

system_area=auto
mkimage_extra_arg=

# Check the arguments.
while test $# -gt 0
do
    grub_process_install_options "$@"
    case "$grub_process_install_options_consumed" in
	1) shift; continue;;
	2) shift; shift; continue;;
    esac

    option=$1
    shift

    case "$option" in
    -h | --help)
	usage
	exit 0 ;;

    -o | --output)
	output_image=`argument $option "$@"`; shift ;;
    --output=*)
	output_image=`echo "$option" | sed 's/--output=//'` ;;

    --rom-directory)
        rom_directory=`argument $option "$@"`; shift ;;
    --rom-directory=*)
	rom_directory=`echo "$option" | sed 's/--rom-directory=//'` ;;

    # Intentionally undocumented
    --grub-mkimage-extra)
	mkimage_extra_arg="$mkimage_extra_arg `argument $option "$@"`"; shift ;;
    --grub-mkimage-extra=*)
	mkimage_extra_arg="$mkimage_extra_arg `echo "$option" | sed 's/--grub-mkimage-extra=//'`" ;;

    --sparc-boot)
        system_area=sparc64 ;;

    --arcs-boot)
        system_area=arcs ;;

    --product-name)
        product_name=`argument $option "$@"`; shift ;;
    --product-name=*)
	product_name=`echo "$option" | sed 's/--product-name=//'` ;;

    --product-version)
        product_version=`argument $option "$@"`; shift ;;
    --product-version=*)
	product_version=`echo "$option" | sed 's/--product-version=//'` ;;

    --grub-glue-efi)
	grub_glue_efi=`argument $option "$@"`; shift ;;
    --grub-glue-efi=*)
	grub_glue_efi=`echo "$option" | sed 's/--grub-glue-efi=//'` ;;

    --grub-render-label)
	grub_render_label=`argument $option "$@"`; shift ;;
    --grub-render-label=*)
	grub_render_label=`echo "$option" | sed 's/--grub-render-label=//'` ;;

    --label-font)
	label_font=`argument $option "$@"`; shift ;;
    --label-font=*)
	label_font=`echo "$option" | sed 's/--label-font=//'` ;;

    --label-color)
	label_color=`argument $option "$@"`; shift ;;
    --label-color=*)
	label_color=`echo "$option" | sed 's/--label-color=//'` ;;

    --label-bgcolor)
	label_bgcolor=`argument $option "$@"`; shift ;;
    --label-bgcolor=*)
	label_bgcolor=`echo "$option" | sed 's/--label-bgcolor=//'` ;;

    --xorriso)
	xorriso=`argument $option "$@"`; shift ;;
    --xorriso=*)
        xorriso=`echo "${option}" | sed 's/--xorriso=//'` ;;

    *)
	source="${source} ${option} $@"; break ;;
    esac
done

if [ "x${output_image}" = x ] ; then
  gettext "output file must be specified" >&2
  echo >&2
  usage
  exit 1
fi

set $grub_mkimage dummy
if test -f "$1"; then
    :
else
    gettext_printf "%s: Not found.\n" "$1" 1>&2
    exit 1
fi

iso9660_dir=`mktemp -d "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` || exit 1
mkdir -p ${iso9660_dir}/boot/grub
mkdir -p ${iso9660_dir}/boot/grub/roms

process_input_dir ()
{
    grub_install_files "$1" "${iso9660_dir}/boot/grub" "$2"
}

make_image ()
{
    source_directory="$1"
    platform=$2
    if ! test -e "${source_directory}"; then
	return;
    fi

    gettext_printf "Enabling %s support ...\n" "$2"

    load_cfg="`mktemp "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"`"

    (cat << EOF
search --fs-uuid --set=root ${iso_uuid}
set prefix=(\${root})/boot/grub
EOF
    for i in $(cat "${source_directory}/partmap.lst") ${modules} ; do
        echo "insmod $i"
    done ; ) > "${load_cfg}"

    "$grub_mkimage" -O ${platform} -d "${source_directory}" -c "${load_cfg}" -o "$3" \
        $grub_decompression_module search iso9660 $4
    rm -rf "${load_cfg}"
}

make_image_fwdisk ()
{
    source_directory="$1"
    platform=$2
    if ! test -e "${source_directory}"; then
	return;
    fi

    gettext_printf "Enabling %s support ...\n" "$2"

    "$grub_mkimage" -O ${platform} -d "${source_directory}" -p '()/boot/grub' -o "$3" \
        $grub_decompression_module iso9660 $4
}

if [ "${source_directory}" = "" ] ; then
    if [ "$system_area" = auto ]; then
	if test -e "${pc_dir}" || test -e "${ppc_dir}" \
	    || test -e "${efi32_dir}" || test -e "${efi64_dir}"; then 
	    system_area=common;
	elif test -e "${sparc64_dir}" ; then
	    system_area=sparc64;
	elif test -e "${arcs_dir}" ; then
	    system_area=arcs;
	fi
    fi
    if test -e "${multiboot_dir}" ; then
        process_input_dir "${multiboot_dir}" i386-multiboot
    fi
    if test -e "${coreboot_dir}" ; then
        process_input_dir "${coreboot_dir}" i386-coreboot
    fi
    if test -e "${qemu_dir}" ; then
        process_input_dir "${qemu_dir}" i386-qemu
    fi
    if test -e "${pc_dir}" ; then
        process_input_dir "${pc_dir}" i386-pc
    fi
    if test -e "${i386_ieee1275_dir}" ; then
	process_input_dir "${i386_ieee1275_dir}" i386-ieee1275
    fi
    if test -e "${efi32_dir}" ; then
        process_input_dir "${efi32_dir}" i386-efi
    fi
    if test -e "${efi64_dir}" ; then
        process_input_dir "${efi64_dir}" x86_64-efi
    fi
    if test -e "${ia64_dir}" ; then
        process_input_dir "${ia64_dir}" ia64-efi
    fi
    if test -e "${mips_qemu_dir}" ; then
        process_input_dir "${mips_qemu_dir}" mips-qemu_mips
    fi
    if test -e "${mipsel_qemu_dir}" ; then
        process_input_dir "${mipsel_qemu_dir}" mipsel-qemu_mips
    fi
    if test -e "${loongson_dir}" ; then
        process_input_dir "${loongson_dir}" mipsel-loongson
    fi
    if test -e "${ppc_dir}" ; then
        process_input_dir "${ppc_dir}" powerpc-ieee1275
    fi
    if test -e "${sparc64_dir}" ; then
        process_input_dir "${sparc64_dir}" sparc64-ieee1275
    fi
    if test -e "${arcs_dir}" ; then
        process_input_dir "${arcs_dir}" mips-arc
    fi
    if test -e "${arc_dir}" ; then
        process_input_dir "${arc_dir}" mipsel-arc
    fi
else
    . "${source_directory}"/modinfo.sh
    process_input_dir "${source_directory}" ${grub_modinfo_target_cpu}-${grub_modinfo_platform}
    multiboot_dir=
    pc_dir=
    efi32_dir=
    efi64_dir=
    ia64_dir=
    coreboot_dir=
    qemu_dir=
    mipsel_qemu_dir=
    mips_qemu_dir=
    loongson_dir=
    ppc_dir=
    i386_ieee1275_dir=
    sparc64_dir=
    arcs_dir=
    arc_dir=
    case "${grub_modinfo_target_cpu}-${grub_modinfo_platform}" in
        i386-multiboot) multiboot_dir="${source_directory}" ;;
        i386-coreboot) coreboot_dir="${source_directory}" ;;
        i386-qemu) qemu_dir="${source_directory}" ;;
        i386-pc) pc_dir="${source_directory}"; system_area=common;;
	i386-efi) efi32_dir="${source_directory}"; system_area=common ;;
	x86_64-efi) efi64_dir="${source_directory}"; system_area=common ;;
	ia64-efi) ia64_dir="${source_directory}" ;;
	mipsel-qemu_mips) mipsel_qemu_dir="${source_directory}" ;;
	mipsel-loongson) loongson_dir="${source_directory}" ;;
	mips-qemu_mips) mips_qemu_dir="${source_directory}" ;;
	powerpc-ieee1275) ppc_dir="${source_directory}"; system_area=common ;;
	sparc64-ieee1275) sparc64_dir="${source_directory}"; system_area=sparc64 ;;
	mips-arc) arcs_dir="${source_directory}"; system_area=arcs ;;
	mipsel-arc) arc_dir="${source_directory}" ;;
	i386-ieee1275) i386_ieee1275_dir="${source_directory}" ;;
    esac
fi

# obtain date-based UUID
iso_uuid=$(date -u +%Y-%m-%d-%H-%M-%S-00)
grub_mkisofs_arguments="${grub_mkisofs_arguments} --modification-date=$(echo ${iso_uuid} | sed -e s/-//g)"

# build BIOS core.img
if test -e "${pc_dir}" ; then
    gettext_printf "Enabling %s support ...\n" "BIOS"
    load_cfg="`mktemp "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"`"
    core_img="`mktemp "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"`" || exit 1

    (for i in $(cat "${pc_dir}/partmap.lst") ${modules} ; do
        echo "insmod $i"
    done ;) > "${load_cfg}"

    "$grub_mkimage" -O i386-pc -d "${pc_dir}/" -o "${core_img}" -c "$load_cfg" --prefix=/boot/grub \
        $grub_decompression_module iso9660 biosdisk
    cat "${pc_dir}/cdboot.img" "${core_img}" > "${iso9660_dir}/boot/grub/i386-pc/eltorito.img"

    grub_mkisofs_arguments="${grub_mkisofs_arguments} -b boot/grub/i386-pc/eltorito.img -no-emul-boot -boot-load-size 4 -boot-info-table"
    if [ "$system_area" = common ]; then
	if "${xorriso}" -as mkisofs -help 2>&1 | fgrep "grub2-boot-info" >/dev/null; then
	    grub_mkisofs_arguments="${grub_mkisofs_arguments} --grub2-boot-info --grub2-mbr ${pc_dir}/boot_hybrid.img"
	else
	    gettext "Your xorriso doesn't support \`--grub2-boot-info'. Some features are disabled. Please use xorriso 1.2.9 or later."
	    echo
	    sysarea_img="`mktemp "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"`" || exit 1
	    cat "${pc_dir}/boot.img" "${core_img}" > "${sysarea_img}"
	    if [ "$(wc -c "${sysarea_img}" | awk '{ print $1; }')" -gt 32768 ]; then
		gettext "Your xorriso doesn't support \`--grub2-boot-info'. Your core image is too big. Boot as disk is disabled. Please use xorriso 1.2.9 or later."
		echo
	    else
		grub_mkisofs_arguments="${grub_mkisofs_arguments} -G ${sysarea_img}"
	    fi
	fi
    fi

    rm -f "${core_img}"
fi

# build multiboot core.img
make_image "${multiboot_dir}" i386-multiboot "${iso9660_dir}/boot/grub/i386-multiboot/core.elf" "pata ahci at_keyboard"

make_image_fwdisk "${i386_ieee1275_dir}" i386-ieee1275 "${iso9660_dir}/boot/grub/ofwx86.elf" ""

if test -e "${efi64_dir}" || test -e "${efi32_dir}" || test -e "${ia64_dir}"; then
    efi_dir=`mktemp -d "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` || exit 1
    mkdir -p "${efi_dir}/efi/boot"

    # build bootia64.efi
    make_image "${ia64_dir}" ia64-efi "${efi_dir}"/efi/boot/bootia64.efi ""
    # build bootx64.efi
    make_image "${efi64_dir}" x86_64-efi "${efi_dir}"/efi/boot/bootx64.efi ""
    # build bootia32.efi
    make_image "${efi32_dir}" i386-efi "${efi_dir}"/efi/boot/bootia32.efi ""
    if [ -e "${efi_dir}"/efi/boot/bootia32.efi ]; then
        # For old macs. Suggested by Peter Jones.
	cp "${efi_dir}"/efi/boot/bootia32.efi "${efi_dir}"/efi/boot/boot.efi
    fi

    if [ -e "${efi_dir}"/efi/boot/bootx64.efi ] || [ -e "${efi_dir}"/efi/boot/bootia32.efi ]; then
	mkdir -p "${iso9660_dir}"/System/Library/CoreServices
    fi

    if [ -e "${efi_dir}"/efi/boot/bootx64.efi ] && [ -e "${efi_dir}"/efi/boot/bootia32.efi ]; then
	"$grub_glue_efi" -6 "${efi_dir}"/efi/boot/bootx64.efi -3 "${efi_dir}"/efi/boot/bootia32.efi -o "${iso9660_dir}"/System/Library/CoreServices/boot.efi
    elif [ -e "${efi_dir}"/efi/boot/bootx64.efi ]; then
	cp "${efi_dir}"/efi/boot/bootx64.efi "${iso9660_dir}"/System/Library/CoreServices/boot.efi
    elif [ -e "${efi_dir}"/efi/boot/bootia32.efi ]; then
	cp "${efi_dir}"/efi/boot/bootia32.efi "${iso9660_dir}"/System/Library/CoreServices/boot.efi
    fi

    mformat -C -f 2880 -L 16 -i "${iso9660_dir}"/efi.img ::
    mcopy -s -i "${iso9660_dir}"/efi.img ${efi_dir}/efi ::/
    rm -rf ${efi_dir}
    grub_mkisofs_arguments="${grub_mkisofs_arguments} --efi-boot efi.img -efi-boot-part --efi-boot-image"
fi

make_image_fwdisk "${ppc_dir}" powerpc-ieee1275 "${iso9660_dir}/boot/grub/powerpc-ieee1275/core.elf" ""
if [ -e "${iso9660_dir}"/System/Library/CoreServices/boot.efi ] || [ -e "${iso9660_dir}/boot/grub/powerpc-ieee1275/core.elf" ]; then
    mkdir -p "${iso9660_dir}"/System/Library/CoreServices
    touch "${iso9660_dir}/mach_kernel"
    cat > "${iso9660_dir}/System/Library/CoreServices/SystemVersion.plist" <<EOF
<plist version="1.0">
<dict>
        <key>ProductBuildVersion</key>
        <string></string>
        <key>ProductName</key>
        <string>${product_name}</string>
        <key>ProductVersion</key>
        <string>${product_version}</string>
</dict>
</plist>
EOF
    "$grub_render_label" -f "$label_font" -b "$label_bgcolor" -c "$label_color" -t "${product_name} ${product_version}" -o "${iso9660_dir}/System/Library/CoreServices/.disk_label"
    echo "${product_name} ${product_version}" > "${iso9660_dir}/System/Library/CoreServices/.disk_label.contentDetails"
    if [ "$system_area" = common ]; then
	grub_mkisofs_arguments="${grub_mkisofs_arguments} -hfsplus -apm-block-size 2048 -hfsplus-file-creator-type chrp tbxj /System/Library/CoreServices/.disk_label"
    fi
fi

if [ -e "${iso9660_dir}/boot/grub/powerpc-ieee1275/core.elf" ] ; then
    cp "${ppc_dir}/grub.chrp" "${iso9660_dir}"/System/Library/CoreServices/BootX
    mkdir -p "${iso9660_dir}"/ppc/chrp
    cp "${ppc_dir}/bootinfo.txt" "${iso9660_dir}"/ppc/bootinfo.txt
    grub_mkisofs_arguments="${grub_mkisofs_arguments} /System/Library/CoreServices/grub.elf=${iso9660_dir}/boot/grub/powerpc-ieee1275/core.elf /boot/grub/powerpc.elf=${iso9660_dir}/boot/grub/powerpc-ieee1275/core.elf"
    # FIXME: add PreP
    if [ "$system_area" = common ]; then
	grub_mkisofs_arguments="${grub_mkisofs_arguments} -hfsplus-file-creator-type chrp tbxi /System/Library/CoreServices/BootX -hfs-bless-by p /System/Library/CoreServices"
    fi
    grub_mkisofs_arguments="${grub_mkisofs_arguments} -sysid PPC"
fi

if [ -e "${iso9660_dir}"/System/Library/CoreServices/boot.efi ] && [ "$system_area" = common ]; then
    grub_mkisofs_arguments="${grub_mkisofs_arguments} -hfs-bless-by i /System/Library/CoreServices/boot.efi"
fi

make_image_fwdisk "${sparc64_dir}" sparc64-ieee1275-cdcore "${iso9660_dir}/boot/grub/sparc64-ieee1275/core.img" ""
if [ -e "${iso9660_dir}"/boot/grub/sparc64-ieee1275/core.img ] && [ "$system_area" = sparc64 ]; then
   sysarea_img="`mktemp "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"`" || exit 1
   dd if=/dev/zero count=1 bs=512 | cat - "${sparc64_dir}"/cdboot.img > "$sysarea_img"
   grub_mkisofs_arguments="${grub_mkisofs_arguments} -G $sysarea_img -B , --grub2-sparc-core /boot/grub/sparc64-ieee1275/core.img"
fi

make_image_fwdisk "${arcs_dir}" mips-arc "${iso9660_dir}/boot/grub/mips-arc/core.img" ""
if [ -e "${iso9660_dir}/boot/grub/mips-arc/core.img" ]; then
   grub_mkisofs_arguments="${grub_mkisofs_arguments} /boot/grub/mips-arc/grub=${iso9660_dir}/boot/grub/mips-arc/core.img /boot/grub/mips-arc/sashARCS=${iso9660_dir}/boot/grub/mips-arc/core.img  /boot/grub/mips-arc/sash=${iso9660_dir}/boot/grub/mips-arc/core.img"
fi
if [ -e "${iso9660_dir}/boot/grub/mips-arc/core.img" ] && [ "$system_area" = arcs ]; then
   grub_mkisofs_arguments="${grub_mkisofs_arguments} -mips-boot /boot/grub/mips-arc/sashARCS -mips-boot /boot/grub/mips-arc/sash -mips-boot /boot/grub/mips-arc/grub"
fi

make_image_fwdisk "${arc_dir}" mipsel-arc "${iso9660_dir}/boot/grub/arc.exe" ""

make_image "${mipsel_qemu_dir}" mipsel-qemu_mips-elf "${iso9660_dir}/boot/grub/roms/mipsel-qemu_mips.elf" "pata"
if [ -e "${iso9660_dir}/boot/grub/roms/mipsel-qemu_mips.elf" ] && [ -d "${rom_directory}" ]; then
    cp "${iso9660_dir}/boot/grub/roms/mipsel-qemu_mips.elf" "${rom_directory}/mipsel-qemu_mips.elf"
fi

make_image "${loongson_dir}" mipsel-loongson-elf "${iso9660_dir}/boot/grub/loongson.elf" "pata -C xz"
if [ -e "${iso9660_dir}/boot/grub/loongson.elf" ] && [ -d "${rom_directory}" ]; then
    cp "${iso9660_dir}/boot/grub/loongson.elf" "${rom_directory}/mipsel-loongson.elf"
fi
make_image "${loongson_dir}" mipsel-yeeloong-flash "${iso9660_dir}/boot/grub/roms/mipsel-yeeloong.bin" "pata -C xz"
if [ -e "${iso9660_dir}/boot/grub/roms/mipsel-yeeloong.bin" ] && [ -d "${rom_directory}" ]; then
    cp "${iso9660_dir}/boot/grub/roms/mipsel-yeeloong.bin" "${rom_directory}/mipsel-yeeloong.bin"
fi

make_image "${loongson_dir}" mipsel-fuloong2f-flash "${iso9660_dir}/boot/grub/roms/mipsel-fuloong2f.bin" "pata -C xz"
if [ -e "${iso9660_dir}/boot/grub/roms/mipsel-fulong.bin" ] && [ -d "${rom_directory}" ]; then
    cp "${iso9660_dir}/boot/grub/roms/mipsel-fulong.bin" "${rom_directory}/mipsel-fulong.bin"
fi

make_image "${mips_qemu_dir}" mips-qemu_mips-elf "${iso9660_dir}/boot/grub/roms/mips-qemu_mips.elf" "pata"
if [ -e "${iso9660_dir}/boot/grub/roms/mips-qemu_mips.elf" ] && [ -d "${rom_directory}" ]; then
    cp "${iso9660_dir}/boot/grub/roms/mips-qemu_mips.elf" "${rom_directory}/mips-qemu_mips.elf"
fi
make_image "${qemu_dir}" i386-qemu "${iso9660_dir}/boot/grub/roms/qemu.img" "pata at_keyboard"
if [ -e "${iso9660_dir}/boot/grub/roms/qemu.img" ] && [ -d "${rom_directory}" ]; then
    cp "${iso9660_dir}/boot/grub/roms/qemu.img" "${rom_directory}/qemu.img"
fi
make_image "${coreboot_dir}" i386-coreboot "${iso9660_dir}/boot/grub/roms/coreboot.elf" "pata ahci at_keyboard"
if [ -e "${iso9660_dir}/boot/grub/roms/coreboot.elf" ] && [ -d "${rom_directory}" ]; then
    cp "${iso9660_dir}/boot/grub/roms/coreboot.elf" "${rom_directory}/coreboot.elf"
fi

# build iso image
"${xorriso}" -as mkisofs -graft-points ${grub_mkisofs_arguments} --protective-msdos-label -o "${output_image}" -r "${iso9660_dir}" --sort-weight 0 / --sort-weight 1 /boot ${source}
rm -rf "${iso9660_dir}"

rm -f "${sysarea_img}"

exit 0
