me
/
guix
Archived
1
0
Fork 0

build-system/python: Do not embed timestamps in the .pyc byte code files.

Fixes <https://issues.guix.gnu.org/22129>.

A previously worked around problem where running the test suite after byte
compiling the sources in commit 6bbb37a545 could
be broken by adding built sources to the PYTHONPATH, as is done for
python-matplotlib and many others.  This seems to be caused by the timestamps
embedded in the sources (mtime), that can somehow change when running the
tests, or by picking up the different installed source files mtimes when their
location is added to the PYTHONPATH.

Since Python 3.7.0, it is possible to produce .pyc byte code files that do not
embed any timestamp, which solves the problem in a definitive way.  This patch
makes use of this new feature.

* guix/build/python-build-system.scm (install): Add '--no-compile' parameter
to setup.py, and instead invoke the 'compileall' module with the
"--invalidation-mode=unchecked-hash" option to byte compile the source files.
(%standard-phases): Revert the workaround that moved the check phase after the
install phase, as it is no longer necessary.  Update comment.

Reported-by: Mark H Weaver <mhw@netris.org>
master
Maxim Cournoyer 2020-10-18 01:31:31 -04:00
parent 5e2140511c
commit c94a2864d4
No known key found for this signature in database
GPG Key ID: 1260E46482E63562
1 changed files with 20 additions and 9 deletions

View File

@ -6,6 +6,7 @@
;;; Copyright © 2016 Hartmut Goebel <h.goebel@crazy-compilers.com> ;;; Copyright © 2016 Hartmut Goebel <h.goebel@crazy-compilers.com>
;;; Copyright © 2018 Ricardo Wurmus <rekado@elephly.net> ;;; Copyright © 2018 Ricardo Wurmus <rekado@elephly.net>
;;; Copyright © 2018 Arun Isaac <arunisaac@systemreboot.net> ;;; Copyright © 2018 Arun Isaac <arunisaac@systemreboot.net>
;;; Copyright © 2019, 2020 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;; Copyright © 2020 Jakub Kądziołka <kuba@kadziolka.net> ;;; Copyright © 2020 Jakub Kądziołka <kuba@kadziolka.net>
;;; ;;;
;;; This file is part of GNU Guix. ;;; This file is part of GNU Guix.
@ -178,18 +179,31 @@ when running checks after installing the package."
(if old-path (string-append ":" old-path) ""))) (if old-path (string-append ":" old-path) "")))
#t)) #t))
(define* (install #:key outputs (configure-flags '()) use-setuptools? (define* (install #:key inputs outputs (configure-flags '()) use-setuptools?
#:allow-other-keys) #:allow-other-keys)
"Install a given Python package." "Install a given Python package."
(let* ((out (python-output outputs)) (let* ((out (python-output outputs))
(params (append (list (string-append "--prefix=" out)) (python (assoc-ref inputs "python"))
(major-minor (map string->number
(take (string-split (python-version python) #\.) 2)))
(<3.7? (match major-minor
((major minor)
(or (< major 3) (and (= major 3) (< minor 7))))))
(params (append (list (string-append "--prefix=" out)
"--no-compile")
(if use-setuptools? (if use-setuptools?
;; distutils does not accept these flags ;; distutils does not accept these flags
(list "--single-version-externally-managed" (list "--single-version-externally-managed"
"--root=/") "--root=/")
'()) '())
configure-flags))) configure-flags)))
(call-setuppy "install" params use-setuptools?) (call-setuppy "install" params use-setuptools?)
;; Rather than produce potentially non-reproducible .pyc files on Pythons
;; older than 3.7, whose 'compileall' module lacks the
;; '--invalidation-mode' option, do not generate any.
(unless <3.7?
(invoke "python" "-m" "compileall" "--invalidation-mode=unchecked-hash"
out))
#t)) #t))
(define* (wrap #:key inputs outputs #:allow-other-keys) (define* (wrap #:key inputs outputs #:allow-other-keys)
@ -250,10 +264,8 @@ installed with setuptools."
(define %standard-phases (define %standard-phases
;; The build phase only builds C extensions and copies the Python sources, ;; The build phase only builds C extensions and copies the Python sources,
;; while the install phase byte-compiles and copies them to the prefix ;; while the install phase copies then byte-compiles the sources to the
;; directory. The tests are run after the install phase because otherwise ;; prefix directory.
;; the cached .pyc generated during the tests execution seem to interfere
;; with the byte compilation of the install phase.
(modify-phases gnu:%standard-phases (modify-phases gnu:%standard-phases
(add-after 'unpack 'ensure-no-mtimes-pre-1980 ensure-no-mtimes-pre-1980) (add-after 'unpack 'ensure-no-mtimes-pre-1980 ensure-no-mtimes-pre-1980)
(add-after 'ensure-no-mtimes-pre-1980 'enable-bytecode-determinism (add-after 'ensure-no-mtimes-pre-1980 'enable-bytecode-determinism
@ -261,9 +273,8 @@ installed with setuptools."
(delete 'bootstrap) (delete 'bootstrap)
(delete 'configure) ;not needed (delete 'configure) ;not needed
(replace 'build build) (replace 'build build)
(delete 'check) ;moved after the install phase (replace 'check check)
(replace 'install install) (replace 'install install)
(add-after 'install 'check check)
(add-after 'install 'wrap wrap) (add-after 'install 'wrap wrap)
(add-before 'strip 'rename-pth-file rename-pth-file))) (add-before 'strip 'rename-pth-file rename-pth-file)))