diff options
author | Michał Górny <mgorny@gentoo.org> | 2023-02-26 16:06:16 +0100 |
---|---|---|
committer | Michał Górny <mgorny@gentoo.org> | 2023-02-26 16:25:10 +0100 |
commit | 06668ccb9dd2920b55fc01fb5bc6a24129e69421 (patch) | |
tree | bab968738e4634b83464d16f7562e8efca7f17a3 /dev-python/pycparser | |
parent | dev-libs/libgit2: Disable experimental SHA256 support (diff) | |
download | gentoo-06668ccb9dd2920b55fc01fb5bc6a24129e69421.tar.gz gentoo-06668ccb9dd2920b55fc01fb5bc6a24129e69421.tar.bz2 gentoo-06668ccb9dd2920b55fc01fb5bc6a24129e69421.zip |
dev-python/pycparser: Backport lextab.py build failure fix
Closes: https://bugs.gentoo.org/701878
Signed-off-by: Michał Górny <mgorny@gentoo.org>
Diffstat (limited to 'dev-python/pycparser')
-rw-r--r-- | dev-python/pycparser/files/pycparser-2.21-lextab-cache.patch | 66 | ||||
-rw-r--r-- | dev-python/pycparser/pycparser-2.21-r1.ebuild | 5 | ||||
-rw-r--r-- | dev-python/pycparser/pycparser-2.21-r2.ebuild | 5 |
3 files changed, 76 insertions, 0 deletions
diff --git a/dev-python/pycparser/files/pycparser-2.21-lextab-cache.patch b/dev-python/pycparser/files/pycparser-2.21-lextab-cache.patch new file mode 100644 index 000000000000..d24999e7273a --- /dev/null +++ b/dev-python/pycparser/files/pycparser-2.21-lextab-cache.patch @@ -0,0 +1,66 @@ +From 35a279ecb9af41a6f95ddbc6a0f1beaa2472d165 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= <mgorny@gentoo.org> +Date: Sun, 26 Feb 2023 01:04:34 +0100 +Subject: [PATCH] _build_tables: Invalidate cache before importing generated + modules (#494) + +Make sure to invalidate finder caches before trying to import generated +modules. This is necessary according to the Python documentation: +https://docs.python.org/3/library/importlib.html#importlib.invalidate_caches + +This fixes a hard-to-reproduce bug that Python would be unable to find +just-generated `lextab.py` if mtime of the current directory did not +change from the moment the script was started. This could +e.g. be the case if one has second-precision timestamps and removes +the generated file just before starting the build, e.g.: + + $ rm pycparser/lextab.py; python -m build -nw + +It could also be reproduced easier by doing something like: + + $ cd pycparser + $ touch .; python -B _build_tables.py + Traceback (most recent call last): + File "/var/tmp/pycparser/pycparser/_build_tables.py", line 38, in <module> + import lextab + ModuleNotFoundError: No module named 'lextab' + +This is because the first command (`rm` or `touch`) updates the mtime +of the directory to the current time. If the script is run fast enough, +it manages to scan the directory and then write the new `lextab.py` +within the same second. As a result, mtime of the directory after +writing the new file is the same as when the script was started, finder +does not invalidate the cache and assumes that `lextab.py` does not +exist since it did not exist when the directory was scanned earlier. + +This potentially fixes #493. + +It was originally reported on https://bugs.gentoo.org/701878. +Thanks to Gary E. Miller for patience in reproducing the problem +and proxy-debugging it for me, as well as testing the final patch before +submission. +--- + pycparser/_build_tables.py | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/pycparser/_build_tables.py b/pycparser/_build_tables.py +index 958381ad..4f371079 100644 +--- a/pycparser/_build_tables.py ++++ b/pycparser/_build_tables.py +@@ -13,6 +13,7 @@ + # Insert '.' and '..' as first entries to the search path for modules. + # Restricted environments like embeddable python do not include the + # current working directory on startup. ++import importlib + import sys + sys.path[0:0] = ['.', '..'] + +@@ -32,6 +33,8 @@ + + # Load to compile into .pyc + # ++importlib.invalidate_caches() ++ + import lextab + import yacctab + import c_ast diff --git a/dev-python/pycparser/pycparser-2.21-r1.ebuild b/dev-python/pycparser/pycparser-2.21-r1.ebuild index 1b0d8e6f6901..3848eaeedd3a 100644 --- a/dev-python/pycparser/pycparser-2.21-r1.ebuild +++ b/dev-python/pycparser/pycparser-2.21-r1.ebuild @@ -30,6 +30,11 @@ BDEPEND=" distutils_enable_tests unittest python_prepare_all() { + local PATCHES=( + # https://github.com/eliben/pycparser/pull/494 + "${FILESDIR}"/${P}-lextab-cache.patch + ) + # remove the original files to guarantee their regen rm pycparser/{c_ast,lextab,yacctab}.py || die diff --git a/dev-python/pycparser/pycparser-2.21-r2.ebuild b/dev-python/pycparser/pycparser-2.21-r2.ebuild index edebc42725b5..08416104b7d4 100644 --- a/dev-python/pycparser/pycparser-2.21-r2.ebuild +++ b/dev-python/pycparser/pycparser-2.21-r2.ebuild @@ -29,6 +29,11 @@ BDEPEND=" distutils_enable_tests unittest python_prepare_all() { + local PATCHES=( + # https://github.com/eliben/pycparser/pull/494 + "${FILESDIR}"/${P}-lextab-cache.patch + ) + # remove the original files to guarantee their regen rm pycparser/{c_ast,lextab,yacctab}.py || die |