diff options
Diffstat (limited to 'gnu/system/linux-initrd.scm')
-rw-r--r-- | gnu/system/linux-initrd.scm | 40 |
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 |