@@ -25,6 +25,7 @@
#:use-module (gnu system)
#:use-module (gnu system vm)
#:use-module (gnu tests)
+ #:use-module (gnu tests base)
#:use-module (guix derivations)
#:use-module (guix gexp)
#:use-module (guix modules)
@@ -129,3 +130,37 @@ with two extra modules.")
(package-arguments
ddcci-driver-linux))))))
'("acpi_call" "ddcci")))))
+
+(define %test-no-loadable-kernel-modules
+ (let* ((kernel (package
+ (inherit linux-libre)
+ (arguments
+ (substitute-keyword-arguments (package-arguments linux-libre)
+ ((#:phases phases)
+ `(modify-phases ,phases
+ (add-before 'build 'no-lkm-config
+ (lambda _
+ (substitute* ".config"
+ (("=m") "=y"))
+ (let ((port (open-file ".config" "a")))
+ (display "CONFIG_MODULES=n" port)
+ (close-port port))))
+ (replace 'install
+ (lambda* (#:key outputs #:allow-other-keys)
+ (for-each
+ (let ((out (assoc-ref outputs "out")))
+ (lambda (file) (install-file file out)))
+ (find-files "." "^(\\.config|bzImage|zImage|Image|vmlinuz|System\\.map|Module\\.symvers)$"))))))))))
+ (os (marionette-operating-system
+ (operating-system
+ (inherit (simple-operating-system))
+ (kernel kernel)
+ (initrd-modules '()))
+ #:imported-modules '((gnu services herd)
+ (guix combinators))))
+ (vm (virtual-machine os)))
+ (system-test
+ (name "no-loadable-kernel-modules")
+ (description "Build and run a basic system without loadable kernel module support")
+ (value (run-basic-test (virtualized-operating-system os '())
+ #~(list #$vm))))))
@@ -1201,6 +1201,8 @@ for both major versions of GTK+."
"Return a derivation that unites all the kernel modules of the manifest
and creates the dependency graph of all these kernel modules.
+The first entry in the manifest must be a Linux kernel package.
+
This is meant to be used as a profile hook."
(define kmod ; lazy reference
(module-ref (resolve-interface '(gnu packages linux)) 'kmod))
@@ -1226,14 +1228,22 @@ This is meant to be used as a profile hook."
;; Note: Should usually result in one entry.
(versions (delete-duplicates
(append-map directory-entries
- module-directories))))
- (match versions
- ((version)
- (let ((old-path (getenv "PATH")))
- (setenv "PATH" #+(file-append kmod "/bin"))
- (make-linux-module-directory inputs version #$output)
- (setenv "PATH" old-path)))
- (_ (error "Specified Linux kernel and Linux kernel modules
+ (if (file-exists? (car module-directories))
+ module-directories
+ (cdr module-directories))))))
+ (match versions
+ ((version)
+ (let ((old-path (getenv "PATH")))
+ (setenv "PATH" #+(file-append kmod "/bin"))
+ (make-linux-module-directory inputs version #$output)
+ (setenv "PATH" old-path)))
+ ;; Do nothing when there is nothing to do
+ (() (mkdir #$output))
+ ;; This might not catch a version incompatibility
+ ;; if all kernel modules reside in extra packages
+ ;; Would checking the kernel package version have
+ ;; undesirable effects?
+ (_ (error "Specified Linux kernel and Linux kernel modules
are not all of the same version")))))))
(gexp->derivation "linux-module-database" build
#:local-build? #t