From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:470:142:3::10]:43665) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jDQW0-0003q8-Cl for guix-patches@gnu.org; Sun, 15 Mar 2020 06:29:05 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jDQVz-0003pv-2H for guix-patches@gnu.org; Sun, 15 Mar 2020 06:29:04 -0400 Received: from debbugs.gnu.org ([209.51.188.43]:56520) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1jDQVy-0003ov-Va for guix-patches@gnu.org; Sun, 15 Mar 2020 06:29:03 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1jDQVy-0005xW-TO for guix-patches@gnu.org; Sun, 15 Mar 2020 06:29:02 -0400 Subject: [bug#37868] [PATCH v8] system: Add kernel-module-packages to operating-system. Resent-Message-ID: References: <20200227135146.5701-1-dannym@scratchpost.org> <20200227155029.2542-1-dannym@scratchpost.org> <20200314194055.6d857037@scratchpost.org> From: Mathieu Othacehe In-reply-to: <20200314194055.6d857037@scratchpost.org> Date: Sun, 15 Mar 2020 11:28:37 +0100 Message-ID: <877dzlgbe2.fsf@gmail.com> MIME-Version: 1.0 Content-Type: text/plain List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+kyle=kyleam.com@gnu.org Sender: "Guix-patches" To: 37868@debbugs.gnu.org Cc: mhw@netris.org, ludo@gnu.org Hello Danny, > Will Guix do the derivation (especially the invocation of depmod) for the > intended system and target? Yes, "profile-derivation" should use the current system or target if the #:system and #:target arguments are #f. > Apparently, module-init-tools are supposed to be cross-platform anyway and work > when invoking depmod for files of an other architecture than the architecture > depmod is invoked on (and was compiled for). So maybe we can also just ignore > the entire system/target propagation in this case. In that case, you should use #+kmod instead of #$kmod. This way, when cross-compiling, the native kmod would be used. > Then I tried > > ./pre-inst-env guix build --target=xxx -m etc/system-tests.scm > > and that seems to ignore target entirely. I'm not sure this has ever been tested. Support of cross-compilation for Guix System is still wip, even if since a few days, core-updates is in a good shape. Anyway, if you're willing to wait a few days, I can test your patch does not break system cross-compilation on core-updates. Regarding --system, producing disk-images is currently broken on all branches[1], so it will be harder to test it for now. Also, here are a few remarks about your patch. +(define (depmod! kmod version output) + "Given an (existing) OUTPUT directory, invoke KMOD's depmod on it for +kernel version VERSION." "OUTPUT" is maybe not the best naming as you read multiple "input" files from it. Maybe just "DIRECTORY"? + (let ((destination-directory (string-append output "/lib/modules/" version)) + ;; Note: "System.map" is an input file. + (maps-file (string-append output "/System.map")) + ;; Note: "Module.symvers" is an input file. + (symvers-file (string-append output "/Module.symvers"))) + (for-each (lambda (basename) + (when (and (string-prefix? "modules." basename) + ;; Note: "modules.builtin" is an input file. + (not (string=? "modules.builtin" basename)) + ;; Note: "modules.order" is an input file. + (not (string=? "modules.order" basename))) + (delete-file (string-append destination-directory "/" + basename)))) You can maybe add a comment explaining what's the point of this operation. + (scandir destination-directory)) + (invoke (string-append kmod "/bin/depmod") + "-e" ; Report symbols that aren't supplied + ;"-w" ; Warn on duplicates + "-b" output + "-F" maps-file + "-E" symvers-file The man page of depmod says that '-F' and '-E' options are mutually exclusive. + (let* ((versions (filter (lambda (name) + (not (string-prefix? "." name))) + (scandir moddir))) + (version (match versions + ((x) x)))) If versions only contains one element, then you can use find instead of filtering and matching. + ;; TODO: system, target. + (profile-derivation + (packages->manifest + (cons kernel modules)) + #:hooks (list linux-module-database) + #:locales? #f + #:allow-collisions? #f + #:relative-symlinks? #t)) + (initrd -> (operating-system-initrd-file os)) + (params (operating-system-boot-parameters-file os))) As stated above, I think you are fine removing the TODO. +(define (input-files inputs path) + "Given a list of directories INPUTS, return all entries with PATH in it." + ;; TODO: Use filter-map. + #~(begin + (use-modules (srfi srfi-1)) + (filter file-exists? + (map (lambda (x) + (string-append x #$path)) + '#$inputs)))) + This TODO can be resolved I think :) +(define (linux-module-database manifest) + "Return a derivation that unions all the kernel modules in the manifest +and creates the dependency graph for all these kernel modules." + (mlet %store-monad ((kmod (manifest-lookup-package manifest "kmod"))) + (define build + (with-imported-modules (source-module-closure '((guix build utils) (gnu build linux-modules))) + #~(begin + (use-modules (ice-9 ftw)) + (use-modules (ice-9 match)) + (use-modules (srfi srfi-1)) ; append-map + (use-modules (guix build utils)) ; mkdir-p + (use-modules (gnu build linux-modules)) ; make-linux-module-directory + (let* ((inputs '#$(manifest-inputs manifest)) + (module-directories #$(input-files (manifest-inputs manifest) "/lib/modules")) + (directory-entries + (lambda (directory-name) + (scandir directory-name (lambda (basename) + (not (string-prefix? "." basename)))))) + ;; Note: Should usually result in one entry. + (versions (delete-duplicates + (append-map directory-entries + module-directories)))) This part is over the column limit. + (match versions + ((version) + (make-linux-module-directory #$kmod inputs version #$output))) If depmod output is system agnostic, then we should use #+kmod. If that's not the case, this will be an issue as running #$kmod won't work when cross-compiling. Thanks, Mathieu