summary refs log tree commit diff
path: root/pkgs/tools/misc/grub
diff options
context:
space:
mode:
authorLluís Batlle i Rossell <viric@vicerveza.homeunix.net>2011-04-09 09:25:06 +0000
committerLluís Batlle i Rossell <viric@vicerveza.homeunix.net>2011-04-09 09:25:06 +0000
commit240801542afac4fde83f8669cf20ae15e917a24c (patch)
tree95969e3e89fa610333dc8b78fe36c88f1c95f252 /pkgs/tools/misc/grub
parente756ff25d3eeb5a09f3bdf745484e6a52b6cc8ac (diff)
downloadnixlib-240801542afac4fde83f8669cf20ae15e917a24c.tar
nixlib-240801542afac4fde83f8669cf20ae15e917a24c.tar.gz
nixlib-240801542afac4fde83f8669cf20ae15e917a24c.tar.bz2
nixlib-240801542afac4fde83f8669cf20ae15e917a24c.tar.lz
nixlib-240801542afac4fde83f8669cf20ae15e917a24c.tar.xz
nixlib-240801542afac4fde83f8669cf20ae15e917a24c.tar.zst
nixlib-240801542afac4fde83f8669cf20ae15e917a24c.zip
Restoring grub 1.98 from svn, and adding it as a package apart. This allows
easy using package overrides in nixos to use grub 1.98.

I found 1.98 can boot from /dev/md* devices, while 1.99rc1 cannot due to some
upstream problem. Once it works, we can remove this 1.98 again.


svn path=/nixpkgs/trunk/; revision=26761
Diffstat (limited to 'pkgs/tools/misc/grub')
-rw-r--r--pkgs/tools/misc/grub/1.98.nix79
-rw-r--r--pkgs/tools/misc/grub/device-mapper-symlinks.patch28
2 files changed, 107 insertions, 0 deletions
diff --git a/pkgs/tools/misc/grub/1.98.nix b/pkgs/tools/misc/grub/1.98.nix
new file mode 100644
index 000000000000..df7d3408b619
--- /dev/null
+++ b/pkgs/tools/misc/grub/1.98.nix
@@ -0,0 +1,79 @@
+{ fetchurl, stdenv, bison, gettext, ncurses, libusb, freetype, qemu }:
+
+let unifont_bdf = fetchurl {
+      url = "http://unifoundry.com/unifont-5.1.20080820.bdf.gz";
+      sha256 = "0s0qfff6n6282q28nwwblp5x295zd6n71kl43xj40vgvdqxv0fxx";
+    };
+in
+
+stdenv.mkDerivation rec {
+  name = "grub-1.98";
+
+  src = fetchurl {
+    url = "ftp://alpha.gnu.org/gnu/grub/${name}.tar.gz";
+    sha256 = "05660x82y2rwrzm0d1c4z07fbh02qwmacsmbbav6fa855s4w3wmy";
+  };
+
+  buildInputs = [ bison ncurses libusb freetype gettext ]
+    ++ stdenv.lib.optional doCheck qemu;
+
+  preConfigure =
+    '' for i in "tests/util/"*.in
+       do
+         sed -i "$i" -e's|/bin/bash|/bin/sh|g'
+       done
+
+       # Apparently, the QEMU executable is no longer called
+       # `qemu-system-i386', even on i386.
+       #
+       # In addition, use `-nodefaults' to avoid errors like:
+       #
+       #  chardev: opening backend "stdio" failed
+       #  qemu: could not open serial device 'stdio': Invalid argument
+       #
+       # See <http://www.mail-archive.com/qemu-devel@nongnu.org/msg22775.html>.
+       sed -i "tests/util/grub-shell.in" \
+           -e's/qemu-system-i386/qemu-system-x86_64 -nodefaults/g'
+    '';
+
+  patches =
+    [ # The udev rules for LVM create symlinks in /dev/mapper rathe
+      # than device nodes, causing GRUB to fail to recognize LVM
+      # volumes. See
+      # http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=550704
+      # This ugly workaround makes `find_root_device' use stat() on
+      # files in /dev/mapper instead of lstat().
+      ./device-mapper-symlinks.patch
+    ];
+
+  postPatch =
+    '' gunzip < "${unifont_bdf}" > "unifont.bdf"
+       sed -i "configure" \
+           -e "s|/usr/src/unifont.bdf|$PWD/unifont.bdf|g"
+    '';
+
+  doCheck = true;
+
+  meta = {
+    description = "GNU GRUB, the Grand Unified Boot Loader (2.x alpha)";
+
+    longDescription =
+      '' GNU GRUB is a Multiboot boot loader. It was derived from GRUB, GRand
+         Unified Bootloader, which was originally designed and implemented by
+         Erich Stefan Boleyn.
+
+         Briefly, the boot loader is the first software program that runs when a
+         computer starts.  It is responsible for loading and transferring
+         control to the operating system kernel software (such as the Hurd or
+         the Linux).  The kernel, in turn, initializes the rest of the
+         operating system (e.g., GNU).
+      '';
+
+    homepage = http://www.gnu.org/software/grub/;
+
+    license = "GPLv3+";
+
+    maintainers = [ stdenv.lib.maintainers.ludo ];
+    platforms = stdenv.lib.platforms.gnu;
+  };
+}
diff --git a/pkgs/tools/misc/grub/device-mapper-symlinks.patch b/pkgs/tools/misc/grub/device-mapper-symlinks.patch
new file mode 100644
index 000000000000..0a21a51de799
--- /dev/null
+++ b/pkgs/tools/misc/grub/device-mapper-symlinks.patch
@@ -0,0 +1,28 @@
+Only in grub-1.97.1-orig/: grub-1.97.1
+diff -rc -x '*~' grub-1.97.1-orig/util/getroot.c grub-1.97.1/util/getroot.c
+*** grub-1.97.1-orig/util/getroot.c	2009-11-09 16:48:16.000000000 +0100
+--- grub-1.97.1/util/getroot.c	2010-01-08 00:26:12.000000000 +0100
+***************
+*** 217,224 ****
+  	continue;
+  
+        if (S_ISLNK (st.st_mode))
+! 	/* Don't follow symbolic links.  */
+! 	continue;
+  
+        if (S_ISDIR (st.st_mode))
+  	{
+--- 217,229 ----
+  	continue;
+  
+        if (S_ISLNK (st.st_mode))
+!         {
+!           if (strcmp(dir, "mapper") != 0)
+!             /* Don't follow symbolic links.  */
+!             continue;
+!           if (stat (ent->d_name, &st) < 0)
+!             continue;
+!         }
+  
+        if (S_ISDIR (st.st_mode))
+  	{