]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
2007-04-13 Fabian Greffrath <fabian.greffrath@web.de>
authorrobertmh <robertmh@localhost>
Sun, 13 Apr 2008 10:51:54 +0000 (10:51 +0000)
committerrobertmh <robertmh@localhost>
Sun, 13 Apr 2008 10:51:54 +0000 (10:51 +0000)
        * util/grub.d/30_os-prober.in: New script. Use `os-prober' and
        `linux-boot-prober' (if installed) to detect other operating
        systems which are installed on the computer and add them to
        the boot menu.
        * conf/common.rmk: Build and install 30_os-prober.

ChangeLog
DISTLIST
conf/common.mk
conf/common.rmk
util/grub.d/30_os-prober.in [new file with mode: 0644]

index e63a70bddd8c76bbe24dfc3f222abe98c9a4b9c3..88fcf7b862301170cb11856d7a08609e116d2045 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2007-04-13  Fabian Greffrath  <fabian.greffrath@web.de>
+
+       * util/grub.d/30_os-prober.in: New script. Use `os-prober' and
+       `linux-boot-prober' (if installed) to detect other operating
+       systems which are installed on the computer and add them to
+       the boot menu.
+       * conf/common.rmk: Build and install 30_os-prober.
+
 2008-04-12  Robert Millan  <rmh@aybabtu.com>
 
        * kern/powerpc/ieee1275/init.c: Move from here ...
index 291174e2b90d8a207c26dc85a38a328b55ea7191..1afbca1f121b0426cea2b536b8cf22f0065e2198 100644 (file)
--- a/DISTLIST
+++ b/DISTLIST
@@ -332,6 +332,7 @@ util/update-grub_lib.in
 util/grub.d/00_header.in
 util/grub.d/10_hurd.in
 util/grub.d/10_linux.in
+util/grub.d/30_os-prober.in
 util/grub.d/README
 util/elf/grub-mkimage.c
 util/i386/efi/grub-install.in
index a7fa89b836fba66fe95dbdf0dd4efa1f3bc9683f..75fb633ba197a83959d63373c00ef743b3611263 100644 (file)
@@ -457,6 +457,12 @@ CLEANFILES += 10_linux
 update-grub_SCRIPTS += 10_hurd
 CLEANFILES += 10_hurd
 
+30_os-prober: util/grub.d/30_os-prober.in config.status
+       ./config.status --file=$@:$<
+       chmod +x $@
+update-grub_SCRIPTS += 30_os-prober
+CLEANFILES += 30_os-prober
+
 update-grub_DATA += util/grub.d/README
 
 
index 6e2d7aa3ab7b0553274564114b454e04282dac08..acbebc7b7bdb688fcd90b2f1da81aee15fb30832 100644 (file)
@@ -125,6 +125,12 @@ CLEANFILES += 10_linux
 update-grub_SCRIPTS += 10_hurd
 CLEANFILES += 10_hurd
 
+30_os-prober: util/grub.d/30_os-prober.in config.status
+       ./config.status --file=$@:$<
+       chmod +x $@
+update-grub_SCRIPTS += 30_os-prober
+CLEANFILES += 30_os-prober
+
 update-grub_DATA += util/grub.d/README
 
 
diff --git a/util/grub.d/30_os-prober.in b/util/grub.d/30_os-prober.in
new file mode 100644 (file)
index 0000000..56686e7
--- /dev/null
@@ -0,0 +1,89 @@
+#! /bin/sh -e
+
+# update-grub helper script.
+# Copyright (C) 2006,2007,2008  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/>.
+
+if [ -z "`which os-prober 2> /dev/null`" -o -z "`which linux-boot-prober 2> /dev/null`" ] ; then
+  # missing os-prober and/or linux-boot-prober
+  exit 0
+fi
+
+OSPROBED="`os-prober 2> /dev/null | tr ' ' '^' | paste -s -d ' '`"
+if [ -z "${OSPROBED}" ] ; then
+  # empty os-prober output, nothing doing
+  exit 0
+fi
+
+for OS in ${OSPROBED} ; do
+  DEVICE="`echo ${OS} | cut -d ':' -f 1`"
+  LONGNAME="`echo ${OS} | cut -d ':' -f 2 | tr '^' ' '`"
+  LABEL="`echo ${OS} | cut -d ':' -f 3 | tr '^' ' '`"
+  BOOT="`echo ${OS} | cut -d ':' -f 4`"
+
+  if [ -z "${LONGNAME}" ] ; then
+    LONGNAME="${LABEL}"
+  fi
+
+  echo "Found ${LONGNAME} on ${DEVICE}" >&2
+
+  case ${BOOT} in
+    chain)
+      CHAINROOT="`grub-probe --target=drive --device ${DEVICE} 2> /dev/null`"
+
+      cat << EOF
+menuentry "${LONGNAME} (on ${DEVICE})" {
+       set root=${CHAINROOT}
+       chainloader +1
+}
+EOF
+    ;;
+    linux)
+      LINUXPROBED="`linux-boot-prober ${DEVICE} 2> /dev/null | tr ' ' '^' | paste -s -d ' '`"
+      for LINUX in ${LINUXPROBED} ; do
+        LROOT="`echo ${LINUX} | cut -d ':' -f 1`"
+        LBOOT="`echo ${LINUX} | cut -d ':' -f 2`"
+        LLABEL="`echo ${LINUX} | cut -d ':' -f 3 | tr '^' ' '`"
+        LKERNEL="`echo ${LINUX} | cut -d ':' -f 4`"
+        LINITRD="`echo ${LINUX} | cut -d ':' -f 5`"
+        LPARAMS="`echo ${LINUX} | cut -d ':' -f 6- | tr '^' ' '`"
+
+        LINUXROOT="`grub-probe --target=drive --device ${LBOOT} 2> /dev/null`"
+
+        if [ -z "${LLABEL}" ] ; then
+          LLABEL="${LONGNAME}"
+        fi
+
+        cat << EOF
+menuentry "${LLABEL} (on ${DEVICE})" {
+       set root=${LINUXROOT}
+       linux ${LKERNEL} ${LPARAMS}
+EOF
+        if [ -n "${LINITRD}" ] ; then
+          cat << EOF
+       initrd ${LINITRD}
+EOF
+        fi
+        cat << EOF
+}
+EOF
+      done
+    ;;
+    hurd|*)
+      echo "  ${LONGNAME} is not yet supported by update-grub." >&2
+    ;;
+  esac
+done