all messages for Guix-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Mathieu Othacehe <m.othacehe@gmail.com>
To: 37868@debbugs.gnu.org
Cc: mhw@netris.org, ludo@gnu.org
Subject: [bug#37868] [PATCH v8] system: Add kernel-module-packages to operating-system.
Date: Sun, 15 Mar 2020 11:28:37 +0100	[thread overview]
Message-ID: <877dzlgbe2.fsf@gmail.com> (raw)
In-Reply-To: <20200314194055.6d857037@scratchpost.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

  reply	other threads:[~2020-03-15 10:29 UTC|newest]

Thread overview: 54+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-10-22 15:22 [bug#37868] [PATCH] guix: Allow multiple packages to provide Linux modules in the system profile Danny Milosavljevic
2019-11-12 16:20 ` Danny Milosavljevic
2019-11-12 17:47   ` Giovanni Biscuolo
2019-11-12 18:11   ` Giovanni Biscuolo
2019-11-13 13:30   ` Ludovic Courtès
2019-11-14 16:21     ` Danny Milosavljevic
2020-02-17 17:10     ` Danny Milosavljevic
2020-02-18  8:31       ` Ludovic Courtès
2019-11-14 17:48   ` Mark H Weaver
2020-02-18  9:42   ` [bug#37868] [PATCH v2 0/2] system: Add kernel-module-packages to operating-system and use it Danny Milosavljevic
2020-02-18  9:42     ` [bug#37868] [PATCH v2 1/2] build-system/linux-module: Disable depmod Danny Milosavljevic
2020-02-23 16:22       ` Ludovic Courtès
2020-02-25 10:11         ` Danny Milosavljevic
2020-02-18  9:42     ` [bug#37868] [PATCH v2 2/2] system: Add kernel-module-packages to operating-system Danny Milosavljevic
2020-02-18 12:31       ` Mathieu Othacehe
2020-02-23 16:36       ` Ludovic Courtès
2020-02-24 16:18         ` Danny Milosavljevic
2020-02-25 10:21     ` [bug#37868] [PATCH v3] " Danny Milosavljevic
2020-02-25 10:55     ` [bug#37868] [PATCH v4] " Danny Milosavljevic
2020-02-25 11:32       ` Danny Milosavljevic
2020-02-25 13:34         ` Danny Milosavljevic
2020-02-26 19:59       ` [bug#37868] [PATCH v5] " Danny Milosavljevic
2020-02-27 11:15         ` Danny Milosavljevic
2020-02-27 12:25         ` [bug#37868] [PATCH v6] " Danny Milosavljevic
2020-02-27 13:51           ` [bug#37868] [PATCH v7] " Danny Milosavljevic
2020-02-27 15:50             ` [bug#37868] [PATCH v8] " Danny Milosavljevic
2020-03-14 18:40               ` Danny Milosavljevic
2020-03-15 10:28                 ` Mathieu Othacehe [this message]
2020-03-15 10:33                   ` Mathieu Othacehe
2020-03-15 18:17                   ` Danny Milosavljevic
2020-03-16  9:55                     ` Mathieu Othacehe
2020-03-16 20:10                       ` Danny Milosavljevic
2020-03-17  9:29                         ` Ludovic Courtès
2020-03-18 14:50                         ` Mathieu Othacehe
2020-03-18 16:06                           ` Danny Milosavljevic
2020-03-18 17:00                             ` Danny Milosavljevic
2020-03-18 17:35                           ` Ludovic Courtès
2020-03-20 10:19                           ` Danny Milosavljevic
2020-03-20 10:32                             ` Mathieu Othacehe
2020-03-20 15:13                             ` Mathieu Othacehe
2020-03-20 17:52                               ` Mathieu Othacehe
2020-03-21 10:06                                 ` Danny Milosavljevic
2020-03-22 13:36                               ` Danny Milosavljevic
2020-03-22 21:11                                 ` Ludovic Courtès
2020-03-15 21:02                 ` Ludovic Courtès
2020-03-15 21:00           ` [bug#37868] [PATCH v6] " Ludovic Courtès
2020-03-15 22:09             ` Danny Milosavljevic
2020-03-16  8:55               ` Ludovic Courtès
2020-03-16 20:04                 ` Danny Milosavljevic
2020-03-16 20:31             ` Danny Milosavljevic
2020-03-17  9:20               ` Ludovic Courtès
2020-03-16 20:17 ` [bug#37868] [PATCH v9] system: Add kernel-loadable-modules " Danny Milosavljevic
2020-03-19 14:22 ` [bug#37868] [PATCH v10] " Danny Milosavljevic
2020-03-22 12:01   ` bug#37868: " Danny Milosavljevic

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=877dzlgbe2.fsf@gmail.com \
    --to=m.othacehe@gmail.com \
    --cc=37868@debbugs.gnu.org \
    --cc=ludo@gnu.org \
    --cc=mhw@netris.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/guix.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.