diff options
| author | Mathieu Othacehe <m.othacehe@gmail.com> | 2017-12-05 12:59:15 +0100 |
|---|---|---|
| committer | Mathieu Othacehe <m.othacehe@gmail.com> | 2017-12-15 11:52:38 +0100 |
| commit | e22482038611a53a9d2b25df20363664cd91be2e (patch) | |
| tree | da53181cdbbe40b8035fdc577b0767e8055c9681 /gnu | |
| parent | acf54bca225b63f5b06e335a55045421c47bbd09 (diff) | |
bootloader: Factorize write-file-on-device.
* gnu/bootloader/extlinux.scm (install-extlinux): Factorize bootloader
writing in a new procedure write-file-on-device defined in (gnu build
bootloader).
* gnu/build/bootloader.scm: New file.
* gnu/local.mk (GNU_SYSTEM_MODULES): Add new file.
* gnu/system/vm.scm (qemu-img): Adapt to import and use (gnu build bootloader)
module during derivation building.
* gnu/scripts/system.scm (bootloader-installer-derivation): Ditto.
Diffstat (limited to 'gnu')
| -rw-r--r-- | gnu/bootloader/extlinux.scm | 10 | ||||
| -rw-r--r-- | gnu/build/bootloader.scm | 37 | ||||
| -rw-r--r-- | gnu/local.mk | 1 | ||||
| -rw-r--r-- | gnu/system/vm.scm | 6 |
4 files changed, 45 insertions, 9 deletions
diff --git a/gnu/bootloader/extlinux.scm b/gnu/bootloader/extlinux.scm index 9b6e2c7f2a2..f7820a37a48 100644 --- a/gnu/bootloader/extlinux.scm +++ b/gnu/bootloader/extlinux.scm | |||
| @@ -20,6 +20,7 @@ | |||
| 20 | (define-module (gnu bootloader extlinux) | 20 | (define-module (gnu bootloader extlinux) |
| 21 | #:use-module (gnu bootloader) | 21 | #:use-module (gnu bootloader) |
| 22 | #:use-module (gnu system) | 22 | #:use-module (gnu system) |
| 23 | #:use-module (gnu build bootloader) | ||
| 23 | #:use-module (gnu packages bootloaders) | 24 | #:use-module (gnu packages bootloaders) |
| 24 | #:use-module (guix gexp) | 25 | #:use-module (guix gexp) |
| 25 | #:use-module (guix monads) | 26 | #:use-module (guix monads) |
| @@ -95,13 +96,8 @@ TIMEOUT ~a~%" | |||
| 95 | (find-files syslinux-dir "\\.c32$")) | 96 | (find-files syslinux-dir "\\.c32$")) |
| 96 | (unless | 97 | (unless |
| 97 | (and (zero? (system* extlinux "--install" install-dir)) | 98 | (and (zero? (system* extlinux "--install" install-dir)) |
| 98 | (call-with-input-file (string-append syslinux-dir "/" #$mbr) | 99 | (write-file-on-device |
| 99 | (lambda (input) | 100 | (string-append syslinux-dir "/" #$mbr) 440 device 0)) |
| 100 | (let ((bv (get-bytevector-n input 440))) | ||
| 101 | (call-with-output-file device | ||
| 102 | (lambda (output) | ||
| 103 | (put-bytevector output bv)) | ||
| 104 | #:binary #t))))) | ||
| 105 | (error "failed to install SYSLINUX"))))) | 101 | (error "failed to install SYSLINUX"))))) |
| 106 | 102 | ||
| 107 | (define install-extlinux-mbr | 103 | (define install-extlinux-mbr |
diff --git a/gnu/build/bootloader.scm b/gnu/build/bootloader.scm new file mode 100644 index 00000000000..d00674dd40f --- /dev/null +++ b/gnu/build/bootloader.scm | |||
| @@ -0,0 +1,37 @@ | |||
| 1 | ;;; GNU Guix --- Functional package management for GNU | ||
| 2 | ;;; Copyright © 2017 Mathieu Othacehe <m.othacehe@gmail.com> | ||
| 3 | ;;; | ||
| 4 | ;;; This file is part of GNU Guix. | ||
| 5 | ;;; | ||
| 6 | ;;; GNU Guix is free software; you can redistribute it and/or modify it | ||
| 7 | ;;; under the terms of the GNU General Public License as published by | ||
| 8 | ;;; the Free Software Foundation; either version 3 of the License, or (at | ||
| 9 | ;;; your option) any later version. | ||
| 10 | ;;; | ||
| 11 | ;;; GNU Guix is distributed in the hope that it will be useful, but | ||
| 12 | ;;; WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 13 | ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 14 | ;;; GNU General Public License for more details. | ||
| 15 | ;;; | ||
| 16 | ;;; You should have received a copy of the GNU General Public License | ||
| 17 | ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. | ||
| 18 | |||
| 19 | (define-module (gnu build bootloader) | ||
| 20 | #:use-module (ice-9 binary-ports) | ||
| 21 | #:export (write-file-on-device)) | ||
| 22 | |||
| 23 | |||
| 24 | ;;; | ||
| 25 | ;;; Writing utils. | ||
| 26 | ;;; | ||
| 27 | |||
| 28 | (define (write-file-on-device file size device offset) | ||
| 29 | "Write SIZE bytes from FILE to DEVICE starting at OFFSET." | ||
| 30 | (call-with-input-file file | ||
| 31 | (lambda (input) | ||
| 32 | (let ((bv (get-bytevector-n input size))) | ||
| 33 | (call-with-output-file device | ||
| 34 | (lambda (output) | ||
| 35 | (seek output offset SEEK_SET) | ||
| 36 | (put-bytevector output bv)) | ||
| 37 | #:binary #t))))) | ||
diff --git a/gnu/local.mk b/gnu/local.mk index f6b29a7155a..c87af5a17b8 100644 --- a/gnu/local.mk +++ b/gnu/local.mk | |||
| @@ -489,6 +489,7 @@ GNU_SYSTEM_MODULES = \ | |||
| 489 | %D%/system/vm.scm \ | 489 | %D%/system/vm.scm \ |
| 490 | \ | 490 | \ |
| 491 | %D%/build/activation.scm \ | 491 | %D%/build/activation.scm \ |
| 492 | %D%/build/bootloader.scm \ | ||
| 492 | %D%/build/cross-toolchain.scm \ | 493 | %D%/build/cross-toolchain.scm \ |
| 493 | %D%/build/file-systems.scm \ | 494 | %D%/build/file-systems.scm \ |
| 494 | %D%/build/install.scm \ | 495 | %D%/build/install.scm \ |
diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm index b376337c8d5..6102d465b83 100644 --- a/gnu/system/vm.scm +++ b/gnu/system/vm.scm | |||
| @@ -277,10 +277,12 @@ register INPUTS in the store database of the image so that Guix can be used in | |||
| 277 | the image." | 277 | the image." |
| 278 | (expression->derivation-in-linux-vm | 278 | (expression->derivation-in-linux-vm |
| 279 | name | 279 | name |
| 280 | (with-imported-modules (source-module-closure '((gnu build vm) | 280 | (with-imported-modules (source-module-closure '((gnu build bootloader) |
| 281 | (gnu build vm) | ||
| 281 | (guix build utils))) | 282 | (guix build utils))) |
| 282 | #~(begin | 283 | #~(begin |
| 283 | (use-modules (gnu build vm) | 284 | (use-modules (gnu build bootloader) |
| 285 | (gnu build vm) | ||
| 284 | (guix build utils) | 286 | (guix build utils) |
| 285 | (srfi srfi-26) | 287 | (srfi srfi-26) |
| 286 | (ice-9 binary-ports)) | 288 | (ice-9 binary-ports)) |
