build-system/pyproject: Use copy-recursively instead of merge-dirs.

Using rename-file, the destination had to be empty otherwise it would error
out.  This has been fixed by the use of copy-recursively, really merging them.
Changing this makes merge-directories mostly a duplicate of
copy-recursively, thus fully switch to copy-recursively.

* guix/build/pyproject-build-system.scm (install)
<python-hashbang>: Remove it, used only once.
<merge-directories>: Remove it, replace its calls by copy-recursively
and delete-file-recursively.

Signed-off-by: Sharlatan Hellseher <sharlatanus@gmail.com>
This commit is contained in:
Nicolas Graves 2025-06-19 09:58:47 +02:00 committed by Sharlatan Hellseher
parent e927a071cd
commit 74a1e9d543
No known key found for this signature in database
GPG key ID: 76D727BFF62CD2B5

View file

@ -193,30 +193,6 @@ builder.build_wheel(sys.argv[3], config_settings=config_settings)"
;; Use Pythons zipfile to avoid extra dependency
(invoke "python" "-m" "zipfile" "-e" file site-dir))
(define python-hashbang
(string-append "#!" python "/bin/python"))
(define* (merge-directories source destination
#:optional (post-move #f))
"Move all files in SOURCE into DESTINATION, merging the two directories."
(format #t "Merging directory ~a into ~a~%" source destination)
(for-each (lambda (file)
(format #t "~a/~a -> ~a/~a~%"
source file destination file)
(mkdir-p destination)
;; Use 'copy-recursively' rather than 'rename-file' to guard
;; against the odd case where DESTINATION is a non-empty
;; directory, which may happen when using hybrid Python
;; build systems.
(copy-recursively (string-append source "/" file)
(string-append destination "/" file))
(delete-file-recursively (string-append source "/" file))
(when post-move
(post-move file)))
(scandir source
(negate (cut member <> '("." "..")))))
(rmdir source))
(define (expand-data-directory directory)
"Move files from all .data subdirectories to their respective\ndestinations."
;; Pythons distutils.command.install defines this mapping from source to
@ -224,29 +200,32 @@ builder.build_wheel(sys.argv[3], config_settings=config_settings)"
(let ((source (string-append directory "/scripts"))
(destination (string-append out "/bin")))
(when (file-exists? source)
(merge-directories source destination
(lambda (f)
(let ((dest-path (string-append destination
"/" f)))
(chmod dest-path #o755)
;; PEP 427 recommends that installers rewrite
;; this odd shebang.
(substitute* dest-path
(("#!python")
python-hashbang)))))))
(copy-recursively source destination)
(delete-file-recursively source)
(for-each
(lambda (file)
(chmod file #o755)
;; PEP 427 recommends that installers rewrite
;; this odd shebang.
(substitute* file
(("#!python")
(string-append "#!" python "/bin/python"))))
(find-files destination))))
;; Data can be contained in arbitrary directory structures. Most
;; commonly it is used for share/.
(let ((source (string-append directory "/data"))
(destination out))
(when (file-exists? source)
(merge-directories source destination)))
(copy-recursively source destination)
(delete-file-recursively source)))
(let* ((distribution (car (string-split (basename directory) #\-)))
(source (string-append directory "/headers"))
(destination (string-append out "/include/python"
(python-version python)
"/" distribution)))
(when (file-exists? source)
(merge-directories source destination))))
(copy-recursively source destination)
(delete-file-recursively source))))
(define (list-directories base predicate)
;; Cannot use find-files here, because its recursive.