diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm index 4a6d4ff08..251095072 100644 --- a/gnu/build/linux-modules.scm +++ b/gnu/build/linux-modules.scm @@ -20,6 +20,7 @@ (define-module (gnu build linux-modules) #:use-module (guix elf) #:use-module (guix glob) + #:use-module (guix build utils) #:use-module (guix build syscalls) #:use-module (rnrs io ports) #:use-module (rnrs bytevectors) @@ -40,7 +41,8 @@ device-module-aliases known-module-aliases - matching-modules)) + matching-modules + needed-modules)) ;;; Commentary: ;;; @@ -370,4 +372,25 @@ ALIAS is a string like \"scsi:t-0x00\" as returned by module))) known-aliases)) +(define (system-device-aliases) + "Browse /sys/devices in search of \"modalias\" files and return the list of +device aliases for the current system." + (let ((files (find-files "/sys/devices" + (lambda (file stat) + (and (eq? 'regular (stat:type stat)) + (string=? "modalias" (basename file))))))) + (filter-map (lambda (file) + (match (string-trim-right + (call-with-input-file file get-string-all)) + ("" #f) + (alias alias))) + files))) + +(define* (needed-modules #:optional (known-aliases (known-module-aliases))) + "Return the list of modules needed by devices on the current system. This +is achieved by browsing /sys/devices and returning the maching modules from +KNOWN-ALIASES." + (append-map (cut matching-modules <> known-aliases) + (system-device-aliases))) + ;;; linux-modules.scm ends here