Subject: [bug#60240] [PATCH v2] gnu: Add python-3.12 and python-next.

From: Lars-Dominik Braun <[email-masked]>
Date: Sat, 2 Mar 2024 10:59:23 +0100

Hey,

> Sorry, but I’m not sure to see what you mean!?
> Outputs are defined for `out`, `tk` and `idle`. And I see phases to move
> files to the outputs: `move-tk-inter` and `move-idle`.
> 
> What do you mean by `referenced from out`? And how would you remove such
> a reference!

so, if you look at `guix size [email-masked]`, you can see
it lists tk and tcl. And then a `grep -Ri /gnu/store/path/to/tcl
/gnu/store/path/to/python` reveals it’s being referenced by
lib/python3.12/_sysconfigdata__linux_x86_64-linux-gnu.py and
lib/python3.12/config-3.12-x86_64-linux-gnu/Makefile, which are both
part of the default “out” output. That means TCL and TK are both
part of the closure of the [email-masked] package, i.e. they are downloaded
whenever you install it, making the package “bigger” in size (234.5
MiB in total to be precise). I believe we wanted to avoid that by moving
some parts of Python into the separate “tk” output. But apparently
that does not work (any more).

The attached patch (on top of yours) removes these references and shrinks
the closure of [email-masked] to 180.6 MiB. But I don’t know whether it
has any negative side-effects (i.e. packages not building any more),
because I can’t build libxslt with Python 3.12 due to the module
“imp” having been removed in Python 3.12.

> I searched in the issue list on GH, but couldn’t find anything relevant.
> But there are quite a lot of issues there.
> Do we have to fix this before we merge it?

No, we’d have to dig deeper into which particular test causes this
behavior.

And actually one more nitpick: The name of the package should be
“python-next” not “python”, otherwise `guix install python`
will pick Python 3.12 (it’s based on the name property, not the
variable name).

Cheers,
Lars

diff --git a/gnu/packages/python.scm b/gnu/packages/python.scm
index 471cf190fb..0b887a2cdb 100644
--- a/gnu/packages/python.scm
+++ b/gnu/packages/python.scm
@@ -836,7 +836,7 @@ (define-public python-3.12
                                          "json/tests"
                                          "distutils/tests"))))))))
                   (add-after 'remove-tests 'move-tk-inter
-                    (lambda* (#:key outputs #:allow-other-keys)
+                    (lambda* (#:key outputs inputs #:allow-other-keys)
                       ;; When Tkinter support is built move it to a separate output so
                       ;; that the main output doesn't contain a reference to Tcl/Tk.
                       (let ((out (assoc-ref outputs "out"))
@@ -854,7 +854,14 @@ (define-public python-3.12
                                                                         len)
                                                            "/site-packages")))
                                (install-file tkinter.so target)
-                               (delete-file tkinter.so))))))))
+                               (delete-file tkinter.so))))
+                          ;; Remove explicit store path references.
+                          (let ((tcl (assoc-ref inputs "tcl"))
+                                (tk (assoc-ref inputs "tk")))
+                            (substitute* (find-files (string-append out "/lib")
+                                                     "^(_sysconfigdata_.*\\.py|Makefile)$")
+                                         (((string-append "-L" tk "/lib")) "")
+                                         (((string-append "-L" tcl "/lib")) "")))))))
                   (add-after 'move-tk-inter 'move-idle
                     (lambda* (#:key outputs #:allow-other-keys)
                       ;; when idle is built, move it to a separate output to save some