linux-initrd: Use (guix cpio) instead of GNU cpio.

* gnu/build/linux-initrd.scm (write-cpio-archive): Remove 'open-pipe*' and
  related calls.  Compute list of files in 'files' variable.  Use
  'cpio:write-cpio-archive'.  Remove #:cpio parameter.
  (build-initrd): Remove #:cpio parameter.
* gnu/system/linux-initrd.scm (expression->initrd): Likewise, and adjust
  BUILDER accordingly.  Add (guix cpio) to #:modules.
This commit is contained in:
Ludovic Courtès 2015-06-24 17:41:43 +02:00
parent 7a18c3cc10
commit e8277f90c8
2 changed files with 36 additions and 40 deletions

@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2013, 2014 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
;;;
;;; This file is part of GNU Guix.
;;;
@ -17,12 +17,12 @@
;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
(define-module (gnu build linux-initrd)
#:use-module ((guix cpio) #:prefix cpio:)
#:use-module (guix build utils)
#:use-module (guix build store-copy)
#:use-module (system base compile)
#:use-module (rnrs bytevectors)
#:use-module ((system foreign) #:select (sizeof))
#:use-module (ice-9 popen)
#:use-module (ice-9 ftw)
#:export (write-cpio-archive
build-initrd))
@ -38,42 +38,42 @@
(define* (write-cpio-archive output directory
#:key
(compress? #t)
(cpio "cpio") (gzip "gzip"))
"Write a cpio archive containing DIRECTORY to file OUTPUT, using CPIO. When
(gzip "gzip"))
"Write a cpio archive containing DIRECTORY to file OUTPUT. When
COMPRESS? is true, compress it using GZIP. On success, return OUTPUT."
;; Note: don't use '--no-absolute-filenames' since that strips leading
;; slashes from symlink targets.
(let ((pipe (open-pipe* OPEN_WRITE cpio "-o" "-O" output
"-H" "newc" "--null")))
(define (print0 file)
(format pipe "~a\0" file))
;; Note: as per `ramfs-rootfs-initramfs.txt', always add directory entries
;; before the files that are inside of it: "The Linux kernel cpio
;; extractor won't create files in a directory that doesn't exist, so the
;; directory entries must go before the files that go in those
;; directories."
;; Note: as per `ramfs-rootfs-initramfs.txt', always add directory entries
;; before the files that are inside of it: "The Linux kernel cpio
;; extractor won't create files in a directory that doesn't exist, so the
;; directory entries must go before the files that go in those
;; directories."
(define files
;; XXX: Use a deterministic order.
(file-system-fold (const #t)
(lambda (file stat result) ; leaf
(print0 file))
(lambda (dir stat result) ; down
(unless (string=? dir directory)
(print0 dir)))
(const #f) ; up
(const #f) ; skip
(const #f)
#f
directory)
(reverse
(file-system-fold (const #t) ;enter?
(lambda (file stat result) ;leaf
(cons file result))
(lambda (dir stat result) ;down
(if (string=? dir directory)
result
(cons dir result)))
(lambda (file stat result)
result)
(const #f) ;skip
(const #f) ;error
'()
directory)))
(and (zero? (close-pipe pipe))
(or (not compress?)
(and (zero? (system* gzip "--best" output))
(rename-file (string-append output ".gz")
output))
output))))
(call-with-output-file output
(lambda (port)
(cpio:write-cpio-archive files port)))
(or (not compress?)
(and (zero? (system* gzip "--best" output))
(rename-file (string-append output ".gz")
output))
output))
(define (cache-compiled-file-name file)
"Return the file name of the in-cache .go file for FILE, relative to the
@ -105,7 +105,6 @@ This is similar to what 'compiled-file-name' in (system base compile) does."
#:key
guile init
(references-graphs '())
(cpio "cpio")
(gzip "gzip"))
"Write an initial RAM disk (initrd) to OUTPUT. The initrd starts the script
at INIT, running GUILE. It contains all the items referred to by
@ -134,8 +133,7 @@ REFERENCES-GRAPHS."
(utime file 0 0 0 0)))
(find-files "." ".*"))
(write-cpio-archive output "."
#:cpio cpio #:gzip gzip))
(write-cpio-archive output "." #:gzip gzip))
(delete-file-recursively "contents"))

@ -25,7 +25,6 @@
#:select (%store-prefix))
#:use-module ((guix derivations)
#:select (derivation->output-path))
#:use-module (gnu packages cpio)
#:use-module (gnu packages compression)
#:use-module (gnu packages linux)
#:use-module (gnu packages guile)
@ -51,7 +50,6 @@
(define* (expression->initrd exp
#:key
(guile %guile-static-stripped)
(cpio cpio)
(gzip gzip)
(name "guile-initrd")
(system (%current-system))
@ -78,11 +76,11 @@ MODULES is a list of Guile module names to be embedded in the initrd."
#:init #$init
;; Copy everything INIT refers to into the initrd.
#:references-graphs '("closure")
#:cpio (string-append #$cpio "/bin/cpio")
#:gzip (string-append #$gzip "/bin/gzip"))))
(gexp->derivation name builder
#:modules '((guix build utils)
#:modules '((guix cpio)
(guix build utils)
(guix build store-copy)
(gnu build linux-initrd))
#:references-graphs `(("closure" ,init)))))