summary refs log tree commit diff
path: root/gnu/system/grub.scm
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/system/grub.scm')
-rw-r--r--gnu/system/grub.scm16
1 files changed, 13 insertions, 3 deletions
diff --git a/gnu/system/grub.scm b/gnu/system/grub.scm
index e789e4c591..85a9fca9ff 100644
--- a/gnu/system/grub.scm
+++ b/gnu/system/grub.scm
@@ -63,9 +63,12 @@
   (initrd          menu-entry-initrd))     ; file name of the initrd as a gexp
 
 (define* (grub-configuration-file config entries
-                                  #:key (system (%current-system)))
+                                  #:key
+                                  (system (%current-system))
+                                  (old-entries '()))
   "Return the GRUB configuration file corresponding to CONFIG, a
-<grub-configuration> object."
+<grub-configuration> object.  OLD-ENTRIES is taken to be a list of menu
+entries corresponding to old generations of the system."
   (define all-entries
     (append entries (grub-configuration-menu-entries config)))
 
@@ -93,7 +96,14 @@ search.file ~a/bzImage~%"
                           (($ <menu-entry> _ linux)
                            linux))
                          all-entries))
-          #$@(map entry->gexp all-entries))))
+          #$@(map entry->gexp all-entries)
+
+          #$@(if (pair? old-entries)
+                 #~((format port "
+submenu \"GNU system, old configurations...\" {~%")
+                    #$@(map entry->gexp old-entries)
+                    (format port "}~%"))
+                 #~()))))
 
   (gexp->derivation "grub.cfg" builder))