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:
		
							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))))) | ||||
|  |  | |||
		Reference in a new issue