Use submenus in grub-mkconfig.

* util/grub-mkconfig.in: Define GRUB_ACTUAL_DEFAULT.
	* util/grub-mkconfig_lib.in (grub_quote): New function.
	(gettext_printf): Use gettext and not gettext_quoted to fix several
	messages.
	* util/grub.d/10_hurd.in: Use submenus.
	* util/grub.d/10_kfreebsd.in: Likewise.
	* util/grub.d/10_linux.in: Likewise.
	* util/grub.d/10_netbsd.in: Likewise.
	* util/grub.d/20_linux_xen.in: Likewise.
	* util/grub.d/30_os-prober.in: Likewise.
	* util/grub.d/10_illumos.in: Add missing quoting.
	* util/grub.d/10_windows.in: Likewise.
This commit is contained in:
Vladimir 'phcoder' Serbinenko 2012-03-04 22:18:33 +01:00
parent d9bef9bc43
commit 0cdc126ca2
11 changed files with 424 additions and 154 deletions

View file

@ -63,37 +63,49 @@ load_kfreebsd_module ()
EOF
}
title_correction_code=
kfreebsd_entry ()
{
os="$1"
version="$2"
recovery="$3"
type="$3"
args="$4"
if ${recovery} ; then
title="$(gettext_quoted "%s, with kFreeBSD %s (recovery mode)")"
else
title="$(gettext_quoted "%s, with kFreeBSD %s")"
fi
if [ -z "$boot_device_id" ]; then
boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
fi
printf "menuentry '${title}' ${CLASS} \$menuentry_id_option 'kfreebsd-$version-$recovery-$boot_device_id' {\n" "${os}" "${version}"
if ! ${recovery} ; then
save_default_entry | sed -e "s/^/\t/"
if [ x$type != xsimple ] ; then
if [ x$type = xrecovery ] ; then
title="$(gettext_printf "%s, with kFreeBSD %s (recovery mode)" "${os}" "${version}")"
else
title="$(gettext_printf "%s, with kFreeBSD %s" "${os}" "${version}")"
fi
replacement_title="$(echo "Advanced options for ${OS}" | sed 's,>,>>,g')>$(echo "$title" | sed 's,>,>>,g')"
if [ x"$title" = x"$GRUB_ACTUAL_DEFAULT" ]; then
quoted="$(echo "$GRUB_ACTUAL_DEFAULT" | grub_quote)"
title_correction_code="${title_correction_code}if [ \"x\$default\" = '$quoted' ]; then default='$(echo "$replacement_title" | grub_quote)'; fi;"
grub_warn "$(gettext_printf "Please don't use old title \`%s' for GRUB_DEFAULT, use \`%s' (for versions before 2.00) or \`%s' (for 2.00 or later)" "$GRUB_ACTUAL_DEFAULT" "$replacement_title" "kfreebsd-advanced-$boot_device_id>kfreebsd-$version-$type-$boot_device_id")"
fi
echo "menuentry '$(echo "$title" | grub_quote)' ${CLASS} \$menuentry_id_option 'kfreebsd-$version-$type-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
else
echo "menuentry '$(echo "$OS" | grub_quote)' ${CLASS} \$menuentry_id_option 'kfreebsd-simple-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
fi
if [ x$type != xrecovery ] ; then
save_default_entry | sed -e "s/^/\t/" | sed "s/^/$submenu_indentation/"
fi
if [ -z "${prepare_boot_cache}" ]; then
prepare_boot_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | sed -e "s/^/\t/")"
fi
printf '%s\n' "${prepare_boot_cache}"
printf '%s\n' "${prepare_boot_cache}" | sed "s/^/$submenu_indentation/"
message="$(gettext_printf "Loading kernel of FreeBSD %s ..." ${version})"
cat << EOF
sed "s/^/$submenu_indentation/" << EOF
echo '$message'
kfreebsd ${rel_dirname}/${basename} ${args}
EOF
if test -n "${devices}" ; then
cat << EOF
sed "s/^/$submenu_indentation/" << EOF
kfreebsd_loadenv ${devices_rel_dirname}/${devices_basename}
EOF
fi
@ -112,19 +124,19 @@ EOF
ls "${dirname}/zfs/zpool.cache" > /dev/null
printf '%s\n' "${prepare_boot_cache}"
cat << EOF
sed "s/^/$submenu_indentation/" << EOF
kfreebsd_module ${rel_dirname}/zfs/zpool.cache type=/boot/zfs/zpool.cache
EOF
;;
esac
if [ x${kfreebsd_fs} = xufs ]; then
load_kfreebsd_module ${kfreebsd_fs} true
load_kfreebsd_module ${kfreebsd_fs} true | sed "s/^/$submenu_indentation/"
else
load_kfreebsd_module ${kfreebsd_fs} false
load_kfreebsd_module ${kfreebsd_fs} false | sed "s/^/$submenu_indentation/"
fi
cat << EOF
sed "s/^/$submenu_indentation/" << EOF
set kFreeBSD.vfs.root.mountfrom=${kfreebsd_fs}:${kfreebsd_device}
set kFreeBSD.vfs.root.mountfrom.options=rw
}
@ -136,6 +148,13 @@ list=`for i in /boot/kfreebsd-* /boot/kernel/kernel ; do
done`
prepare_boot_cache=
boot_device_id=
title_correction_code=
# Extra indentation to add to menu entries in a submenu. We're not in a submenu
# yet, so it's empty. In a submenu it will be equal to '\t' (one tab).
submenu_indentation=""
is_first_entry=true
while [ "x$list" != "x" ] ; do
kfreebsd=`version_find_latest $list`
@ -192,10 +211,31 @@ while [ "x$list" != "x" ] ; do
module_dir_rel=$(make_system_path_relative_to_its_root $module_dir)
fi
kfreebsd_entry "${OS}" "${version}" false
if [ "x$is_first_entry" = xtrue ]; then
kfreebsd_entry "${OS}" "${version}" simple
submenu_indentation="\t"
if [ -z "$boot_device_id" ]; then
boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
fi
# TRANSLATORS: %s is replaced with an OS name
echo "submenu '$(gettext_printf "Advanced options for %s" "${OS}" | grub_quote)' \$menuentry_id_option 'kfreebsd-advanced-$boot_device_id' {"
fi
kfreebsd_entry "${OS}" "${version}" advanced
if [ "x${GRUB_DISABLE_RECOVERY}" != "xtrue" ]; then
kfreebsd_entry "${OS}" "${version}" true "-s"
kfreebsd_entry "${OS}" "${version}" recovery "-s"
fi
list=`echo $list | tr ' ' '\n' | grep -vx $kfreebsd | tr '\n' ' '`
is_first_entry=false
done
# If at least one kernel was found, then we need to
# add a closing '}' for the submenu command.
if [ x"$is_first_entry" != xtrue ]; then
echo '}'
fi
echo "$title_correction_code"