diff options
author | Mike Frysinger <vapier@gentoo.org> | 2022-02-06 01:25:59 -0500 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2022-02-23 23:48:55 -0500 |
commit | bde43d0481ff540418271ac37012a574a4fcf097 (patch) | |
tree | a5dc801faf6d7b982ebf488f149f40981abace4a | |
parent | d5dc4e0aeca11a998396f5328ce2a12fa2afd9af (diff) | |
download | automake-bde43d0481ff540418271ac37012a574a4fcf097.tar.gz |
py-compile: fix optimized compiling for Python 3.5+
Fixes automake bug https://bugs.gnu.org/38043.
Split the optimized compilation logic into a new section. This avoids
trying to support multiple versions of major versions in a single script
as it gets harder to verify new changes don't break old versions as time
goes on.
Now for Python 3.5+, compile with -O0 (which is "higher" than -O).
* NEWS: Mention fix.
* THANKS: Add Michal Górny.
* lib/py-compile: Add new section for compiling Python 3.5+.
-rw-r--r-- | NEWS | 3 | ||||
-rw-r--r-- | THANKS | 3 | ||||
-rwxr-xr-x | lib/py-compile | 57 |
3 files changed, 61 insertions, 2 deletions
@@ -10,6 +10,9 @@ New in 1.17: - When compiling emacs lisp files, emacs is run with --no-site-file to disable user config files that might hang or access the terminal. + - Compiling Python modules with Python 3.5+ will use multiple optimization + levels now. + * New features added - RANLIB may be overridden on a per-target basis. @@ -244,7 +244,7 @@ Leonardo Boiko leoboiko@conectiva.com.br Libor Bukata libor.bukata@oracle.com Loulou Pouchet loulou@lrde.epita.fr Ludovic Courtès ludo@gnu.org -Lukas Fleischer lfleischer@lfos.de +Lukas Fleischer lfleischer@lfos.de Luo Yi luoyi.ly@gmail.com Maciej Stachowiak mstachow@mit.edu Maciej W. Rozycki macro@ds2.pg.gda.pl @@ -286,6 +286,7 @@ Michael Daniels mdaniels@rim.com Michael Hofmann mhofma@googlemail.com Michael Ploujnikov ploujj@gmail.com Michael Zucchi notzed@gmail.com +Michał Górny mgorny@gentoo.org Michel de Ruiter mdruiter@cs.vu.nl Mike Castle dalgoda@ix.netcom.com Mike Frysinger vapier@gentoo.org diff --git a/lib/py-compile b/lib/py-compile index 6295b2dac..24a8a1a54 100755 --- a/lib/py-compile +++ b/lib/py-compile @@ -131,6 +131,13 @@ case $python_major in ;; esac +python_minor=`$PYTHON -c 'import sys; print(sys.version_info[1])'` + +# NB: When adding support for newer versions, prefer copying & adding new cases +# rather than try to keep things merged with shell variables. + +# First byte compile (no optimization) all the modules. +# This works for all currently known Python versions. $PYTHON -c " import sys, os, py_compile, importlib @@ -149,7 +156,10 @@ for file in sys.argv[1:]: py_compile.compile(filepath, filepath + 'c', path) sys.stdout.write('\n')" "$@" || exit $? -$PYTHON -O -c " +# Then byte compile w/optimization all the modules. +case $python_major.$python_minor in +2.*) + $PYTHON -O -c " import sys, os, py_compile, importlib # pypy does not use .pyo optimization @@ -170,6 +180,51 @@ for file in sys.argv[1:]: else: py_compile.compile(filepath, filepath + 'o', path) sys.stdout.write('\n')" "$@" 2>/dev/null || exit $? + ;; +*) # Python 3+ + $PYTHON -O -c " +import sys, os, py_compile, importlib + +print('Byte-compiling python modules (optimized versions) ...') +for file in sys.argv[1:]: + $pathtrans + $filetrans + if not os.path.exists(filepath) or not (len(filepath) >= 3 + and filepath[-3:] == '.py'): + continue + print(file, end=' ', flush=True) + if hasattr(sys.implementation, 'cache_tag'): + py_compile.compile(filepath, importlib.util.cache_from_source(filepath), path) + else: + py_compile.compile(filepath, filepath + 'o', path) +print()" "$@" 2>/dev/null || exit $? + ;; +esac + +# Then byte compile w/more optimization. +case $python_major.$python_minor in +2.*|3.[0-4]) + ;; +*) # Python 3.5+ + # See https://bugs.gnu.org/38043 for background. + $PYTHON -OO -c " +import sys, os, py_compile, imp + +print('Byte-compiling python modules (-OO version) ...') +for file in sys.argv[1:]: + $pathtrans + $filetrans + if not os.path.exists(filepath) or not (len(filepath) >= 3 + and filepath[-3:] == '.py'): + continue + print(file, end=' ', flush=True) + if hasattr(imp, 'get_tag'): + py_compile.compile(filepath, imp.cache_from_source(filepath), path) + else: + py_compile.compile(filepath, filepath + 'o', path) +print()" "$@" 2>/dev/null || exit $? + ;; +esac # Local Variables: # mode: shell-script |