(define-module (ruther packages python-next)
#:use-module (gnu)
#:use-module (guix packages)
#:use-module ((guix licenses) #:prefix license:)
#:use-module (guix gexp)
#:use-module (guix download)
#:use-module (guix utils)
#:use-module ((guix build-system copy) #:prefix copy:)
#:use-module ((guix build-system python) #:prefix python:)
#:use-module ((guix build-system pyproject) #:prefix pyproject:)
#:use-module (gnu packages sphinx)
#:use-module (gnu packages python)
#:use-module (gnu packages check)
#:use-module (gnu packages python-check)
#:use-module (gnu packages python-build)
#:use-module (gnu packages python-xyz))
(define with-python-3.12-raw
(package-input-rewriting `((,python . ,python-3.12))))
(define-public python-3.12-wrapped
((@@ (gnu packages python) wrap-python3) python-3.12))
(define-public python-3.12-toolchain
((@@ (gnu packages python) wrap-python3)
(package/inherit python-3.12
(name "python-next-toolchain")
(propagated-inputs
(modify-inputs (package-propagated-inputs python-3.12)
(append (with-python-3.12-raw python-setuptools))))
(arguments
(substitute-keyword-arguments (package-arguments python-3.12)
((#:tests? _ #f) #f)))))) ;; Disabled tests, because this was running forever...
(define with-python-3.12-no-cython
(package-input-rewriting `((,python . ,python-3.12-toolchain))))
;; Cython is dependency of a lot of packages, let's update it here
(define-public python-3.12-cython
(with-python-3.12-no-cython
(package/inherit python-cython
(version "0.29.37")
(source
(origin
(method url-fetch)
(uri (python:pypi-uri "Cython" version))
(sha256
(base32 "1ysca2r23h12ai9wrym4ci0nvgwm3lfijrpj9xfyxbclvnkd84zq"))))
(arguments
(substitute-keyword-arguments (package-arguments python-cython)
((#:tests? _ #f) #f)))))) ;; Failing... I don't know why...
;; This is changed a bit compared to the original function from Guix.
;; This one also works for pyproject
(define* (package-with-explicit-python python old-prefix new-prefix
#:key variant-property)
"Return a procedure of one argument, P. The procedure creates a package with
the same fields as P, which is assumed to use PYTHON-BUILD-SYSTEM, such that
it is compiled with PYTHON instead. The inputs are changed recursively
accordingly. If the name of P starts with OLD-PREFIX, this is replaced by
NEW-PREFIX; otherwise, NEW-PREFIX is prepended to the name.
When VARIANT-PROPERTY is present, it is used as a key to search for
pre-defined variants of this transformation recorded in the 'properties' field
of packages. The property value must be the promise of a package. This is a
convenient way for package writers to force the transformation to use
pre-defined variants."
(define package-variant
(if variant-property
(lambda (package)
(assq-ref (package-properties package)
variant-property))
(const #f)))
(define (transform p)
(cond
;; If VARIANT-PROPERTY is present, use that.
((package-variant p)
=> force)
;; Otherwise build the new package object graph.
((or (eq? (package-build-system p) python:python-build-system)
(eq? (package-build-system p) pyproject:pyproject-build-system))
(package/inherit p
(location (package-location p))
(name (let ((name (package-name p)))
(string-append new-prefix
(if (string-prefix? old-prefix name)
(substring name
(string-length old-prefix))
name))))
(arguments
(let ((python (if (promise? python)
(force python)
python)))
(ensure-keyword-arguments (package-arguments p)
`(#:python ,python))))))
(else p)))
(define (cut? p)
(or (not (and (eq? (package-build-system p) python:python-build-system)
(eq? (package-build-system p) pyproject:pyproject-build-system)))
(package-variant p)))
(package-mapping transform cut?))
(define with-python-3.12-single
(lambda (x)
((package-input-rewriting `((,python-cython . ,python-3.12-cython)
;; TODO: put more stuff here, if there is something
;; that's a common dependenc that will get broken on
;; Python 3.12
))
((package-with-explicit-python python-3.12-toolchain "python-" "python-3.12-") x))))
(define-public (with-python-3.12 el)
(if
(list? el)
(map with-python-3.12 el)
(with-python-3.12-single el)))