| #! /bin/sh |
| set -e |
| |
| # grub-mkconfig helper script. |
| # Copyright (C) 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/>. |
| |
| prefix="@prefix@" |
| exec_prefix="@exec_prefix@" |
| datarootdir="@datarootdir@" |
| grub_lang=`echo $LANG | cut -d . -f 1` |
| |
| export TEXTDOMAIN=@PACKAGE@ |
| export TEXTDOMAINDIR="@localedir@" |
| |
| . "$pkgdatadir/grub-mkconfig_lib" |
| |
| # Do this as early as possible, since other commands might depend on it. |
| # (e.g. the `loadfont' command might need lvm or raid modules) |
| for i in ${GRUB_PRELOAD_MODULES} ; do |
| echo "insmod $i" |
| done |
| |
| if [ "x${GRUB_DEFAULT}" = "x" ] ; then GRUB_DEFAULT=0 ; fi |
| if [ "x${GRUB_DEFAULT}" = "xsaved" ] ; then GRUB_DEFAULT='${saved_entry}' ; fi |
| if [ "x${GRUB_TIMEOUT}" = "x" ] ; then GRUB_TIMEOUT=5 ; fi |
| if [ "x${GRUB_GFXMODE}" = "x" ] ; then GRUB_GFXMODE=auto ; fi |
| |
| if [ "x${GRUB_DEFAULT_BUTTON}" = "x" ] ; then GRUB_DEFAULT_BUTTON="$GRUB_DEFAULT" ; fi |
| if [ "x${GRUB_DEFAULT_BUTTON}" = "xsaved" ] ; then GRUB_DEFAULT_BUTTON='${saved_entry}' ; fi |
| if [ "x${GRUB_TIMEOUT_BUTTON}" = "x" ] ; then GRUB_TIMEOUT_BUTTON="$GRUB_TIMEOUT" ; fi |
| |
| cat << EOF |
| if [ -s \$prefix/grubenv ]; then |
| load_env |
| fi |
| EOF |
| if [ "x$GRUB_BUTTON_CMOS_ADDRESS" != "x" ]; then |
| cat <<EOF |
| if cmostest $GRUB_BUTTON_CMOS_ADDRESS ; then |
| set default="${GRUB_DEFAULT_BUTTON}" |
| elif [ "\${next_entry}" ] ; then |
| set default="\${next_entry}" |
| set next_entry= |
| save_env next_entry |
| set boot_once=true |
| else |
| set default="${GRUB_DEFAULT}" |
| fi |
| EOF |
| else |
| cat <<EOF |
| if [ "\${next_entry}" ] ; then |
| set default="\${next_entry}" |
| set next_entry= |
| save_env next_entry |
| set boot_once=true |
| else |
| set default="${GRUB_DEFAULT}" |
| fi |
| EOF |
| fi |
| cat <<EOF |
| |
| if [ x"\${feature_menuentry_id}" = xy ]; then |
| menuentry_id_option="--id" |
| else |
| menuentry_id_option="" |
| fi |
| |
| export menuentry_id_option |
| |
| if [ "\${prev_saved_entry}" ]; then |
| set saved_entry="\${prev_saved_entry}" |
| save_env saved_entry |
| set prev_saved_entry= |
| save_env prev_saved_entry |
| set boot_once=true |
| fi |
| |
| function savedefault { |
| if [ -z "\${boot_once}" ]; then |
| saved_entry="\${chosen}" |
| save_env saved_entry |
| fi |
| } |
| |
| function load_video { |
| EOF |
| if [ -n "${GRUB_VIDEO_BACKEND}" ]; then |
| cat <<EOF |
| insmod ${GRUB_VIDEO_BACKEND} |
| EOF |
| else |
| # If all_video.mod isn't available load all modules available |
| # with versions prior to introduction of all_video.mod |
| cat <<EOF |
| if [ x\$feature_all_video_module = xy ]; then |
| insmod all_video |
| else |
| insmod efi_gop |
| insmod efi_uga |
| insmod ieee1275_fb |
| insmod vbe |
| insmod vga |
| insmod video_bochs |
| insmod video_cirrus |
| fi |
| EOF |
| fi |
| cat <<EOF |
| } |
| |
| EOF |
| |
| serial=0; |
| gfxterm=0; |
| for x in ${GRUB_TERMINAL_INPUT} ${GRUB_TERMINAL_OUTPUT}; do |
| if [ xserial = "x$x" ]; then |
| serial=1; |
| fi |
| if [ xgfxterm = "x$x" ]; then |
| gfxterm=1; |
| fi |
| done |
| |
| if [ "x$serial" = x1 ]; then |
| if [ "x${GRUB_SERIAL_COMMAND}" = "x" ] ; then |
| grub_warn "$(gettext "Requested serial terminal but GRUB_SERIAL_COMMAND is unspecified. Default parameters will be used.")" |
| GRUB_SERIAL_COMMAND=serial |
| fi |
| echo "${GRUB_SERIAL_COMMAND}" |
| fi |
| |
| if [ "x$gfxterm" = x1 ]; then |
| if [ -n "$GRUB_FONT" ] ; then |
| # Make the font accessible |
| prepare_grub_to_access_device `${grub_probe} --target=device "${GRUB_FONT}"` |
| cat << EOF |
| if loadfont `make_system_path_relative_to_its_root "${GRUB_FONT}"` ; then |
| EOF |
| else |
| for dir in "${pkgdatadir}" "`echo '/@bootdirname@/@grubdirname@' | sed "s,//*,/,g"`" /usr/share/grub ; do |
| for basename in unicode unifont ascii; do |
| path="${dir}/${basename}.pf2" |
| if is_path_readable_by_grub "${path}" > /dev/null ; then |
| font_path="${path}" |
| else |
| continue |
| fi |
| break 2 |
| done |
| done |
| if [ -n "${font_path}" ] ; then |
| cat << EOF |
| if [ x\$feature_default_font_path = xy ] ; then |
| font=unicode |
| else |
| EOF |
| # Make the font accessible |
| prepare_grub_to_access_device `${grub_probe} --target=device "${font_path}"` |
| cat << EOF |
| font="`make_system_path_relative_to_its_root "${font_path}"`" |
| fi |
| |
| if loadfont \$font ; then |
| EOF |
| else |
| cat << EOF |
| if loadfont unicode ; then |
| EOF |
| fi |
| fi |
| |
| cat << EOF |
| set gfxmode=${GRUB_GFXMODE} |
| load_video |
| insmod gfxterm |
| EOF |
| |
| # Gettext variables and module |
| if [ "x${LANG}" != "xC" ] && [ "x${LANG}" != "x" ]; then |
| cat << EOF |
| set locale_dir=\$prefix/locale |
| set lang=${grub_lang} |
| insmod gettext |
| EOF |
| fi |
| |
| cat <<EOF |
| fi |
| EOF |
| fi |
| |
| case x${GRUB_TERMINAL_INPUT} in |
| x) |
| # Just use the native terminal |
| ;; |
| x*) |
| cat << EOF |
| terminal_input ${GRUB_TERMINAL_INPUT} |
| EOF |
| ;; |
| esac |
| |
| case x${GRUB_TERMINAL_OUTPUT} in |
| x) |
| # Just use the native terminal |
| ;; |
| x*) |
| cat << EOF |
| terminal_output ${GRUB_TERMINAL_OUTPUT} |
| EOF |
| ;; |
| esac |
| |
| if [ "x$gfxterm" = x1 ]; then |
| if [ "x$GRUB_THEME" != x ] && [ -f "$GRUB_THEME" ] \ |
| && is_path_readable_by_grub "$GRUB_THEME"; then |
| gettext_printf "Found theme: %s\n" "$GRUB_THEME" >&2 |
| |
| prepare_grub_to_access_device `${grub_probe} --target=device "$GRUB_THEME"` |
| cat << EOF |
| insmod gfxmenu |
| EOF |
| themedir="`dirname "$GRUB_THEME"`" |
| for x in "$themedir"/*.pf2 "$themedir"/f/*.pf2; do |
| if [ -f "$x" ]; then |
| cat << EOF |
| loadfont (\$root)`make_system_path_relative_to_its_root $x` |
| EOF |
| fi |
| done |
| if [ x"`echo "$themedir"/*.jpg`" != x"$themedir/*.jpg" ] || [ x"`echo "$themedir"/*.jpeg`" != x"$themedir/*.jpeg" ]; then |
| cat << EOF |
| insmod jpeg |
| EOF |
| fi |
| if [ x"`echo "$themedir"/*.png`" != x"$themedir/*.png" ]; then |
| cat << EOF |
| insmod png |
| EOF |
| fi |
| if [ x"`echo "$themedir"/*.tga`" != x"$themedir/*.tga" ]; then |
| cat << EOF |
| insmod tga |
| EOF |
| fi |
| |
| cat << EOF |
| set theme=(\$root)`make_system_path_relative_to_its_root $GRUB_THEME` |
| export theme |
| EOF |
| elif [ "x$GRUB_BACKGROUND" != x ] && [ -f "$GRUB_BACKGROUND" ] \ |
| && is_path_readable_by_grub "$GRUB_BACKGROUND"; then |
| gettext_printf "Found background: %s\n" "$GRUB_BACKGROUND" >&2 |
| case "$GRUB_BACKGROUND" in |
| *.png) reader=png ;; |
| *.tga) reader=tga ;; |
| *.jpg|*.jpeg) reader=jpeg ;; |
| *) gettext "Unsupported image format" >&2; echo >&2; exit 1 ;; |
| esac |
| prepare_grub_to_access_device `${grub_probe} --target=device "$GRUB_BACKGROUND"` |
| cat << EOF |
| insmod $reader |
| background_image -m stretch `make_system_path_relative_to_its_root "$GRUB_BACKGROUND"` |
| EOF |
| fi |
| fi |
| |
| make_timeout () |
| { |
| if [ "x${3}" != "x" ] ; then |
| timeout="${2}" |
| style="${3}" |
| elif [ "x${1}" != "x" ] && [ "x${1}" != "x0" ] ; then |
| # Handle the deprecated GRUB_HIDDEN_TIMEOUT scheme. |
| timeout="${1}" |
| if [ "x${2}" != "x0" ] ; then |
| grub_warn "$(gettext "Setting GRUB_TIMEOUT to a non-zero value when GRUB_HIDDEN_TIMEOUT is set is no longer supported.")" |
| fi |
| if [ "x${GRUB_HIDDEN_TIMEOUT_QUIET}" = "xtrue" ] ; then |
| style="hidden" |
| verbose= |
| else |
| style="countdown" |
| verbose=" --verbose" |
| fi |
| else |
| # No hidden timeout, so treat as GRUB_TIMEOUT_STYLE=menu |
| timeout="${2}" |
| style="menu" |
| fi |
| cat << EOF |
| if [ x\$feature_timeout_style = xy ] ; then |
| set timeout_style=${style} |
| set timeout=${timeout} |
| EOF |
| if [ "x${style}" = "xmenu" ] ; then |
| cat << EOF |
| # Fallback normal timeout code in case the timeout_style feature is |
| # unavailable. |
| else |
| set timeout=${timeout} |
| EOF |
| else |
| cat << EOF |
| # Fallback hidden-timeout code in case the timeout_style feature is |
| # unavailable. |
| elif sleep${verbose} --interruptible ${timeout} ; then |
| set timeout=0 |
| EOF |
| fi |
| cat << EOF |
| fi |
| EOF |
| } |
| |
| if [ "x$GRUB_BUTTON_CMOS_ADDRESS" != "x" ]; then |
| cat <<EOF |
| if cmostest $GRUB_BUTTON_CMOS_ADDRESS ; then |
| EOF |
| make_timeout "${GRUB_HIDDEN_TIMEOUT_BUTTON}" "${GRUB_TIMEOUT_BUTTON}" "${GRUB_TIMEOUT_STYLE_BUTTON}" |
| echo else |
| make_timeout "${GRUB_HIDDEN_TIMEOUT}" "${GRUB_TIMEOUT}" "${GRUB_TIMEOUT_STYLE}" |
| echo fi |
| else |
| make_timeout "${GRUB_HIDDEN_TIMEOUT}" "${GRUB_TIMEOUT}" "${GRUB_TIMEOUT_STYLE}" |
| fi |
| |
| if [ "x$GRUB_BUTTON_CMOS_ADDRESS" != "x" ] && [ "x$GRUB_BUTTON_CMOS_CLEAN" = "xyes" ]; then |
| cat <<EOF |
| cmosclean $GRUB_BUTTON_CMOS_ADDRESS |
| EOF |
| fi |
| |
| # Play an initial tune |
| if [ "x${GRUB_INIT_TUNE}" != "x" ] ; then |
| echo "play ${GRUB_INIT_TUNE}" |
| fi |
| |
| if [ "x${GRUB_BADRAM}" != "x" ] ; then |
| echo "badram ${GRUB_BADRAM}" |
| fi |