grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [RFT] install branch


From: Colin Watson
Subject: Re: [RFT] install branch
Date: Wed, 8 Sep 2010 11:59:34 +0100
User-agent: Mutt/1.5.18 (2008-05-17)

On Mon, Aug 30, 2010 at 09:10:27PM +0200, Vladimir 'φ-coder/phcoder' Serbinenko 
wrote:
> Hello. I've just merged all 3 different grub-install's we have in our
> tree to a single grub-install. This work is available as bzr checkout
> under http://bzr.savannah.gnu.org/r/grub/branches/install/. I also
> merged the EFI work by Colin Watson. Can anyone with ieee1275 and efi
> systems test the install branch?

I haven't managed to test this yet, but I see one error: with EFI,
install_device is set after it needs to be used.  I think you need
something like the following patch.

BTW, was there any particular reason you dropped the handling of
target_cpu=arm from my patch, or did I just add that after sending it to
you or something?  I know we don't support ARM yet much less ARM/UEFI,
but there seems no harm in listing all of the architectures from the
UEFI specification.

=== modified file 'util/grub-install.in'
--- util/grub-install.in        2010-09-06 21:03:25 +0000
+++ util/grub-install.in        2010-09-08 00:37:34 +0000
@@ -301,6 +301,95 @@ else
     exit 1
 fi
 
+if [ x"$platform" = xefi ]; then
+    # Get GRUB_DISTRIBUTOR.
+    if test -f ${sysconfdir}/default/grub ; then
+       . ${sysconfdir}/default/grub
+    fi
+
+    # Find the EFI System Partition.
+    efidir=
+    if test -d ${bootdir}/efi; then
+       install_device=`$grub_mkdevicemap --device-map=/dev/stdout | 
$grub_probe --target=device --device-map=/dev/stdin ${bootdir}/efi`
+        # Is it a mount point?
+       if test "x$install_device" != "x`$grub_mkdevicemap 
--device-map=/dev/stdout | $grub_probe --target=device --device-map=/dev/stdin 
${bootdir}`"; then
+           efidir=${bootdir}/efi
+       fi
+    elif test -n "$rootdir" && test "x$rootdir" != "x/"; then
+        # The EFI System Partition may have been given directly using
+        # --root-directory.
+       install_device=`$grub_mkdevicemap --device-map=/dev/stdout | 
$grub_probe --target=device --device-map=/dev/stdin ${rootdir}`
+        # Is it a mount point?
+       if test "x$install_device" != "x`$grub_mkdevicemap 
--device-map=/dev/stdout | $grub_probe --target=device --device-map=/dev/stdin 
${rootdir}/..`"; then
+           efidir=${rootdir}
+       fi
+    fi
+    
+    if test -n "$efidir"; then
+       efi_fs=`$grub_probe --target=fs --device-map=${device_map} ${efidir}`
+       if test "x$efi_fs" = xfat; then :; else
+           echo "${efidir} doesn't look like an EFI partition." 1>&2
+           efidir=
+       fi
+    fi
+    
+    if test -n "$efidir"; then
+        # The EFI specification requires that an EFI System Partition must
+        # contain an "EFI" subdirectory, and that OS loaders are stored in
+        # subdirectories below EFI.  Vendors are expected to pick names that do
+        # not collide with other vendors.  To minimise collisions, we use the
+        # name of our distributor if possible.
+       if test $removable = yes; then
+          # The specification makes stricter requirements of removable
+          # devices, in order that only one image can be automatically loaded
+          # from them.  The image must always reside under /EFI/BOOT, and it
+          # must have a specific file name depending on the architecture.
+           efi_distributor=BOOT
+           case "$target_cpu" in
+               i386)
+                   efi_file=BOOTIA32.EFI ;;
+               x86-64)
+                   efi_file=BOOTX64.EFI ;;
+           # GRUB does not yet support these architectures, but they're defined
+           # by the specification so we include them here to ease future
+           # expansion.
+               ia64)
+                   efi_file=BOOTIA64.EFI ;;
+           esac
+       else
+           efi_distributor="$(echo "$GRUB_DISTRIBUTOR" | tr '[A-Z]' '[a-z]' | 
cut -d' ' -f1)"
+           if test -z "$efi_distributor"; then
+               efi_distributor=grub
+           fi
+           # It is convenient for each architecture to have a different
+           # efi_file, so that different versions can be installed in parallel.
+           case "$target_cpu" in
+               i386)
+                   efi_file=grubia32.efi ;;
+               x86-64)
+                   efi_file=grubx64.efi ;;
+        # GRUB does not yet support these architectures, but they're defined
+        # by the specification so we include them here to ease future
+        # expansion.
+               ia64)
+                   efi_file=grubia64.efi ;;
+               *)
+                   efi_file=grub.efi ;;
+           esac
+          # TODO: We should also use efibootmgr, if available, to add a Boot
+          # entry for ourselves.
+       fi
+       efidir="$efidir/EFI/$efi_distributor"
+       mkdir -p "$efidir" || exit 1
+    else
+        # We don't know what's going on.  Fall back to traditional
+        # (non-specification-compliant) behaviour.
+       efidir="$grubdir"
+       efi_distributor=
+       efi_file=grub.efi
+    fi
+fi
+
 # Create the GRUB directory if it is not present.
 mkdir -p "$grubdir" || exit 1
 
@@ -501,93 +590,8 @@ elif [ "${target_cpu}-${platform}" = "i3
        }
     fi
 elif [ x"$platform" = xefi ]; then
-    # Get GRUB_DISTRIBUTOR.
-    if test -f ${sysconfdir}/default/grub ; then
-       . ${sysconfdir}/default/grub
-    fi
-
-    # Find the EFI System Partition.
-    efidir=
-    if test -d ${bootdir}/efi; then
-       install_device=`$grub_mkdevicemap --device-map=/dev/stdout | 
$grub_probe --target=device --device-map=/dev/stdin ${bootdir}/efi`
-        # Is it a mount point?
-       if test "x$install_device" != "x`$grub_mkdevicemap 
--device-map=/dev/stdout | $grub_probe --target=device --device-map=/dev/stdin 
${bootdir}`"; then
-           efidir=${bootdir}/efi
-       fi
-    elif test -n "$rootdir" && test "x$rootdir" != "x/"; then
-        # The EFI System Partition may have been given directly using
-        # --root-directory.
-       install_device=`$grub_mkdevicemap --device-map=/dev/stdout | 
$grub_probe --target=device --device-map=/dev/stdin ${rootdir}`
-        # Is it a mount point?
-       if test "x$install_device" != "x`$grub_mkdevicemap 
--device-map=/dev/stdout | $grub_probe --target=device --device-map=/dev/stdin 
${rootdir}/..`"; then
-           efidir=${rootdir}
-       fi
-    fi
-    
-    if test -n "$efidir"; then
-       efi_fs=`$grub_probe --target=fs --device-map=${device_map} ${efidir}`
-       if test "x$efi_fs" = xfat; then :; else
-           echo "${efidir} doesn't look like an EFI partition." 1>&2
-           efidir=
-       fi
-    fi
-    
-    if test -n "$efidir"; then
-        # The EFI specification requires that an EFI System Partition must
-        # contain an "EFI" subdirectory, and that OS loaders are stored in
-        # subdirectories below EFI.  Vendors are expected to pick names that do
-        # not collide with other vendors.  To minimise collisions, we use the
-        # name of our distributor if possible.
-       if test $removable = yes; then
-          # The specification makes stricter requirements of removable
-          # devices, in order that only one image can be automatically loaded
-          # from them.  The image must always reside under /EFI/BOOT, and it
-          # must have a specific file name depending on the architecture.
-           efi_distributor=BOOT
-           case "$target_cpu" in
-               i386)
-                   efi_file=BOOTIA32.EFI ;;
-               x86-64)
-                   efi_file=BOOTX64.EFI ;;
-           # GRUB does not yet support these architectures, but they're defined
-           # by the specification so we include them here to ease future
-           # expansion.
-               ia64)
-                   efi_file=BOOTIA64.EFI ;;
-           esac
-       else
-           efi_distributor="$(echo "$GRUB_DISTRIBUTOR" | tr '[A-Z]' '[a-z]' | 
cut -d' ' -f1)"
-           if test -z "$efi_distributor"; then
-               efi_distributor=grub
-           fi
-           # It is convenient for each architecture to have a different
-           # efi_file, so that different versions can be installed in parallel.
-           case "$target_cpu" in
-               i386)
-                   efi_file=grubia32.efi ;;
-               x86-64)
-                   efi_file=grubx64.efi ;;
-        # GRUB does not yet support these architectures, but they're defined
-        # by the specification so we include them here to ease future
-        # expansion.
-               ia64)
-                   efi_file=grubia64.efi ;;
-               *)
-                   efi_file=grub.efi ;;
-           esac
-          # TODO: We should also use efibootmgr, if available, to add a Boot
-          # entry for ourselves.
-       fi
-       efidir="$efidir/EFI/$efi_distributor"
-       mkdir -p "$efidir" || exit 1
-    else
-        # We don't know what's going on.  Fall back to traditional
-        # (non-specification-compliant) behaviour.
-       efidir="$grubdir"
-       efi_distributor=
-       efi_file=grub.efi
-    fi
     cp ${grubdir}/core.${imgext} ${efidir}/${efi_file}
+
     # Try to make this image bootable using the EFI Boot Manager, if available.
     if test "$removable" = no && test -n "$efi_distributor" && \
        test -n "$efibootmgr"; then
@@ -619,7 +623,6 @@ elif [ x"$platform" = xefi ]; then
                -L "$GRUB_DISTRIBUTOR" -l "\\EFI\\$efi_distributor\\$efi_file"
        fi
     fi
-
 fi
 
 echo "Installation finished. No error reported."

Thanks,

-- 
Colin Watson                                       address@hidden



reply via email to

[Prev in Thread] Current Thread [Next in Thread]