Subject: [bug#71482] [PATCH v2] gnu: zfs: Split the kernel module out of the base package.

From: Zheng Junjie <[email-masked]>
Date: Sun, 06 Oct 2024 00:17:19 +0800

Kaelyn Takata via Guix-patches via <[email-masked]> writes:

> Split the ZFS user-space tools and kernel modules into separate packages, with
> a new make-zfs-for-kernel procedure for easily creating ZFS kernel module
> packages for a specific kernel package. The generated kernel module package
> includes the kernel version for which it was built in the name of the package,
> such as "zfs-for-linux-libre-6.6.32-version".
>
> & gnu/packages/file-systems.scm (zfs): Change to be the user-space tools.
> (make-zfs-for-kernel): New procedure which accepts a single 'kernel-package'
> argument.
>
> Change-Id: Ib2d0e2b0f031d2ab3105d6b46ecd73bde1aa8564
> ---
>  gnu/packages/file-systems.scm | 126 ++++++++++++++++++++--------------
>  1 file changed, 73 insertions(+), 53 deletions(-)
>
> diff --git a/gnu/packages/file-systems.scm b/gnu/packages/file-systems.scm
> index 059bdf67a9..ceaaf7f3ab 100644
> --- a/gnu/packages/file-systems.scm
> +++ b/gnu/packages/file-systems.scm
> @@ -9,7 +9,7 @@
>  ;;; Copyright © 2021 raid5atemyhomework <[email-masked]>
>  ;;; Copyright © 2021 Stefan Reichör <[email-masked]>
>  ;;; Copyright © 2021 Noisytoot <[email-masked]>
> -;;; Copyright © 2021, 2023 Kaelyn Takata <[email-masked]>
> +;;; Copyright © 2021, 2023, 2024 Kaelyn Takata <[email-masked]>
>  ;;; Copyright © 2022 Brian Cully <[email-masked]>
>  ;;; Copyright © 2023 Aaron Covrig <[email-masked]>
>  ;;; Copyright © 2024 Ahmad Draidi <[email-masked]>
> @@ -1564,7 +1564,6 @@ (define-public zfs
>    (package
>      (name "zfs")
>      (version "2.2.6")
> -    (outputs '("out" "module" "src"))
>      (source
>        (origin
>          (method url-fetch)
> @@ -1573,33 +1572,19 @@ (define-public zfs
>                                "/zfs-" version ".tar.gz"))
>            (sha256
>             (base32 "19x2a8k25i3y6nr7nx5aaqrpnp55vjmrw86p06zpgpf578804bn9"))))
> -    (build-system linux-module-build-system)
> +    (build-system gnu-build-system)
>      (arguments
>       (list
> -      ;; The ZFS kernel module should not be downloaded since the license
> -      ;; terms don't allow for distributing it, only building it locally.
> -      #:substitutable? #f
> -      ;; Tests cannot run in an unprivileged build environment.
> -      #:tests? #f
> +      #:configure-flags #~(list "--with-config=user"
> +                                (string-append "--prefix=" #$output)
> +                                (string-append "--with-dracutdir=" #$output
> +                                               "/lib/dracut")
> +                                (string-append "--with-udevdir=" #$output
> +                                               "/lib/udev")
> +                                (string-append "--with-mounthelperdir=" #$output
> +                                               "/sbin"))
>        #:phases
>        #~(modify-phases %standard-phases
> -          (add-after 'configure 'really-configure
> -            (lambda* (#:key inputs #:allow-other-keys)
> -              (substitute* "configure"
> -                (("-/bin/sh") (string-append "-" (which "sh"))))
> -              (invoke "./configure"
> -                      "--with-config=all"
> -                      (string-append "--prefix=" #$output)
> -                      (string-append "--with-dracutdir=" #$output
> -                                     "/lib/dracut")
> -                      (string-append "--with-udevdir=" #$output
> -                                     "/lib/udev")
> -                      (string-append "--with-mounthelperdir=" #$output
> -                                     "/sbin")
> -                      (string-append "--with-linux="
> -                                     (search-input-directory
> -                                      inputs
> -                                      "lib/modules/build")))))
>            (add-after 'unpack 'patch-source
>              (lambda* (#:key inputs #:allow-other-keys)
>                ;; New feature "compatibility=" in 2.1.0.
> @@ -1631,14 +1616,6 @@ (define-public zfs
>                  ;; Just use 'modprobe' in message to user, since Guix
>                  ;; does not have a traditional /sbin/
>                  (("'/sbin/modprobe ") "'modprobe "))
> -              (substitute* "configure"
> -                (("/etc/default")
> -                 (string-append #$output "/etc/default"))
> -                (("/etc/bash_completion.d")
> -                 (string-append #$output "/etc/bash_completion.d")))
> -              (substitute* "Makefile.in"
> -                (("/usr/share/initramfs-tools")
> -                 (string-append #$output "/usr/share/initramfs-tools")))
>                (substitute* "contrib/initramfs/Makefile.am"
>                  (("/usr/share/initramfs-tools")
>                   (string-append #$output "/usr/share/initramfs-tools")))
> @@ -1668,31 +1645,22 @@ (define-public zfs
>                                  (dirname (which "sed")) ":"
>                                  (dirname (which "gawk")))))
>                (substitute* '("Makefile.am" "Makefile.in")
> -                (("\\$\\(prefix)/src") (string-append #$output:src "/src")))
> +                (("@initconfdir@") (string-append #$output "/etc/default"))
> +                (("/usr/share/initramfs-tools" dir) (string-append #$output dir)))
>                (substitute* (find-files "udev/rules.d/" ".rules.in$")
>                  (("/sbin/modprobe")
>                   (search-input-file inputs "/bin/modprobe")))))
> -          (replace 'build
> -            (lambda _ (invoke "make")))
>            (replace 'install
> -            (lambda* (#:key inputs native-inputs #:allow-other-keys)
> -              (let* ((kmod (assoc-ref (or native-inputs inputs) "kmod")))
> -                (invoke "make" "install"
> -                        (string-append "DEFAULT_INITCONF_DIR="
> -                                       #$output "/etc/default")
> -                        (string-append "DEPMOD="
> -                                       (search-input-file
> -                                        (or native-inputs inputs)
> -                                        "/bin/depmod"))
> -                        (string-append "INSTALL_PATH=" #$output)
> -                        (string-append "INSTALL_MOD_PATH=" #$output:module)
> -                        "INSTALL_MOD_STRIP=1")
> -                (install-file
> -                 "contrib/bash_completion.d/zfs"
> -                 (string-append #$output
> -                                "/share/bash-completion/completions"))))))))
> +            (lambda _
> +              (invoke "make" "install"
> +                      (string-append "DEFAULT_INITCONF_DIR="
> +                                     #$output "/etc/default")
> +                      (string-append "INSTALL_PATH=" #$output)
> +                      (string-append "bashcompletiondir="
> +                                     #$output
> +                                     "/share/bash-completion/completions")))))))
>      (native-inputs
> -     (list attr kmod pkg-config))
> +     (list attr kmod pkg-config python))
>      (inputs (list eudev
>                    kmod
>                    libaio
> @@ -1712,6 +1680,58 @@ (define-public zfs
>  community.")
>      (license license:cddl1.0)))
>  
> +(define-public (make-zfs-for-kernel kernel-package)

Just to be clear, I don't know much about ZFS licensing issues.

i don't think need a procedure, just a package, If I understand the code
correctly, gnu/services.scm (linux-builder-service-type) will replace
#:linux to target-linux, and see
linux-builder-configuration->system-entry , package-for-kernel.

> +  (package
> +    (inherit zfs)
> +    (name (string-join (list (package-name zfs)
> +                             "for"
> +                             (package-name kernel-package)
> +                             (package-version kernel-package)
> +                             "version")
> +                       "-"))
> +    (build-system linux-module-build-system)
> +    (arguments
> +     (substitute-keyword-arguments
> +         (strip-keyword-arguments '(#:configure-flags)
> +                                  (package-arguments zfs))
> +       ((#:linux _ #f) kernel-package)
> +       ((#:substitutable? _ #t) #f)
> +       ((#:phases phases)
> +        #~(modify-phases %standard-phases
> +            (add-after 'unpack 'patch-source
> +              (assoc-ref #$phases 'patch-source))
> +            (add-after 'configure 'really-configure
> +              (lambda* (#:key inputs #:allow-other-keys)
> +                (substitute* "configure"
> +                  (("-/bin/sh") (string-append "-" (which "sh"))))
> +                (invoke "./configure"
> +                        "--with-config=kernel"
> +                        (string-append "--prefix=" #$output)
> +                        (string-append "--with-udevdir=" #$output
> +                                       "/lib/udev")
> +                        (string-append "--with-linux="
> +                                       (search-input-directory
> +                                        inputs
> +                                        "lib/modules/build")))))
> +            (replace 'build
> +              (lambda* (#:key (make-flags '()) (parallel-build? #t)
> +                        #:allow-other-keys)
> +                (apply invoke "make"
> +                       `(,@(if parallel-build?
> +                               `("-j" ,(number->string (parallel-job-count)))
> +                               '())
> +                         ,@make-flags))))
> +            (replace 'install
> +              (lambda* (#:key inputs native-inputs #:allow-other-keys)
> +                (let* ((kmod (assoc-ref (or native-inputs inputs) "kmod")))
> +                  (invoke "make" "-C" "module" "install"
> +                          (string-append "DEPMOD="
> +                                         (search-input-file
> +                                          (or native-inputs inputs)
> +                                          "/bin/depmod"))
> +                          (string-append "INSTALL_MOD_PATH=" #$output)
> +                          "INSTALL_MOD_STRIP=1"))))))))))
> +
>  (define-public zfs-auto-snapshot
>    (package
>      (name "zfs-auto-snapshot")
>
> base-commit: b7c94d528875415ea7ec6225d88a6b3d55fa2e14