summary refs log tree commit diff
path: root/gnu
diff options
context:
space:
mode:
Diffstat (limited to 'gnu')
-rw-r--r--gnu/system/linux-initrd.scm40
1 files changed, 28 insertions, 12 deletions
diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm
index 3279172da7..71aba1e233 100644
--- a/gnu/system/linux-initrd.scm
+++ b/gnu/system/linux-initrd.scm
@@ -92,7 +92,9 @@ MODULES and taken from LINUX."
   (define build-exp
     #~(begin
         (use-modules (ice-9 match) (ice-9 regex)
-                     (guix build utils))
+                     (srfi srfi-1)
+                     (guix build utils)
+                     (gnu build linux-modules))
 
         (define (string->regexp str)
           ;; Return a regexp that matches STR exactly.
@@ -101,21 +103,35 @@ MODULES and taken from LINUX."
         (define module-dir
           (string-append #$linux "/lib/modules"))
 
+        (define (lookup module)
+          (let ((name (ensure-dot-ko module)))
+            (match (find-files module-dir (string->regexp name))
+              ((file)
+               file)
+              (()
+               (error "module not found" name module-dir))
+              ((_ ...)
+               (error "several modules by that name"
+                      name module-dir)))))
+
+        (define modules
+          (let ((modules (map lookup '#$modules)))
+            (append modules
+                    (recursive-module-dependencies modules
+                                                   #:lookup-module lookup))))
+
         (mkdir #$output)
         (for-each (lambda (module)
-                    (match (find-files module-dir (string->regexp module))
-                      ((file)
-                       (format #t "copying '~a'...~%" file)
-                       (copy-file file (string-append #$output "/" module)))
-                      (()
-                       (error "module not found" module module-dir))
-                      ((_ ...)
-                       (error "several modules by that name"
-                              module module-dir))))
-                  '#$modules)))
+                    (format #t "copying '~a'...~%" module)
+                    (copy-file module
+                               (string-append #$output "/"
+                                              (basename module))))
+                  (delete-duplicates modules))))
 
   (gexp->derivation "linux-modules" build-exp
-                    #:modules '((guix build utils))))
+                    #:modules '((guix build utils)
+                                (guix elf)
+                                (gnu build linux-modules))))
 
 (define (file-system->spec fs)
   "Return a list corresponding to file-system FS that can be passed to the