Skip to contentSkip to conversation

python3: add patch to fix PEP 3147 issue with automake built packages

PATCH Superseded Christophe Vu-Brugier 4 participants 7 messages Aug 31, 2015 – Nov 14, 2015

v2 of 3 Superseded Latest is v3 →

lore
Share & tools
lore
#0 lore raw

PATCH v2 1/1 python3: add patch to fix PEP 3147 issue with automake built packages

Packages built with automake use a py-compile helper to byte-compile Python source files. This script uses the "py_compile" module from the standard library. In turn, the compile() function in the "py_compile" module invokes the cache_from_source() function provided by importlib.

This commit adds a new patch named "020-importlib-no-pep3147.patch" that changes cache_from_source() and source_from_cache() in importlib to get rid of the "__pycache__" directory.

This commit fixes the following import error in kmod when the module is built for Python 3:

Quoted 1 line
Quoted 1 line
Quoted 1 line

from kmod import Kmod

Traceback (most recent call last):

    File "<stdin>", line 1, in <module>

ImportError: cannot import name 'Kmod'

Moreover, this commit removes two patches that are no longer necessary since modifying cache_from_source() and source_from_cache() disables PEP 3147 for the standard library and distutils / setuptools.

* 004-old-stdlib-cache.patch
* 016-distutils-no-pep3147.patch

---
Changes since v1:
* remove patches 004 and 016 as suggested by Thomas Petazzoni

---
 package/python3/004-old-stdlib-cache.patch     | 78 --------------------------
 package/python3/005-pyc-pyo-conditional.patch  |  8 +--
 package/python3/016-distutils-no-pep3147.patch | 36 ------------
 package/python3/020-importlib-no-pep3147.patch | 69 +++++++++++++++++++++++
 4 files changed, 73 insertions(+), 118 deletions(-)
 delete mode 100644 package/python3/004-old-stdlib-cache.patch
 delete mode 100644 package/python3/016-distutils-no-pep3147.patch
 create mode 100644 package/python3/020-importlib-no-pep3147.patch
package/python3/004-old-stdlib-cache.patch deleted +0 -78
deleted file mode 100644
index 9ed7e59..0000000
@@ -1,78 +0,0 @@
-python3: Fix pyc-only related runtime exceptions
-
-Python3 changes the pyc lookup strategy, ignoring the
-__pycache__ directory if the .py file is missing. Change
-install location to enable use of .pyc without their parent .py
-
-See http://www.python.org/dev/peps/pep-3147
-
-Signed-off-by: Daniel Nelson <[email protected]>
-
-Index: b/configure.ac
-===================================================================
---- a/configure.ac
-+++ b/configure.ac
-@@ -352,6 +352,23 @@
- AC_SUBST(FRAMEWORKUNIXTOOLSPREFIX)
- AC_SUBST(FRAMEWORKINSTALLAPPSPREFIX)
- 
-+STDLIB_CACHE_FLAGS=
-+AC_MSG_CHECKING(for --enable-old-stdlib-cache)
-+AC_ARG_ENABLE(old-stdlib-cache,
-+    AS_HELP_STRING([--enable-old-stdlib-cache], [enable pre-pep3147 stdlib cache]),
-+[
-+    if test "$enableval" = "yes"
-+    then
-+        STDLIB_CACHE_FLAGS="-b"
-+    else
-+        STDLIB_CACHE_FLAGS="" 
-+    fi
-+],
-+[
-+    STDLIB_CACHE_FLAGS="" 
-+])
-+AC_SUBST(STDLIB_CACHE_FLAGS)
-+
- ##AC_ARG_WITH(dyld,
- ##            AS_HELP_STRING([--with-dyld],
- ##                           [Use (OpenStep|Rhapsody) dynamic linker]))
-Index: b/Makefile.pre.in
-===================================================================
---- a/Makefile.pre.in
-+++ b/Makefile.pre.in
-@@ -162,6 +162,9 @@
- # Options to enable prebinding (for fast startup prior to Mac OS X 10.3)
- OTHER_LIBTOOL_OPT=@OTHER_LIBTOOL_OPT@
- 
-+# Option to enable old-style precompiled stdlib
-+STDLIB_CACHE_FLAGS=@STDLIB_CACHE_FLAGS@
-+
- # Environment to run shared python without installed libraries
- RUNSHARED=       @RUNSHARED@
- 
-@@ -1247,21 +1250,21 @@
- 	fi
- 	-PYTHONPATH=$(DESTDIR)$(LIBDEST)  $(RUNSHARED) \
- 		$(PYTHON_FOR_BUILD) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \
--		-d $(LIBDEST) -f \
-+		-d $(LIBDEST) -f $(STDLIB_CACHE_FLAGS) \
- 		-x 'bad_coding|badsyntax|site-packages|lib2to3/tests/data' \
- 		$(DESTDIR)$(LIBDEST)
- 	-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
- 		$(PYTHON_FOR_BUILD) -Wi -O $(DESTDIR)$(LIBDEST)/compileall.py \
--		-d $(LIBDEST) -f \
-+		-d $(LIBDEST) -f $(STDLIB_CACHE_FLAGS) \
- 		-x 'bad_coding|badsyntax|site-packages|lib2to3/tests/data' \
- 		$(DESTDIR)$(LIBDEST)
- 	-PYTHONPATH=$(DESTDIR)$(LIBDEST)  $(RUNSHARED) \
- 		$(PYTHON_FOR_BUILD) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \
--		-d $(LIBDEST)/site-packages -f \
-+		-d $(LIBDEST)/site-packages -f $(STDLIB_CACHE_FLAGS) \
- 		-x badsyntax $(DESTDIR)$(LIBDEST)/site-packages
- 	-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
- 		$(PYTHON_FOR_BUILD) -Wi -O $(DESTDIR)$(LIBDEST)/compileall.py \
--		-d $(LIBDEST)/site-packages -f \
-+		-d $(LIBDEST)/site-packages -f $(STDLIB_CACHE_FLAGS) \
- 		-x badsyntax $(DESTDIR)$(LIBDEST)/site-packages
- 	-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
- 		$(PYTHON_FOR_BUILD) -m lib2to3.pgen2.driver $(DESTDIR)$(LIBDEST)/lib2to3/Grammar.txt
package/python3/005-pyc-pyo-conditional.patch +4 -4
index c3b159d..0d60ff6 100644
@@ -9,27 +9,27 @@ Index: b/Makefile.pre.in
 +ifeq (@PYC_BUILD@,yes)
  	-PYTHONPATH=$(DESTDIR)$(LIBDEST)  $(RUNSHARED) \
  		$(PYTHON_FOR_BUILD) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \
- 		-d $(LIBDEST) -f $(STDLIB_CACHE_FLAGS) \
+ 		-d $(LIBDEST) -f \
  		-x 'bad_coding|badsyntax|site-packages|lib2to3/tests/data' \
  		$(DESTDIR)$(LIBDEST)
 +endif
 +ifeq (@PYO_BUILD@,yes)
  	-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
  		$(PYTHON_FOR_BUILD) -Wi -O $(DESTDIR)$(LIBDEST)/compileall.py \
- 		-d $(LIBDEST) -f $(STDLIB_CACHE_FLAGS) \
+ 		-d $(LIBDEST) -f \
  		-x 'bad_coding|badsyntax|site-packages|lib2to3/tests/data' \
  		$(DESTDIR)$(LIBDEST)
 +endif
 +ifeq (@PYC_BUILD@,yes)
  	-PYTHONPATH=$(DESTDIR)$(LIBDEST)  $(RUNSHARED) \
  		$(PYTHON_FOR_BUILD) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \
- 		-d $(LIBDEST)/site-packages -f $(STDLIB_CACHE_FLAGS) \
+ 		-d $(LIBDEST)/site-packages -f \
  		-x badsyntax $(DESTDIR)$(LIBDEST)/site-packages
 +endif
 +ifeq (@PYO_BUILD@,yes)
  	-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
  		$(PYTHON_FOR_BUILD) -Wi -O $(DESTDIR)$(LIBDEST)/compileall.py \
- 		-d $(LIBDEST)/site-packages -f $(STDLIB_CACHE_FLAGS) \
+ 		-d $(LIBDEST)/site-packages -f \
  		-x badsyntax $(DESTDIR)$(LIBDEST)/site-packages
 +endif
  	-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
package/python3/016-distutils-no-pep3147.patch deleted +0 -36
deleted file mode 100644
index 0fdfeb2..0000000
@@ -1,36 +0,0 @@
-Add distutils fix for PEP 3147 issue
-
-Python 3 has a new standard for installing .pyc file, called PEP
-3147. Unfortunately, this standard requires both the .py and .pyc
-files to be installed for a Python module to be found. This is quite
-annoying on space-constrained embedded systems, since the .py file is
-technically not required for execution.
-
-For the Python standard library, our Python 3 package already contains
-a patch named python3-004-old-stdlib-cache.patch, which allows to
-disable the PEP 3147 installation.
-
-But that lives the distutils/setuptools package an unsolved
-problem. This patch therefore adds a new patch to Python, which makes
-distutils package use the traditional installation path when byte
-compiling, rather than the PEP 3147 installation path. Since
-setuptools relies on distutils internally, it also fixes setuptools
-based packages.
-
-Signed-off-by: Thomas Petazzoni <[email protected]>
-
-Index: b/Lib/distutils/util.py
-===================================================================
---- a/Lib/distutils/util.py
-+++ b/Lib/distutils/util.py
-@@ -437,7 +437,9 @@
-             # Terminology from the py_compile module:
-             #   cfile - byte-compiled file
-             #   dfile - purported source filename (same as 'file' by default)
--            if optimize >= 0:
-+            if "_python_sysroot" in os.environ:
-+                cfile = file + (__debug__ and "c" or "o")
-+            elif optimize >= 0:
-                 cfile = importlib.util.cache_from_source(
-                     file, debug_override=not optimize)
-             else:
package/python3/020-importlib-no-pep3147.patch new file +69 -0

69 lines not on this page · raw message

Signature · 1 line
2.5.0
#1 lore raw

PATCH v2 1/1 python3: add patch to fix PEP 3147 issue with automake built packages

Dear Christophe Vu-Brugier,

Quoted 21 lines · Christophe Vu-Brugier

Packages built with automake use a py-compile helper to byte-compile Python source files. This script uses the "py_compile" module from the standard library. In turn, the compile() function in the "py_compile" module invokes the cache_from_source() function provided by importlib.

This commit adds a new patch named "020-importlib-no-pep3147.patch" that changes cache_from_source() and source_from_cache() in importlib to get rid of the "__pycache__" directory.

This commit fixes the following import error in kmod when the module is built for Python 3:

Quoted 1 line
Quoted 1 line
Quoted 1 line

from kmod import Kmod

Traceback (most recent call last):

    File "<stdin>", line 1, in <module>

ImportError: cannot import name 'Kmod'

Moreover, this commit removes two patches that are no longer necessary since modifying cache_from_source() and source_from_cache() disables PEP 3147 for the standard library and distutils / setuptools.

Quoted 8 lines

* 004-old-stdlib-cache.patch
* 016-distutils-no-pep3147.patch

---
Changes since v1:
* remove patches 004 and 016 as suggested by Thomas Petazzoni

Applied, thanks.

Thomas

Signature · 3 lines
Thomas Petazzoni, CTO, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com
#2 lore raw

PATCH v2 1/1 python3: add patch to fix PEP 3147 issue with automake built packages

Hello Christophe,

In fact, it seems that this patch might be causing some Python 3 build issues. See
http://autobuild.buildroot.org/results/06e/06e7c654a10a7618c0c64c57bfd9f27e770138fc/build-end.log.

Can you have a look?

Thanks!

Thomas

Quoted 36 lines · Thomas Petazzoni

Dear Christophe Vu-Brugier,

Quoted 21 lines · Christophe Vu-Brugier

Packages built with automake use a py-compile helper to byte-compile Python source files. This script uses the "py_compile" module from the standard library. In turn, the compile() function in the "py_compile" module invokes the cache_from_source() function provided by importlib.

This commit adds a new patch named "020-importlib-no-pep3147.patch" that changes cache_from_source() and source_from_cache() in importlib to get rid of the "__pycache__" directory.

This commit fixes the following import error in kmod when the module is built for Python 3:

Quoted 1 line
Quoted 1 line
Quoted 1 line

from kmod import Kmod

Traceback (most recent call last):

    File "<stdin>", line 1, in <module>

ImportError: cannot import name 'Kmod'

Moreover, this commit removes two patches that are no longer necessary since modifying cache_from_source() and source_from_cache() disables PEP 3147 for the standard library and distutils / setuptools.

Quoted 8 lines

* 004-old-stdlib-cache.patch
* 016-distutils-no-pep3147.patch

---
Changes since v1:
* remove patches 004 and 016 as suggested by Thomas Petazzoni

Applied, thanks.

Thomas

Signature · 3 lines
Thomas Petazzoni, CTO, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com
#3 lore raw

PATCH v2 1/1 python3: add patch to fix PEP 3147 issue with automake built packages

Hi Thomas,

Quoted 5 lines · Thomas Petazzoni

In fact, it seems that this patch might be causing some Python 3 build issues. See
http://autobuild.buildroot.org/results/06e/06e7c654a10a7618c0c64c57bfd9f27e770138fc/build-end.log.

Can you have a look?

Sorry for the late reply.

Here is a short explanation for the error. The Makefile defines a rule to regenerate "Python/importlib.h" if "Lib/importlib/_bootstrap.py" is modified using a C helper named _freeze_importlib. Since "_boostrap.py" is modified by my patch, the rule is invoked. The problem is that the helper is built for the target so it cannot be executed on the host.

If I understand correctly "importlib.h" is a frozen module: it contains bytecode generated from "_bootstrap.py". It is only used by a dummy "frozen.c" program.

I see two options:

1/ Patch the Makefile to invoke a version of _freeze_importlib built
for the host.
2/ Simply do not regenerate "importlib.h" because it is not used.

I would favor the second option.

With best regards,

Signature · 1 line
Christophe Vu-Brugier
#4 lore raw

PATCH v2 1/1 python3: add patch to fix PEP 3147 issue with automake built packages

Quoted 18 lines · Christophe Vu-Brugier

Hi Thomas,

Quoted 5 lines · Thomas Petazzoni

In fact, it seems that this patch might be causing some Python 3 build issues. See
http://autobuild.buildroot.org/results/06e/06e7c654a10a7618c0c64c57bfd9f27e770138fc/build-end.log.

Can you have a look?

Sorry for the late reply.

Here is a short explanation for the error. The Makefile defines a rule to regenerate "Python/importlib.h" if "Lib/importlib/_bootstrap.py" is modified using a C helper named _freeze_importlib. Since "_boostrap.py" is modified by my patch, the rule is invoked. The problem is that the helper is built for the target so it cannot be executed on the host.

Quoted 3 lines

If I understand correctly "importlib.h" is a frozen module: it contains bytecode generated from "_bootstrap.py". It is only used by a dummy "frozen.c" program.

Isn't importlib.h installed to STAGING_DIR where it could be picked up by other
modules?

Quoted 6 lines

I see two options:

1/ Patch the Makefile to invoke a version of _freeze_importlib built
for the host.
2/ Simply do not regenerate "importlib.h" because it is not used.

Most likely, the generated importlib.h doesn't change due to your patch. So the
simplest solution is to do a 'touch $(@D)/Python/importlib.h' in a post-patch hook (with a large comment explaining why it is necessary and allowed).

Regards,
Arnout

Quoted 5 lines

I would favor the second option.

With best regards,

Signature · 6 lines
Arnout Vandecappelle                          arnout at mind be
Senior Embedded Software Architect            +32-16-286500
Essensium/Mind                                http://www.mind.be
G.Geenslaan 9, 3001 Leuven, Belgium           BE 872 984 063 RPR Leuven
LinkedIn profile: http://www.linkedin.com/in/arnoutvandecappelle
GPG fingerprint:  7493 020B C7E3 8618 8DEC 222C 82EB F404 F9AC 0DDF
#5 lore raw

PATCH v2 1/1 python3: add patch to fix PEP 3147 issue with automake built packages

Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line

"Arnout" == Arnout Vandecappelle <[email protected]> writes:

Hi,

Quoted 5 lines
Quoted 1 line

2/ Simply do not regenerate "importlib.h" because it is not used.

Most likely, the generated importlib.h doesn't change due to your patch. So the
simplest solution is to do a 'touch $(@D)/Python/importlib.h' in a post-patch hook (with a large comment explaining why it is necessary and allowed).

Yes, sounds sensible. Christophe, care to send a patch?

Signature · 1 line
Bye, Peter Korsgaard
#6 lore raw

PATCH v2 1/1 python3: add patch to fix PEP 3147 issue with automake built packages

Hi,

Quoted 11 lines · Peter Korsgaard
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line

"Arnout" == Arnout Vandecappelle <[email protected]> writes:

Hi,

Quoted 7 lines
Quoted 2 lines

2/ Simply do not regenerate "importlib.h" because it is not used.

Most likely, the generated importlib.h doesn't change due to your
patch. So the simplest solution is to do a 'touch $(@D)/Python/importlib.h' in a post-patch hook (with a large comment explaining why it is necessary and allowed).

Well importlib.h is changed because it contains the bytecode of _bootstrap.py which is patched. However, importlib.h is not installed in staging and Debian does not ship the header even in development packages so it's useless.

Quoted 1 line

Yes, sounds sensible. Christophe, care to send a patch?

Patch sent with subject "[PATCH v3] python3: add patch to fix PEP 3147 issue with automake built packages".

Thanks and best regards,

Signature · 1 line
Christophe Vu-Brugier