diff --git a/gnu/build/linux-initrd.scm b/gnu/build/linux-initrd.scm index 54639bd319..2c148836f3 100644 --- a/gnu/build/linux-initrd.scm +++ b/gnu/build/linux-initrd.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2013, 2014 Ludovic Courtès +;;; Copyright © 2013, 2014, 2015 Ludovic Courtès ;;; ;;; This file is part of GNU Guix. ;;; @@ -17,12 +17,12 @@ ;;; along with GNU Guix. If not, see . (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")) diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm index 83685adcbc..74dacf1ecd 100644 --- a/gnu/system/linux-initrd.scm +++ b/gnu/system/linux-initrd.scm @@ -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)))))