Subject: [bug#71348] [PATCH 2/2] gnu: grub: Remove input labels and use gexps.

From: Ludovic Courtès <[email-masked]>
Date: Mon, 3 Jun 2024 22:01:23 +0200

* gnu/packages/bootloaders.scm (grub)[arguments]: Use gexps.
[inputs, native-inputs]: Remove labels.
(grub-minimal, grub-coreboot, grub-efi, grub-efi32)
(grub-hybrid): Likewise.

Change-Id: I2773e6d96d170fae991d9c5db9e10196ea603371
---
 gnu/packages/bootloaders.scm | 512 +++++++++++++++++------------------
 1 file changed, 254 insertions(+), 258 deletions(-)

diff --git a/gnu/packages/bootloaders.scm b/gnu/packages/bootloaders.scm
index 4e932ee3288..503c7d4a194 100644
--- a/gnu/packages/bootloaders.scm
+++ b/gnu/packages/bootloaders.scm
@@ -128,140 +128,140 @@ (define-public grub
                      (("exit 99") "exit 77"))))))
     (build-system gnu-build-system)
     (arguments
-     `(#:configure-flags
-       ;; Counterintuitively, this *disables* a spurious Python dependency by
-       ;; calling the ‘true’ binary instead.  Python is only needed during
-       ;; bootstrapping (for genptl.py), not when building from a release.
-       (list "PYTHON=true")
-       ;; Grub fails to load modules stripped with --strip-unneeded.
-       #:strip-flags '("--strip-debug" "--enable-deterministic-archives")
-       #:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'patch-stuff
-           (lambda* (#:key native-inputs inputs #:allow-other-keys)
-             (substitute* "grub-core/Makefile.in"
-               (("/bin/sh") (which "sh")))
+     (list #:configure-flags
+           ;; Counterintuitively, this *disables* a spurious Python dependency by
+           ;; calling the ‘true’ binary instead.  Python is only needed during
+           ;; bootstrapping (for genptl.py), not when building from a release.
+           #~(list "PYTHON=true")
 
-             ;; Give the absolute file name of 'mdadm', used to determine the
-             ;; root file system when it's a RAID device.  Failing to do that,
-             ;; 'grub-probe' silently fails if 'mdadm' is not in $PATH.
-             (when (assoc-ref inputs "mdadm")
-               (substitute* "grub-core/osdep/linux/getroot.c"
-                 (("argv\\[0\\] = \"mdadm\"")
-                  (string-append "argv[0] = \""
-                                 (assoc-ref inputs "mdadm")
-                                 "/sbin/mdadm\""))))
+           ;; GRUB fails to load modules stripped with --strip-unneeded.
+           #:strip-flags
+           #~(list "--strip-debug" "--enable-deterministic-archives")
 
-             ;; Make the font visible.
-             (copy-file (assoc-ref (or native-inputs inputs)
-                                   "unifont")
-                        "unifont.bdf.gz")
-             (system* "gunzip" "unifont.bdf.gz")
+           #:phases
+           #~(modify-phases %standard-phases
+               (add-after 'unpack 'patch-stuff
+                 (lambda* (#:key native-inputs inputs #:allow-other-keys)
+                   (substitute* "grub-core/Makefile.in"
+                     (("/bin/sh") (which "sh")))
 
-             ;; Give the absolute file name of 'ckbcomp'.
-             (substitute* "util/grub-kbdcomp.in"
-               (("^ckbcomp ")
-                (string-append
-                 (search-input-file inputs "/bin/ckbcomp")
-                 " ")))))
-         (add-after 'unpack 'set-freetype-variables
-           ;; These variables need to be set to the native versions of the
-           ;; dependencies because they are used to build programs which are
-           ;; executed during build time.
-           (lambda* (#:key native-inputs #:allow-other-keys)
-             (when (assoc-ref native-inputs "freetype")
-               (let ((freetype (assoc-ref native-inputs "freetype")))
-                 (setenv "BUILD_FREETYPE_LIBS"
-                         (string-append "-L" freetype
-                                        "/lib -lfreetype"))
-                 (setenv "BUILD_FREETYPE_CFLAGS"
-                         (string-append "-I" freetype
-                                        "/include/freetype2"))))))
-         (add-before 'check 'disable-flaky-test
-           (lambda _
-             ;; This test is unreliable. For more information, see:
-             ;; <https://bugs.gnu.org/26936>.
-             (substitute* "Makefile.in"
-               (("grub_cmd_date grub_cmd_set_date grub_cmd_sleep")
-                "grub_cmd_date grub_cmd_sleep"))))
-         (add-before 'check 'disable-pixel-perfect-test
-           (lambda _
-             ;; This test compares many screenshots rendered with an older
-             ;; Unifont (9.0.06) than that packaged in Guix.
-             (substitute* "Makefile.in"
-               (("test_unset grub_func_test")
-                "test_unset")))))
-       ;; Disable tests on ARM and AARCH64 platforms or when cross-compiling.
-       #:tests? ,(not (or (any (cute string-prefix? <> (or (%current-target-system)
-                                                           (%current-system)))
-                               '("arm" "aarch64"))
-                          (%current-target-system)))))
+                   ;; Give the absolute file name of 'mdadm', used to determine the
+                   ;; root file system when it's a RAID device.  Failing to do that,
+                   ;; 'grub-probe' silently fails if 'mdadm' is not in $PATH.
+                   (let ((mdadm (false-if-exception
+                                 (search-input-file inputs "/sbin/mdadm"))))
+                     (when mdadm
+                       (substitute* "grub-core/osdep/linux/getroot.c"
+                         (("argv\\[0\\] = \"mdadm\"")
+                          (string-append "argv[0] = \"" mdadm "/sbin/mdadm\"")))))
+
+                   ;; Make the font visible.
+                   (copy-file #+unifont "unifont.bdf.gz")
+                   (system* "gunzip" "unifont.bdf.gz")
+
+                   ;; Give the absolute file name of 'ckbcomp'.
+                   (substitute* "util/grub-kbdcomp.in"
+                     (("^ckbcomp ")
+                      (string-append
+                       (search-input-file inputs "/bin/ckbcomp")
+                       " ")))))
+               (add-after 'unpack 'set-freetype-variables
+                 ;; These variables need to be set to the native versions of the
+                 ;; dependencies because they are used to build programs which are
+                 ;; executed during build time.
+                 (lambda* (#:key native-inputs #:allow-other-keys)
+                   (when (assoc-ref native-inputs "freetype")
+                     (let ((freetype (assoc-ref native-inputs "freetype")))
+                       (setenv "BUILD_FREETYPE_LIBS"
+                               (string-append "-L" freetype
+                                              "/lib -lfreetype"))
+                       (setenv "BUILD_FREETYPE_CFLAGS"
+                               (string-append "-I" freetype
+                                              "/include/freetype2"))))))
+               (add-before 'check 'disable-flaky-test
+                 (lambda _
+                   ;; This test is unreliable. For more information, see:
+                   ;; <https://bugs.gnu.org/26936>.
+                   (substitute* "Makefile.in"
+                     (("grub_cmd_date grub_cmd_set_date grub_cmd_sleep")
+                      "grub_cmd_date grub_cmd_sleep"))))
+               (add-before 'check 'disable-pixel-perfect-test
+                 (lambda _
+                   ;; This test compares many screenshots rendered with an older
+                   ;; Unifont (9.0.06) than that packaged in Guix.
+                   (substitute* "Makefile.in"
+                     (("test_unset grub_func_test")
+                      "test_unset")))))
+
+           ;; Disable tests on ARM and AARCH64 platforms or when cross-compiling.
+           #:tests? (not (or (any (cute string-prefix? <> (%current-system))
+                                  '("arm" "aarch64"))
+                             (%current-target-system)))))
     (inputs
-     `(("gettext" ,gettext-minimal)
+     (append (list gettext-minimal freetype ncurses
 
-       ;; Depend on LVM2 for libdevmapper, used by 'grub-probe' and
-       ;; 'grub-install' to recognize mapped devices (LUKS, etc.)
-       ,@(if (member (or (%current-target-system)
-                         (%current-system))
-                     (package-supported-systems lvm2))
-             `(("lvm2" ,lvm2))
-             '())
+                   ;; Console-setup's ckbcomp is invoked by grub-kbdcomp.  It
+                   ;; is required for generating alternative keyboard layouts.
+                   console-setup)
 
-       ;; Depend on mdadm, which is invoked by 'grub-probe' and 'grub-install'
-       ;; to determine whether the root file system is RAID.
-       ,@(if (member (or (%current-target-system)
-                         (%current-system))
-                     (package-supported-systems mdadm))
-             `(("mdadm" ,mdadm))
-             '())
+             ;; Depend on LVM2 for libdevmapper, used by 'grub-probe' and
+             ;; 'grub-install' to recognize mapped devices (LUKS, etc.)
+             (if (member (or (%current-target-system)
+                               (%current-system))
+                           (package-supported-systems lvm2))
+                 (list lvm2)
+                 '())
 
-       ;; Console-setup's ckbcomp is invoked by grub-kbdcomp.  It is required
-       ;; for generating alternative keyboard layouts.
-       ("console-setup" ,console-setup)
+             ;; Depend on mdadm, which is invoked by 'grub-probe' and
+             ;; 'grub-install' to determine whether the root file system is
+             ;; RAID.
+             (if (member (or (%current-target-system)
+                             (%current-system))
+                         (package-supported-systems mdadm))
+                 (list mdadm)
+                 '())
 
-       ;; Needed for ‘grub-mount’, the only reliable way to tell whether a given
-       ;; file system will be readable by GRUB without rebooting.
-       ,@(if (member (or (%current-target-system)
-                         (%current-system))
-                     (package-supported-systems fuse-2))
-             `(("fuse" ,fuse-2))
-             '())
-
-       ("freetype" ,freetype)
-       ;; ("libusb" ,libusb)
-       ("ncurses" ,ncurses)))
+             ;; Needed for ‘grub-mount’, the only reliable way to tell whether
+             ;; a given file system will be readable by GRUB without
+             ;; rebooting.
+             (if (member (or (%current-target-system)
+                             (%current-system))
+                           (package-supported-systems fuse-2))
+                 (list fuse-2)
+                 '())))
     (native-inputs
-     `(("pkg-config" ,pkg-config)
-       ("unifont" ,unifont)
-       ("bison" ,bison)
-       ("flex" ,flex)
-       ("texinfo" ,texinfo)
-       ("help2man" ,help2man)
-       ("freetype" ,freetype)     ;native version needed for build-grub-mkfont
+     (append (list pkg-config
+                   bison
+                   flex
+                   texinfo
+                   help2man
+                   freetype       ;native version needed for build-grub-mkfont
 
-       ;; XXX: When building GRUB 2.02 on 32-bit x86, we need a binutils
-       ;; capable of assembling 64-bit instructions.  However, our default
-       ;; binutils on 32-bit x86 is not 64-bit capable.
-       ,@(if (string-match "^i[3456]86-" (%current-system))
-             (let ((binutils (package/inherit
-                                 binutils
-                               (name "binutils-i386")
-                               (arguments
-                                (substitute-keyword-arguments (package-arguments binutils)
-                                  ((#:configure-flags flags ''())
-                                   `(cons "--enable-64-bit-bfd" ,flags)))))))
-               `(("ld-wrapper" ,(make-ld-wrapper "ld-wrapper-i386"
-                                                 #:binutils binutils))
-                 ("binutils" ,binutils)))
-             '())
+                   ;; Dependencies of the test suite.
+                   parted
+                   xorriso)
 
-       ;; Dependencies for the test suite.  The "real" QEMU is needed here,
-       ;; because several targets are used.
-       ("parted" ,parted)
-       ,@(if (member (%current-system) (package-supported-systems qemu-minimal))
-             `(("qemu" ,qemu-minimal))
-             '())
-       ("xorriso" ,xorriso)))
+             ;; For the test suite, the "real" QEMU is needed because several
+             ;; targets are used.
+             (if (member (%current-system) (package-supported-systems qemu-minimal))
+                 (list qemu-minimal)
+                 '())
+
+             ;; XXX: When building GRUB 2.02 on 32-bit x86, we need a binutils
+             ;; capable of assembling 64-bit instructions.  However, our default
+             ;; binutils on 32-bit x86 is not 64-bit capable.
+             (if (string-match "^i[3456]86-" (%current-system))
+                 (let ((binutils (package/inherit
+                                     binutils
+                                   (name "binutils-i386")
+                                   (arguments
+                                    (substitute-keyword-arguments (package-arguments binutils)
+                                      ((#:configure-flags flags ''())
+                                       `(cons "--enable-64-bit-bfd" ,flags)))))))
+                   (list (make-ld-wrapper "ld-wrapper-i386"
+                                          #:binutils binutils)
+                         binutils))
+                 '())))
     (home-page "https://www.gnu.org/software/grub/")
     (synopsis "GRand Unified Boot loader")
     (description
@@ -286,24 +286,21 @@ (define-public grub-minimal
        (delete "help2man" "texinfo" "parted" "qemu" "xorriso")))
     (arguments
      (substitute-keyword-arguments (package-arguments grub)
-       ((#:configure-flags _ ''())
-        '(list "PYTHON=true"))
+       ((#:configure-flags _ #~'())
+        #~(list "PYTHON=true"))
        ((#:tests? _ #t)
         #f)
-       ((#:phases phases '%standard-phases)
-        `(modify-phases ,phases
-           (replace 'patch-stuff
-             (lambda* (#:key native-inputs inputs #:allow-other-keys)
-               (substitute* "grub-core/Makefile.in"
-                 (("/bin/sh") (which "sh")))
+       ((#:phases phases #~%standard-phases)
+        #~(modify-phases #$phases
+            (replace 'patch-stuff
+              (lambda* (#:key native-inputs inputs #:allow-other-keys)
+                (substitute* "grub-core/Makefile.in"
+                  (("/bin/sh")
+                   (which "sh")))
 
-               ;; Make the font visible.
-               (copy-file (assoc-ref (or native-inputs inputs)
-                                     "unifont")
-                          "unifont.bdf.gz")
-               (system* "gunzip" "unifont.bdf.gz")
-
-               #t))))))))
+                ;; Make the font visible.
+                (copy-file #+unifont "unifont.bdf.gz")
+                (system* "gunzip" "unifont.bdf.gz")))))))))
 
 (define-public grub-coreboot
   (package
@@ -311,66 +308,62 @@ (define-public grub-coreboot
     (name "grub-coreboot")
     (synopsis "GRand Unified Boot loader (Coreboot payload version)")
     (arguments
-     `(,@(substitute-keyword-arguments (package-arguments grub)
-           ((#:phases phases '%standard-phases)
-            `(modify-phases ,phases
-               (add-before 'check 'disable-broken-tests
-                 (lambda _
-                   (setenv "DISABLE_HARD_ERRORS" "1")
-                   (setenv
-                    "XFAIL_TESTS"
-                    (string-join
-                     ;; TODO: All the tests below use grub shell
-                     ;; (tests/util/grub-shell.in), and here grub-shell uses
-                     ;; QEMU and a Coreboot image to run the tests. Since we
-                     ;; don't have a Coreboot package in Guix yet these tests
-                     ;; are disabled. See the Guix bug #64667 for more details
-                     ;; (https://debbugs.gnu.org/cgi/bugreport.cgi?bug=64667).
-                     (list
-                      "pata_test"
-                      "ahci_test"
-                      "uhci_test"
-                      "ehci_test"
-                      "example_grub_script_test"
-                      "ohci_test"
-                      "grub_script_eval"
-                      "grub_script_echo1"
-                      "grub_script_test"
-                      "grub_script_leading_whitespace"
-                      "grub_script_echo_keywords"
-                      "grub_script_vars1"
-                      "grub_script_for1"
-                      "grub_script_while1"
-                      "grub_script_if"
-                      "grub_script_comments"
-                      "grub_script_functions"
-                      "grub_script_continue"
-                      "grub_script_break"
-                      "grub_script_shift"
-                      "grub_script_blockarg"
-                      "grub_script_return"
-                      "grub_script_setparams"
-                      "grub_cmd_date"
-                      "grub_cmd_set_date"
-                      "grub_cmd_sleep"
-                      "grub_cmd_regexp"
-                      "grub_cmd_test"
-                      "grub_script_not"
-                      "grub_cmd_echo"
-                      "grub_script_expansion"
-                      "grub_script_gettext"
-                      "grub_script_escape_comma"
-                      "help_test"
-                      "grub_script_strcmp"
-                      "test_sha512sum"
-                      "grub_cmd_tr"
-                      "test_unset"
-                      "file_filter_test")
-                     " "))))))
-           ((#:configure-flags flags
-             ''())
-            `(cons* "--with-platform=coreboot"
-                    ,flags)))))))
+     (substitute-keyword-arguments (package-arguments grub)
+       ((#:phases phases #~%standard-phases)
+        #~(modify-phases #$phases
+            (add-before 'check 'disable-broken-tests
+              (lambda _
+                (setenv "DISABLE_HARD_ERRORS" "1")
+                (setenv "XFAIL_TESTS"
+                        (string-join
+                         ;; TODO: All the tests below use grub shell
+                         ;; (tests/util/grub-shell.in), and here grub-shell uses
+                         ;; QEMU and a Coreboot image to run the tests. Since we
+                         ;; don't have a Coreboot package in Guix yet these tests
+                         ;; are disabled. See the Guix bug #64667 for more details
+                         ;; (https://debbugs.gnu.org/cgi/bugreport.cgi?bug=64667).
+                         (list "pata_test"
+                               "ahci_test"
+                               "uhci_test"
+                               "ehci_test"
+                               "example_grub_script_test"
+                               "ohci_test"
+                               "grub_script_eval"
+                               "grub_script_echo1"
+                               "grub_script_test"
+                               "grub_script_leading_whitespace"
+                               "grub_script_echo_keywords"
+                               "grub_script_vars1"
+                               "grub_script_for1"
+                               "grub_script_while1"
+                               "grub_script_if"
+                               "grub_script_comments"
+                               "grub_script_functions"
+                               "grub_script_continue"
+                               "grub_script_break"
+                               "grub_script_shift"
+                               "grub_script_blockarg"
+                               "grub_script_return"
+                               "grub_script_setparams"
+                               "grub_cmd_date"
+                               "grub_cmd_set_date"
+                               "grub_cmd_sleep"
+                               "grub_cmd_regexp"
+                               "grub_cmd_test"
+                               "grub_script_not"
+                               "grub_cmd_echo"
+                               "grub_script_expansion"
+                               "grub_script_gettext"
+                               "grub_script_escape_comma"
+                               "help_test"
+                               "grub_script_strcmp"
+                               "test_sha512sum"
+                               "grub_cmd_tr"
+                               "test_unset"
+                               "file_filter_test")
+                         " "))))))
+       ((#:configure-flags flags #~'())
+        #~(cons* "--with-platform=coreboot" #$flags))))))
 
 (define-public grub-efi
   (package
@@ -385,39 +378,38 @@ (define-public grub-efi
      (modify-inputs (package-native-inputs grub)
        (delete "parted" "qemu" "xorriso")))
     (arguments
-     `(;; TODO: Tests need a UEFI firmware for qemu. There is one at
-       ;; https://github.com/tianocore/edk2/tree/master/OvmfPkg .
-       ;; Search for 'OVMF' in "tests/util/grub-shell.in".
-       ,@(substitute-keyword-arguments (package-arguments grub)
-           ((#:tests? _ #f) #f)
-           ((#:configure-flags flags ''())
-            `(cons* "--with-platform=efi"
-                    ,@(if (string-prefix? "x86_64"
-                                          (or (%current-target-system)
-                                              (%current-system)))
-                          '("--enable-stack-protector") ; EFI-only for now
-                          '())
-                    ,flags))
-           ((#:phases phases)
-            `(modify-phases ,phases
-               (add-after 'patch-stuff 'use-absolute-efibootmgr-path
-                 (lambda* (#:key inputs #:allow-other-keys)
-                   (substitute* "grub-core/osdep/unix/platform.c"
-                     (("efibootmgr")
-                      (search-input-file inputs
-                                         "/sbin/efibootmgr")))))
-               (add-after 'patch-stuff 'use-absolute-mtools-path
-                 (lambda* (#:key inputs #:allow-other-keys)
-                   (let ((mtools (assoc-ref inputs "mtools")))
-                     (substitute* "util/grub-mkrescue.c"
-                       (("\"mformat\"")
-                        (string-append "\"" mtools
-                                       "/bin/mformat\"")))
-                     (substitute* "util/grub-mkrescue.c"
-                       (("\"mcopy\"")
-                        (string-append "\"" mtools
-                                       "/bin/mcopy\"")))
-                     #t))))))))))
+     ;; TODO: Tests need a UEFI firmware for qemu. There is one at
+     ;; https://github.com/tianocore/edk2/tree/master/OvmfPkg .
+     ;; Search for 'OVMF' in "tests/util/grub-shell.in".
+     (substitute-keyword-arguments (package-arguments grub)
+       ((#:tests? _ #f) #f)
+       ((#:configure-flags flags #~'())
+        #~(cons* "--with-platform=efi"
+                 #$@(if (string-prefix? "x86_64"
+                                        (or (%current-target-system)
+                                            (%current-system)))
+                        #~("--enable-stack-protector") ;EFI-only for now
+                        #~())
+                 #$flags))
+       ((#:phases phases)
+        #~(modify-phases #$phases
+            (add-after 'patch-stuff 'use-absolute-efibootmgr-path
+              (lambda* (#:key inputs #:allow-other-keys)
+                (substitute* "grub-core/osdep/unix/platform.c"
+                  (("efibootmgr")
+                   (search-input-file inputs "/sbin/efibootmgr")))))
+            (add-after 'patch-stuff 'use-absolute-mtools-path
+              (lambda* (#:key inputs #:allow-other-keys)
+                (substitute* "util/grub-mkrescue.c"
+                  (("\"mformat\"")
+                   (string-append "\""
+                                  (search-input-file inputs "/bin/mformat")
+                                  "\"")))
+                (substitute* "util/grub-mkrescue.c"
+                  (("\"mcopy\"")
+                   (string-append "\""
+                                  (search-input-file inputs "/bin/mcopy")
+                                  "\"")))))))))))
 
 (define-public grub-efi32
   (package
@@ -425,17 +417,19 @@ (define-public grub-efi32
     (name "grub-efi32")
     (synopsis "GRand Unified Boot loader (UEFI 32bit version)")
     (arguments
-     `(,@(substitute-keyword-arguments (package-arguments grub-efi)
-           ((#:configure-flags flags ''())
-            `(cons*
-              ,@(cond ((target-x86?) '("--target=i386"))
-                      ((target-aarch64?)
-                       (list "--target=arm"
-                             (string-append "TARGET_CC="
-                                            (cc-for-target "arm-linux-gnueabihf"))))
-                      ((target-arm?) '("--target=arm"))
-                      (else '()))
-              ,flags)))))
+     (substitute-keyword-arguments (package-arguments grub-efi)
+       ((#:configure-flags flags #~'())
+        #~(cons* #$@(cond ((target-x86?)
+                           #~("--target=i386"))
+                          ((target-aarch64?)
+                           #~("--target=arm"
+                              (string-append "TARGET_CC="
+                                             #$(cc-for-target
+                                                "arm-linux-gnueabihf"))))
+                          ((target-arm?)
+                           #~("--target=arm"))
+                          (else #~()))
+                 #$flags))))
     (native-inputs
      (if (target-aarch64?)
          (modify-inputs (package-native-inputs grub-efi)
@@ -459,24 +453,26 @@ (define-public grub-hybrid
        (prepend grub)))
     (arguments
      (substitute-keyword-arguments (package-arguments grub-efi)
-       ((#:modules modules `((guix build utils) (guix build gnu-build-system)))
+       ((#:modules modules `((guix build utils)
+                             (guix build gnu-build-system)))
         `((ice-9 ftw) ,@modules))
        ((#:phases phases)
-        `(modify-phases ,phases
-           (add-after 'install 'install-non-efi
-             (lambda* (#:key inputs outputs #:allow-other-keys)
-               (let ((input-dir (search-input-directory inputs
-                                                        "/lib/grub"))
-                     (output-dir (string-append (assoc-ref outputs "out")
-                                                "/lib/grub")))
-                 (for-each
-                  (lambda (basename)
-                    (if (not (or (string-prefix? "." basename)
-                                 (file-exists? (string-append output-dir "/" basename))))
-                        (symlink (string-append input-dir "/" basename)
-                                 (string-append output-dir "/" basename))))
-                  (scandir input-dir))
-                 #t)))))))))
+        #~(modify-phases #$phases
+            (add-after 'install 'install-non-efi
+              (lambda* (#:key inputs outputs #:allow-other-keys)
+                (let ((input-dir (search-input-directory inputs "/lib/grub"))
+                      (output-dir (string-append (assoc-ref outputs "out")
+                                                 "/lib/grub")))
+                  (for-each (lambda (basename)
+                              (unless (or (string-prefix? "." basename)
+                                          (file-exists? (string-append
+                                                         output-dir "/"
+                                                         basename)))
+                                (symlink (string-append input-dir "/"
+                                                        basename)
+                                         (string-append output-dir "/"
+                                                        basename))))
+                            (scandir input-dir)))))))))))
 
 (define-public (make-grub-efi-netboot name subdir)
   "Make a grub-efi-netboot package named NAME, which will be able to boot over
-- 
2.45.1