Hi Danny, Danny Milosavljevic <dan...@scratchpost.org> skribis:
> A patch to guix master which > > * Puts the kernel modules (including any other packages that have > "lib/modules" > inside their derivation) into /run/booted-system/profile/lib/modules > * Ensures that depmod is invoked on that > * Makes the modprobe wrapper use it > > is provided below. Nice! I’m wondering if we could avoid clobbering the global profile with the kernel and module packages, though (as is currently the case.) > --- a/gnu/system.scm > +++ b/gnu/system.scm > @@ -887,9 +887,11 @@ we're running in the final root." > (define* (operating-system-profile os) > "Return a derivation that builds the system profile of OS." > (mlet* %store-monad > - ((services -> (operating-system-services os)) > - (profile (fold-services services > - #:target-type profile-service-type))) > + ((kernel -> (operating-system-kernel os)) > + (services -> (operating-system-services os)) > + (profile (cons kernel (fold-services services > + #:target-type > + profile-service-type)))) > (match profile > (("profile" profile) > (return profile))))) The value of ‘profile’ above can never match this pattern, or am I missing something? > +(define (linux-module-database manifest) > + (mlet %store-monad > + ((kmod (manifest-lookup-package manifest "kmod"))) > + (define build > + (with-imported-modules '((guix build utils) > + (guix build union)) > + #~(begin > + (use-modules (srfi srfi-26) > + (guix build utils) > + (guix build union) > + (ice-9 match)) > + (let ((destdir (string-append #$output "/lib/modules")) > + (dirs (filter file-exists? > + (map (cut string-append <> > + "/lib/modules") > + '#$(manifest-inputs manifest)))) > + (System.maps (filter file-exists? > + (map (cut string-append <> "/System.map") > + '#$(manifest-inputs manifest)))) > + (Module.symvers (filter file-exists? > + (map (cut string-append <> "/Module.symvers") > + '#$(manifest-inputs manifest))))) > + (mkdir-p (string-append #$output "/lib")) > + (union-build destdir dirs #:create-all-directories? #t) > + (exit (zero? (system* (string-append #$kmod "/bin/depmod") > + "-e" ; Report symbols that aren't supplied > + "-w" ; Warn on duplicates > + "-b" destdir > + "-F" (match System.maps ((x) x)) > + "-E" (match Module.symvers ((x) x))))))))) > + (gexp->derivation "linux-module-database" build > + #:local-build? #t > + #:substitutable? #f > + #:properties > + `((type . profile-hook) > + (hook . linux-module-database))))) Note that this fails if ‘kmod’ is no in the profile. Besides, I wonder how much is missing from (gnu build linux-modules) to do this without resorting to kmod. :-) > (define (xdg-desktop-database manifest) > "Return a derivation that builds the @file{mimeinfo.cache} database from > desktop files. It's used to query what applications can handle a given > @@ -1425,7 +1463,8 @@ MANIFEST." > gtk-im-modules > texlive-configuration > xdg-desktop-database > - xdg-mime-database)) > + xdg-mime-database > + linux-module-database)) Maybe we should not add this hook by default, to avoid overhead for a very unusual use case. The caller of ‘profile-derivation’ could add it when needed. Thinking more about it, what about handling the union/profile thing in ‘operating-system-directory-base-entries’? We could still use ‘profile-derivation’ with the hook you wrote, but we’d be able to keep that here instead of adding it to (guix profiles). Also, if we take that route, we would probably need a ‘linux-module-packages’ field in <operating-system>. WDYT? Thanks, Ludo’.