@@ 3,6 3,17 @@
#:use-module (guix packages)
#:use-module ((guix licenses) #:prefix license:)
+ #:use-module (ice-9 match)
+ #:use-module (ice-9 vlist)
+ #:use-module (ice-9 regex)
+
+ #:use-module (srfi srfi-1)
+ #:use-module (srfi srfi-9 gnu)
+ #:use-module (srfi srfi-26)
+ #:use-module (srfi srfi-34)
+ #:use-module (srfi srfi-35)
+ #:use-module (srfi srfi-71)
+
#:use-module (guix gexp)
#:use-module (guix build-system)
#:use-module (guix download)
@@ 15,7 26,9 @@
#:use-module (gnu packages check)
#:use-module (gnu packages python-check)
#:use-module (gnu packages python-build)
- #:use-module (gnu packages python-xyz))
+ #:use-module (gnu packages python-xyz)
+
+ #:export (replace-python-deps))
(define with-python-3.12-raw
(package-input-rewriting `((,python . ,python-3.12))))
@@ 30,6 43,8 @@
(propagated-inputs
(modify-inputs (package-propagated-inputs python-3.12)
(append (with-python-3.12-raw python-setuptools))))
+ (properties `(('python-3.12- . #t)
+ ,@(package-properties python-3.12)))
(arguments
(substitute-keyword-arguments (package-arguments python-3.12)
((#:tests? _ #f) #f)))))) ;; Disabled tests, because this was running forever...
@@ 38,7 53,7 @@
(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
+(define-public python-3.12-cython-0.29.37
(with-python-3.12-no-cython
(package/inherit python-cython
(name "python-3.12-cython")
@@ 49,6 64,8 @@
(uri (python:pypi-uri "Cython" version))
(sha256
(base32 "1ysca2r23h12ai9wrym4ci0nvgwm3lfijrpj9xfyxbclvnkd84zq"))))
+ (properties `(('python-3.12- . #t)
+ ,@(package-properties python-cython)))
(arguments
(substitute-keyword-arguments (package-arguments python-cython)
((#:tests? _ #f) #f)))))) ;; Failing... I don't know why...
@@ 75,15 92,21 @@ pre-defined variants."
variant-property))
(const #f)))
+ (define replacement-property (string->symbol new-prefix))
+
(define (transform p)
(cond
;; If VARIANT-PROPERTY is present, use that.
((package-variant p)
=> force)
+ ((assq-ref (package-properties p) replacement-property)
+ p)
+
;; Otherwise build the new package object graph.
- ((or (eq? (build-system-name (package-build-system p)) (build-system-name python:python-build-system))
- (eq? (build-system-name (package-build-system p)) (build-system-name pyproject:pyproject-build-system)))
+ ((and
+ (or (eq? (build-system-name (package-build-system p)) (build-system-name python:python-build-system))
+ (eq? (build-system-name (package-build-system p)) (build-system-name pyproject:pyproject-build-system))))
(package/inherit p
(location (package-location p))
(name (let ((name (package-name p)))
@@ 92,6 115,8 @@ pre-defined variants."
(substring name
(string-length old-prefix))
name))))
+ (properties `((,replacement-property . #t)
+ ,@(package-properties p)))
(arguments
(let ((python (if (promise? python)
(force python)
@@ 103,10 128,62 @@ pre-defined variants."
(define (cut? p)
(or (not (or (eq? (build-system-name (package-build-system p)) (build-system-name python:python-build-system))
(eq? (build-system-name (package-build-system p)) (build-system-name pyproject:pyproject-build-system))))
+ (assq-ref (package-properties p) replacement-property)
(package-variant p)))
(package-mapping transform cut?))
+(define* (replace-python-deps replacements #:key (deep? #t))
+ (define table
+ (fold (lambda (replacement table)
+ (match replacement
+ ((spec . proc)
+ (let ((name version (package-name->name+version spec)))
+ (vhash-cons name (list version proc) table)))))
+ vlist-null
+ replacements))
+
+ (define (find-replacement package)
+ (vhash-fold* (lambda (item proc)
+ (or proc
+ (match item
+ ((#f proc)
+ proc)
+ ((version proc)
+ (and (version-prefix? version
+ (package-version package))
+ proc)))))
+ #f
+ (package-name package)
+ table))
+
+ (define replacement-property
+ (gensym " package-replacement"))
+
+ (define (rewrite p)
+ (if (or (assq-ref (package-properties p) replacement-property)
+ (hidden-package? p))
+ p
+ (match (find-replacement p)
+ (#f p)
+ (proc
+ (let ((new (proc p)))
+ ;; Mark NEW as already processed.
+ (package/inherit new
+ (properties `((,replacement-property . #t)
+ ,@(package-properties new)))))))))
+
+ (define (cut? p)
+ (or
+ (not (or (eq? (build-system-name (package-build-system p)) (build-system-name python:python-build-system))
+ (eq? (build-system-name (package-build-system p)) (build-system-name pyproject:pyproject-build-system))))
+ ;; (assq-ref (package-properties p) replacement-property)
+ ;; (find-replacement p)
+ ))
+
+ (package-mapping rewrite cut?
+ #:deep? deep?))
+
(define with-explicit-python-3.12-single
(package-with-explicit-python python-3.12-toolchain "python-" "python-3.12-"))
@@ 116,7 193,7 @@ pre-defined variants."
(define with-python-3.12-single
(lambda (pkg)
(let ((rewritten (with-explicit-python-3.12-single pkg)))
- ((package-input-rewriting `((,python-3.12-cython-inner . ,python-3.12-cython)))
+ ((package-input-rewriting `((,python-3.12-cython-inner . ,python-3.12-cython-0.29.37)))
rewritten))))
;; (define with-python-3.12-single