Re: [OE-core][PATCH 0/5 v2] python3: upgrade 3.13.9 -> 3.14.2

Mathieu Dubois-Briand
2025-12-22T08:11:59Z

On Fri Dec 19, 2025 at 2:47 PM CET, Trevor Gamblin wrote:
> Compared to v1
> (https://lists.openembedded.org/g/openembedded-core/message/227955):
>
> - Drop python3-bcrypt upgrade, as someone else has submitted that;
> - Drop rpm patch to manually override Python3_SITEARCH with a patch, as that was
> masking the real issue (see below);
> - Add a new patch to fix python3targetconfig by exporting _PYTHON_PROJECT_BASE,
> which Python's sysconfig looks for (as of 3.14.0) when doing
> cross-compilation. The absence of this was resulting in packages like rpm
> finding paths for the native interpreter when making use of sysconfig, when
> they needed the host values.
>
> Note that I've dropped my own version of the python3-bcrypt upgrade, but I
> tested this patch series on top of the other one that was submitted, as
> otherwise the ptest images would break during build (version mismatch errors
> around PyO3, which is fixed with the bcrypt upgrade).
>
> v1 details below.
>
> This supersedes a previous series sent, which only did the 3.14.0 upgrade.
>
> Compared to the first series
> (https://lists.openembedded.org/g/openembedded-core/message/227310), I've
> done the following:
>
> - Added a commit for including the '_py_warnings' and 'annotationlib' modules in
> python3-core;
> - Adds the python 3.14.2 upgrade;
> - Removed commits for adding python3-misc to RDEPENDS for python3-pytest and
> python3-jsonpointer, as these are now solved by a new patch to add new modules
> to python3-core in the manifest. Doing it this way was fragile in the sense
> that there were many other recipes needing this same fix that testing didn't
> easily catch, and it doesn't make sense to add python3-misc to recipe RDEPENDS
> just because (for example) python3-logging (another package split) is trying
> to make use of warnings, but can't find the right module;
> - Modified the rpm commit to apply a patch (submitted upstream) to fix
> CMakeLists.txt, rather than a do_configure prepend;
> - Fixed the Python 3.14.0 upgrade commit so that one of the patches we carry to
> skip tests doesn't include duplicate calls to the relevant skip functions.
>
> I've kept the upgrades from 3.13.9 to 3.14.0 and 3.14.0 to 3.14.2 separate to
> reflect separate testing and let people review those changelogs individually if
> desired.
>
> Trevor Gamblin (5):
> python3: upgrade 3.13.9 -> 3.14.0
> python3targetconfig: export _PYTHON_PROJECT_BASE
> python_pep517: add --prefix to nativepython3 call
> python3: upgrade 3.14.0 -> 3.14.2
> python3: add _py_warnings, annotationlib to core
>

Hi Trevor,

Thanks for the new version. It looks like we are having issues with
maturin and click.

Testing 'maturin develop' requires Rust cross-canadian in the SDK
Traceback (most recent call last):
File "/srv/pokybuild/yocto-worker/qemux86/build/layers/openembedded-core/meta/lib/oeqa/sdk/cases/maturin.py", line 30, in test_maturin_list_python
self.assertIn(expected, output)
~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^
AssertionError: '3.14 at /srv/pokybuild/yocto-worker/qemux86/build/build/tmp/work/qemux86-poky-linux/core-image-minimal/1.0/testsdkext/buildtools/sysroots/x86_64-pokysdk-linux/usr/bin/python3' not found in '🐍 1 python interpreter found:\n - CPython 3.13 at /srv/pokybuild/yocto-worker/qemux86/build/buildtools/sysroots/x86_64-pokysdk-linux/usr/bin/python3.13\n'
...
RESULTS - maturin.MaturinTest.test_maturin_list_python: FAILED (3.57s)

https://autobuilder.yoctoproject.org/valkyrie/#/builders/30/builds/2876
https://autobuilder.yoctoproject.org/valkyrie/#/builders/36/builds/2900
https://autobuilder.yoctoproject.org/valkyrie/#/builders/45/builds/837

AssertionError:
Failed ptests:
{'python3-click': 'START: ptest-runner\n'
'2025-12-21T20:15\n'
'\n'
'../../python3.14/ast.py:620: in unparse\n'
' unparser = _Unparser()\n'
' ^^^^^^^^^\n'
"E NameError: name '_Unparser' is not defined\n"
'\n'
'During handling of the above exception, another exception '
'occurred:\n'
'../../python3.14/site-packages/pluggy/_hooks.py:512: in '
'__call__\n'
' return self._hookexec(self.name, '
'self._hookimpls.copy(), kwargs, firstresult)\n'
' '
'^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n'
'../../python3.14/site-packages/pluggy/_manager.py:120: in '
'_hookexec\n'
' return self._inner_hookexec(hook_name, methods, kwargs, '
'firstresult)\n'
' '
'^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n'
'../../python3.14/site-packages/_pytest/python.py:240: in '
'pytest_pycollect_makeitem\n'
' return list(collector._genfunctions(name, obj))\n'
' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n'
'../../python3.14/site-packages/_pytest/python.py:448: in '
'_genfunctions\n'
' definition = FunctionDefinition.from_parent(self, '
'name=name, callobj=funcobj)\n'
' '
'^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n'
'../../python3.14/site-packages/_pytest/python.py:1625: in '
'from_parent\n'
' return super().from_parent(parent=parent, **kw)\n'
' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n'
'../../python3.14/site-packages/_pytest/nodes.py:233: in '
'from_parent\n'
' return cls._create(parent=parent, **kw)\n'
' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n'
'../../python3.14/site-packages/_pytest/nodes.py:110: in '
'_create\n'
' return super().__call__(*k, **kw) # type: '
'ignore[no-any-return,misc]\n'
' ^^^^^^^^^^^^^^^^^^^^^^^^^^\n'
'../../python3.14/site-packages/_pytest/python.py:1616: in '
'__init__\n'
' fixtureinfo = fm.getfixtureinfo(self, self.obj, '
'self.cls)\n'
' '
'^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n'
'../../python3.14/site-packages/_pytest/fixtures.py:1565: in '
'getfixtureinfo\n'
' argnames = getfuncargnames(func, name=node.name, '
'cls=cls)\n'
' '
'^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n'
'../../python3.14/site-packages/_pytest/compat.py:136: in '
'getfuncargnames\n'
' parameters = signature(function).parameters.values()\n'
' ^^^^^^^^^^^^^^^^^^^\n'
'../../python3.14/site-packages/_pytest/compat.py:70: in '
'signature\n'
' return inspect.signature(obj, '
'annotation_format=Format.STRING)\n'
' '
'^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n'
'../../python3.14/inspect.py:3321: in signature\n'
' return Signature.from_callable(obj, '
'follow_wrapped=follow_wrapped,\n'
'../../python3.14/inspect.py:3036: in from_callable\n'
' return _signature_from_callable(obj, sigcls=cls,\n'
'../../python3.14/inspect.py:2511: in '
'_signature_from_callable\n'
' return _signature_from_function(sigcls, obj,\n'
'../../python3.14/inspect.py:2334: in '
'_signature_from_function\n'
' annotations = get_annotations(func, globals=globals, '
'locals=locals, eval_str=eval_str,\n'
'../../python3.14/annotationlib.py:981: in get_annotations\n'
' ann = _get_and_call_annotate(obj, format)\n'
' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n'
'../../python3.14/annotationlib.py:1112: in '
'_get_and_call_annotate\n'
' ann = call_annotate_function(annotate, format, '
'owner=obj)\n'
' '
'^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n'
'../../python3.14/annotationlib.py:750: in '
'call_annotate_function\n'
' key: _stringify_single(val)\n'
' ^^^^^^^^^^^^^^^^^^^^^^\n'
'../../python3.14/annotationlib.py:883: in '
'_stringify_single\n'
' return repr(anno)\n'
' ^^^^^^^^^^\n'
'../../python3.14/annotationlib.py:487: in __repr__\n'
' return ast.unparse(self.__ast_node__)\n'
' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n'
'../../python3.14/ast.py:622: in unparse\n'
' from _ast_unparse import Unparser as _Unparser\n'
"E ModuleNotFoundError: No module named '_ast_unparse'\n"
'ERROR: '
'tests/test_shell_completion.py:tests/test_shell_completion.py\n'
'============================================================================\n'
'Testsuite summary\n'
'# TOTAL: 1\n'
'# PASS: 0\n'
'# SKIP: 0\n'
'# XFAIL: 0\n'
'# FAIL: 0\n'
'# XPASS: 0\n'
'# ERROR: 1\n'
'\n'
'ERROR: Exit status is 2\n'
'DURATION: 28\n'}

ptests which had no test results:
['python3-click']

https://autobuilder.yoctoproject.org/valkyrie/#/builders/56/builds/860
https://autobuilder.yoctoproject.org/valkyrie/#/builders/61/builds/2751
https://autobuilder.yoctoproject.org/valkyrie/#/builders/73/builds/2794

Ptest logs can be found here:

http://valkyrie.yocto.io/pub/non-release/20251221-102/testresults/qemuriscv64-ptest/core-image-ptest-python3-click/
http://valkyrie.yocto.io/pub/non-release/20251221-102/testresults/qemuarm64-ptest/core-image-ptest-python3-click/
http://valkyrie.yocto.io/pub/non-release/20251221-102/testresults/qemux86-64-ptest/core-image-ptest-python3-click/

Can you have a look at these failures?

Thanks,
Mathieu

--
Mathieu Dubois-Briand, Bootlin
Embedded Linux and Kernel engineering