gnu: linux-initrd: Allow Guile modules to be embedded in the initrd.
* gnu/packages/linux-initrd.scm (raw-build-system): New macro. (module-package, compiled-module-package): New procedures. (expression->initrd): Add `modules' keyword parameter. Add "modules" and "modules/compiled" inputs; copy them onto the initrd. * guix/derivations.scm (imported-modules, compiled-modules): Publicize.
This commit is contained in:
		
							parent
							
								
									f02b5474f1
								
							
						
					
					
						commit
						f989fa392f
					
				
					 2 changed files with 86 additions and 20 deletions
				
			
		| 
						 | 
				
			
			@ -19,10 +19,14 @@
 | 
			
		|||
(define-module (gnu packages linux-initrd)
 | 
			
		||||
  #:use-module (guix utils)
 | 
			
		||||
  #:use-module (guix licenses)
 | 
			
		||||
  #:use-module (guix build-system)
 | 
			
		||||
  #:use-module ((guix derivations)
 | 
			
		||||
                #:select (imported-modules compiled-modules %guile-for-build))
 | 
			
		||||
  #:use-module (gnu packages)
 | 
			
		||||
  #:use-module (gnu packages cpio)
 | 
			
		||||
  #:use-module (gnu packages compression)
 | 
			
		||||
  #:use-module (gnu packages linux)
 | 
			
		||||
  #:use-module (gnu packages guile)
 | 
			
		||||
  #:use-module ((gnu packages make-bootstrap)
 | 
			
		||||
                #:select (%guile-static-stripped))
 | 
			
		||||
  #:use-module (guix packages)
 | 
			
		||||
| 
						 | 
				
			
			@ -38,6 +42,49 @@
 | 
			
		|||
;;; Code:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
(define-syntax-rule (raw-build-system (store system name inputs) body ...)
 | 
			
		||||
  "Lift BODY to a package build system."
 | 
			
		||||
  ;; TODO: Generalize.
 | 
			
		||||
  (build-system
 | 
			
		||||
   (name "raw")
 | 
			
		||||
   (description "Raw build system")
 | 
			
		||||
   (build (lambda* (store name source inputs #:key system #:allow-other-keys)
 | 
			
		||||
            (parameterize ((%guile-for-build (package-derivation store
 | 
			
		||||
                                                                 guile-2.0)))
 | 
			
		||||
              body ...)))))
 | 
			
		||||
 | 
			
		||||
(define (module-package modules)
 | 
			
		||||
  "Return a package that contains all of MODULES, a list of Guile module
 | 
			
		||||
names."
 | 
			
		||||
  (package
 | 
			
		||||
    (name "guile-modules")
 | 
			
		||||
    (version "0")
 | 
			
		||||
    (source #f)
 | 
			
		||||
    (build-system (raw-build-system (store system name inputs)
 | 
			
		||||
                    (imported-modules store modules
 | 
			
		||||
                                      #:name name
 | 
			
		||||
                                      #:system system)))
 | 
			
		||||
    (synopsis "Set of Guile modules")
 | 
			
		||||
    (description synopsis)
 | 
			
		||||
    (license gpl3+)
 | 
			
		||||
    (home-page "http://www.gnu.org/software/guix/")))
 | 
			
		||||
 | 
			
		||||
(define (compiled-module-package modules)
 | 
			
		||||
  "Return a package that contains the .go files corresponding to MODULES, a
 | 
			
		||||
list of Guile module names."
 | 
			
		||||
  (package
 | 
			
		||||
    (name "guile-compiled-modules")
 | 
			
		||||
    (version "0")
 | 
			
		||||
    (source #f)
 | 
			
		||||
    (build-system (raw-build-system (store system name inputs)
 | 
			
		||||
                    (compiled-modules store modules
 | 
			
		||||
                                      #:name name
 | 
			
		||||
                                      #:system system)))
 | 
			
		||||
    (synopsis "Set of compiled Guile modules")
 | 
			
		||||
    (description synopsis)
 | 
			
		||||
    (license gpl3+)
 | 
			
		||||
    (home-page "http://www.gnu.org/software/guix/")))
 | 
			
		||||
 | 
			
		||||
(define* (expression->initrd exp
 | 
			
		||||
                             #:key
 | 
			
		||||
                             (guile %guile-static-stripped)
 | 
			
		||||
| 
						 | 
				
			
			@ -45,12 +92,13 @@
 | 
			
		|||
                             (gzip gzip)
 | 
			
		||||
                             (name "guile-initrd")
 | 
			
		||||
                             (system (%current-system))
 | 
			
		||||
                             (modules '())
 | 
			
		||||
                             (linux #f)
 | 
			
		||||
                             (linux-modules '()))
 | 
			
		||||
  "Return a package that contains a Linux initrd (a gzipped cpio archive)
 | 
			
		||||
containing GUILE and that evaluates EXP upon booting.  LINUX-MODULES is a list
 | 
			
		||||
of `.ko' file names to be copied from LINUX into the initrd."
 | 
			
		||||
  ;; TODO: Add a `modules' parameter.
 | 
			
		||||
of `.ko' file names to be copied from LINUX into the initrd.  MODULES is a
 | 
			
		||||
list of Guile module names to be embedded in the initrd."
 | 
			
		||||
 | 
			
		||||
  ;; General Linux overview in `Documentation/early-userspace/README' and
 | 
			
		||||
  ;; `Documentation/filesystems/ramfs-rootfs-initramfs.txt'.
 | 
			
		||||
| 
						 | 
				
			
			@ -72,6 +120,16 @@ of `.ko' file names to be copied from LINUX into the initrd."
 | 
			
		|||
                                     "/bin/cpio"))
 | 
			
		||||
             (gzip    (string-append (assoc-ref %build-inputs "gzip")
 | 
			
		||||
                                     "/bin/gzip"))
 | 
			
		||||
             (modules (assoc-ref %build-inputs "modules"))
 | 
			
		||||
             (gos     (assoc-ref %build-inputs "modules/compiled"))
 | 
			
		||||
             (scm-dir (string-append "share/guile/" (effective-version)))
 | 
			
		||||
             (go-dir  (format #f ".cache/guile/ccache/~a-~a-~a-~a"
 | 
			
		||||
                              (effective-version)
 | 
			
		||||
                              (if (eq? (native-endianness) (endianness little))
 | 
			
		||||
                                  "LE"
 | 
			
		||||
                                  "BE")
 | 
			
		||||
                              (sizeof '*)
 | 
			
		||||
                              (effective-version)))
 | 
			
		||||
             (out     (assoc-ref %outputs "out")))
 | 
			
		||||
         (mkdir out)
 | 
			
		||||
         (mkdir "contents")
 | 
			
		||||
| 
						 | 
				
			
			@ -84,19 +142,23 @@ of `.ko' file names to be copied from LINUX into the initrd."
 | 
			
		|||
           (chmod "init" #o555)
 | 
			
		||||
           (chmod "bin/guile" #o555)
 | 
			
		||||
 | 
			
		||||
           ;; Copy Guile modules.
 | 
			
		||||
           (chmod scm-dir #o777)
 | 
			
		||||
           (copy-recursively modules scm-dir
 | 
			
		||||
                             #:follow-symlinks? #t)
 | 
			
		||||
           (copy-recursively gos (string-append "lib/guile/"
 | 
			
		||||
                                                (effective-version) "/ccache")
 | 
			
		||||
                             #:follow-symlinks? #t)
 | 
			
		||||
 | 
			
		||||
           ;; Compile `init'.
 | 
			
		||||
           (let ((go-dir (format #f ".cache/guile/ccache/~a-~a-~a-~a"
 | 
			
		||||
                                 (effective-version)
 | 
			
		||||
                                 (if (eq? (native-endianness) (endianness little))
 | 
			
		||||
                                     "LE"
 | 
			
		||||
                                     "BE")
 | 
			
		||||
                                 (sizeof '*)
 | 
			
		||||
                                 (effective-version))))
 | 
			
		||||
           (mkdir-p go-dir)
 | 
			
		||||
           (set! %load-path (cons modules %load-path))
 | 
			
		||||
           (set! %load-compiled-path (cons gos %load-compiled-path))
 | 
			
		||||
           (compile-file "init"
 | 
			
		||||
                         #:opts %auto-compilation-options
 | 
			
		||||
                           #:output-file (string-append go-dir "/init.go")))
 | 
			
		||||
                         #:output-file (string-append go-dir "/init.go"))
 | 
			
		||||
 | 
			
		||||
           ;; Copy Linux modules.
 | 
			
		||||
           (let* ((linux      (assoc-ref %build-inputs "linux"))
 | 
			
		||||
                  (module-dir (and linux
 | 
			
		||||
                                   (string-append linux "/lib/modules"))))
 | 
			
		||||
| 
						 | 
				
			
			@ -161,6 +223,8 @@ of `.ko' file names to be copied from LINUX into the initrd."
 | 
			
		|||
      (inputs `(("guile" ,guile)
 | 
			
		||||
                ("cpio" ,cpio)
 | 
			
		||||
                ("gzip" ,gzip)
 | 
			
		||||
                ("modules" ,(module-package modules))
 | 
			
		||||
                ("modules/compiled" ,(compiled-module-package modules))
 | 
			
		||||
                ,@(if linux
 | 
			
		||||
                      `(("linux" ,linux))
 | 
			
		||||
                      '())))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -61,6 +61,8 @@
 | 
			
		|||
            derivation
 | 
			
		||||
 | 
			
		||||
            %guile-for-build
 | 
			
		||||
            imported-modules
 | 
			
		||||
            compiled-modules
 | 
			
		||||
            build-expression->derivation
 | 
			
		||||
            imported-files))
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Reference in a new issue