unofficial mirror of guix-patches@gnu.org 
 help / color / mirror / code / Atom feed
blob e15e7c0828b5d2a0d09a63947df4afb6b60cd9c3 3734 bytes (raw)
name: gnu/build/bootloader.scm 	 # note: path name is non-authoritative(*)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
 
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2017 Mathieu Othacehe <m.othacehe@gmail.com>
;;; Copyright © 2019 Ludovic Courtès <ludo@gnu.org>
;;;
;;; This file is part of GNU Guix.
;;;
;;; GNU Guix 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.
;;;
;;; GNU Guix 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 GNU Guix.  If not, see <http://www.gnu.org/licenses/>.

(define-module (gnu build bootloader)
  #:use-module (guix build utils)
  #:use-module (guix utils)
  #:use-module (ice-9 binary-ports)
  #:use-module (ice-9 format)
  #:export (write-file-on-device
            install-efi-loader))

\f
;;;
;;; Writing utils.
;;;

(define (write-file-on-device file size device offset)
  "Write SIZE bytes from FILE to DEVICE starting at OFFSET."
  (call-with-input-file file
    (lambda (input)
      (let ((bv (get-bytevector-n input size)))
        (call-with-output-file device
          (lambda (output)
            (seek output offset SEEK_SET)
            (put-bytevector output bv))
          #:binary #t)))))

\f
;;;
;;; EFI bootloader.
;;;

(define (install-efi grub grub-config esp)
  "Write a self-contained GRUB EFI loader to the mounted ESP using GRUB-CONFIG."
  (let* ((system %host-type)
         ;; Hard code the output location to a well-known path recognized by
         ;; compliant firmware. See "3.5.1.1 Removable Media Boot Behaviour":
         ;; http://www.uefi.org/sites/default/files/resources/UEFI%20Spec%202_6.pdf
         (grub-mkstandalone (string-append grub "/bin/grub-mkstandalone"))
         (efi-directory (string-append esp "/EFI/BOOT"))
         ;; Map grub target names to boot file names.
         (efi-targets (cond ((string-prefix? "x86_64" system)
                             '("x86_64-efi" . "BOOTX64.EFI"))
                            ((string-prefix? "i686" system)
                             '("i386-efi" . "BOOTIA32.EFI"))
                            ((string-prefix? "armhf" system)
                             '("arm-efi" . "BOOTARM.EFI"))
                            ((string-prefix? "aarch64" system)
                             '("arm64-efi" . "BOOTAA64.EFI")))))
    ;; grub-mkstandalone requires a TMPDIR to prepare the firmware image.
    (setenv "TMPDIR" esp)

    (mkdir-p efi-directory)
    (invoke grub-mkstandalone "-O" (car efi-targets)
            "-o" (string-append efi-directory "/"
                                (cdr efi-targets))
            ;; Graft the configuration file onto the image.
            (string-append "boot/grub/grub.cfg=" grub-config))))

(define (install-efi-loader grub-efi esp)
  ;; Create a tiny configuration file telling the embedded grub
  ;; where to load the real thing.
  ;; XXX This is quite fragile, and can prevent the image from booting
  ;; when there's more than one volume with this label present.
  ;; Reproducible almost-UUIDs could reduce the risk (not eliminate it).
  (let ((grub-config "grub.cfg"))
    (call-with-output-file grub-config
        (lambda (port)
          (format port
                  "insmod part_msdos~@
               search --set=root --label Guix_image~@
               configfile /boot/grub/grub.cfg~%")
          (fsync port)))
    (install-efi grub-efi grub-config esp)
    (delete-file grub-config)))

debug log:

solving e15e7c0828 ...
found e15e7c0828 in https://yhetil.org/guix-patches/20200429084756.25072-3-m.othacehe@gmail.com/
found 9570d6dd18 in https://git.savannah.gnu.org/cgit/guix.git
preparing index
index prepared:
100644 9570d6dd18d42a92607fca68739b2f08dbfcd9b8	gnu/build/bootloader.scm

applying [1/1] https://yhetil.org/guix-patches/20200429084756.25072-3-m.othacehe@gmail.com/
diff --git a/gnu/build/bootloader.scm b/gnu/build/bootloader.scm
index 9570d6dd18..e15e7c0828 100644

Checking patch gnu/build/bootloader.scm...
Applied patch gnu/build/bootloader.scm cleanly.

index at:
100644 e15e7c0828b5d2a0d09a63947df4afb6b60cd9c3	gnu/build/bootloader.scm

(*) Git path names are given by the tree(s) the blob belongs to.
    Blobs themselves have no identifier aside from the hash of its contents.^

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).