From 79c28121306ee26856414724b1efe0ed65318085 Mon Sep 17 00:00:00 2001 From: Marius Bakke Date: Thu, 22 Jul 2021 00:33:31 +0200 Subject: [PATCH] gnu: Python: Compile bytecode in all outputs. * gnu/packages/python.scm (python-2.7)[arguments]: Ensure the post-install phases run in order. Move rebuild-bytecode last and run it on every output. * gnu/packages/python.scm (python-3.9)[arguments]: Run the rebuild-bytecode phase on every output. --- gnu/packages/python.scm | 95 ++++++++++++++++++++++------------------- 1 file changed, 51 insertions(+), 44 deletions(-) diff --git a/gnu/packages/python.scm b/gnu/packages/python.scm index 8a8fe2bd2a..cee8613b34 100644 --- a/gnu/packages/python.scm +++ b/gnu/packages/python.scm @@ -310,31 +310,7 @@ '("email/test" "ctypes/test" "unittest/test" "tkinter/test" "sqlite3/test" "bsddb/test" "lib-tk/test" "lib2to3/tests" "json/tests" "distutils/tests")))))))) - (add-after 'remove-tests 'rebuild-bytecode - (lambda* (#:key outputs #:allow-other-keys) - (let ((out (assoc-ref outputs "out"))) - ;; Disable hash randomization to ensure the generated .pycs - ;; are reproducible. - (setenv "PYTHONHASHSEED" "0") - (for-each - (lambda (opt) - (format #t "Compiling with optimization level: ~a\n" - (if (null? opt) "none" (car opt))) - (apply invoke - `(,,(if (%current-target-system) - "python2" - '(string-append out "/bin/python")) - ,@opt - "-m" "compileall" - "-f" ; force rebuild - ;; Don't build lib2to3, because it contains Python 3 code. - "-x" "lib2to3/.*" - ,out))) - ;; Python 2 has a single file extension (.pyo) for the chosen - ;; level of optimization, so it doesn't make sense to byte - ;; compile with more than one level. - (list '() '("-OO")))))) - (add-after 'install 'move-tk-inter + (add-after 'remove-tests 'move-tk-inter (lambda* (#:key outputs #: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. @@ -354,7 +330,7 @@ "/site-packages"))) (install-file tkinter.so target) (delete-file tkinter.so)))))))) - (add-after 'install 'move-idle + (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 ;; space (5MB) @@ -375,6 +351,33 @@ "/site-packages"))) (mkdir-p (dirname target)) (rename-file idlelib target)))))))) + (add-after 'move-idle 'rebuild-bytecode + (lambda* (#:key outputs #:allow-other-keys) + (let ((out (assoc-ref outputs "out"))) + ;; Disable hash randomization to ensure the generated .pycs + ;; are reproducible. + (setenv "PYTHONHASHSEED" "0") + (for-each + (lambda (output) + (for-each (lambda (opt) + (format #t "Compiling with optimization level: ~a\n" + (if (null? opt) "none" (car opt))) + (apply invoke + `(,,(if (%current-target-system) + "python2" + '(string-append out "/bin/python")) + ,@opt + "-m" "compileall" + "-f" ; force rebuild + ;; Don't build lib2to3, because it contains + ;; Python 3 code. + "-x" "lib2to3/.*" + ,output))) + ;; Python 2 has a single file extension (.pyo) for the + ;; chosen level of optimization, so it doesn't make + ;; sense to byte compile with more than one level. + (list '() '("-OO")))) + (map cdr outputs))))) (add-after 'install 'install-sitecustomize.py ,(customize-site version))))) (inputs @@ -534,25 +537,29 @@ data types.") ;; are reproducible. (setenv "PYTHONHASHSEED" "0") - ;; XXX: Delete existing auto-generated pycs beforehand because - ;; the -f argument does not necessarily overwrite all files, - ;; leading to indeterministic results. - (for-each (lambda (pyc) - (delete-file pyc)) - (find-files out "\\.pyc$")) + (for-each (lambda (output) + ;; XXX: Delete existing pycs generated by the build + ;; system beforehand because the -f argument does + ;; not necessarily overwrite all files, leading to + ;; indeterministic results. + (for-each (lambda (pyc) + (delete-file pyc)) + (find-files output "\\.pyc$")) - (apply invoke - `(,,(if (%current-target-system) - "python3" - '(string-append out - "/bin/python3")) - "-m" "compileall" - "-o" "0" "-o" "1" "-o" "2" - "-f" ; force rebuild - "--invalidation-mode=unchecked-hash" - ;; Don't build lib2to3, because it's Python 2 code. - "-x" "lib2to3/.*" - ,out))))) + (apply invoke + `(,,(if (%current-target-system) + "python3" + '(string-append out + "/bin/python3")) + "-m" "compileall" + "-o" "0" "-o" "1" "-o" "2" + "-f" ; force rebuild + "--invalidation-mode=unchecked-hash" + ;; Don't build lib2to3, because it's + ;; Python 2 code. + "-x" "lib2to3/.*" + ,output))) + (map cdr outputs))))) (replace 'install-sitecustomize.py ,(customize-site version)))))) (native-inputs