From patchwork Wed Nov 11 14:17:21 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ross Burton X-Patchwork-Id: 103753 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.msgproc01-g2.10403.1794406651725668079 for ; Wed, 11 Nov 2026 06:17:31 -0800 Authentication-Results: mx.groups.io; dkim=fail reason="dkim: body hash did not verify" header.i=@arm.com header.s=foss header.b=ZLtukFXF; spf=pass (domain: arm.com, ip: 217.140.110.172, mailfrom: ross.burton@arm.com) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 1394C1576 for ; Wed, 11 Nov 2026 06:17:28 -0800 (PST) Received: from cesw-amp-gbt-1s-m12830-04.lab.cambridge.arm.com (usa-sjc-imap-foss1.foss.arm.com [10.121.207.14]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id C276E3F632 for ; Wed, 11 Nov 2026 06:17:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1794406651; bh=U70mj18+FJAJ8al1KJYoHNNKOJVBfdB8AXShsni+MBo=; h=From:To:Subject:Date:From; b=ZLtukFXF7LnQXdmgBXgqAUFk6IiAQG2zDoJLXjNnZtbtMAu4ycL7afcA3a2/qo6aL l8VmhV+Uv7s0Oge4SuKCYrrFfVvKn9so53OSIw/NWW8Ke4MnfNqEATXLDWgGqJG2l7 Oxf9ghIm2IC/PWEUbS02Ud/b5nSpdO+hNtiivo9w= From: Ross Burton To: openembedded-core@lists.openembedded.org Subject: [PATCH v2 1/6] python3: remove obsolete reformatting of _sysconfigdata*.py Date: Wed, 11 Nov 2026 14:17:21 +0000 Message-ID: <20261111141726.1496785-1-ross.burton@arm.com> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 X-ARM-No-Footer: NoDisclaimer List-Id: X-Webhook-Received: from 45-33-107-173.ip.linodeusercontent.com [45.33.107.173] by lin-tor-korg-lkml-alma10-1 with HTTPS for ; Wed, 11 Nov 2026 14:17:36 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/openembedded-core/message/250030 The python3 recipe currently reformats the _sysconfigdata*.py files after they are modified to remove build paths, as the files may be wrapped differently based on the length of strings[1]. However, this wrapping was due to the use of pprint.pprint(), which since Python 3.13 is no longer used to generate the sysconfigdata[2]. As such, remove the reformatting as it is no longer needed. [1] oe-core ec8a2b310d5 ("python3: Reformat sysconfig") [2] python 5ecedbd2669 ("gh-106789: avoid importing pprint from sysconfig (#106790)") Signed-off-by: Ross Burton --- .../python/python3/reformat_sysconfig.py | 21 ------------------- .../python/python3_3.14.10.bb | 8 +------ 2 files changed, 1 insertion(+), 28 deletions(-) delete mode 100644 meta/recipes-devtools/python/python3/reformat_sysconfig.py diff --git a/meta/recipes-devtools/python/python3/reformat_sysconfig.py b/meta/recipes-devtools/python/python3/reformat_sysconfig.py deleted file mode 100644 index 5e2b12879d9..00000000000 --- a/meta/recipes-devtools/python/python3/reformat_sysconfig.py +++ /dev/null @@ -1,21 +0,0 @@ -#! /usr/bin/env python3 -# -# SPDX-License-Identifier: MIT -# -# Copyright 2019 by Garmin Ltd. or its subsidiaries -# -# A script to reformat python sysconfig - -import sys -import pprint -l = {} -g = {} -with open(sys.argv[1], 'r') as f: - exec(f.read(), g, l) - -with open(sys.argv[1], 'w') as f: - for k in sorted(l.keys()): - f.write('%s = ' % k) - pprint.pprint(l[k], stream=f, width=1) - f.write('\n') - diff --git a/meta/recipes-devtools/python/python3_3.14.10.bb b/meta/recipes-devtools/python/python3_3.14.10.bb index c50c4d4babc..28e67330d1a 100644 --- a/meta/recipes-devtools/python/python3_3.14.10.bb +++ b/meta/recipes-devtools/python/python3_3.14.10.bb @@ -12,7 +12,6 @@ SRC_URI = "http://www.python.org/ftp/python/${PV}/Python-${PV}.tar.xz \ file://get_module_deps3.py \ file://python3-manifest.json \ file://check_build_completeness.py \ - file://reformat_sysconfig.py \ file://0001-Makefile.pre-use-qemu-wrapper-when-gathering-profile.patch \ file://0001-test_locale.py-correct-the-test-output-format.patch \ file://makerace.patch \ @@ -214,9 +213,6 @@ do_install:append:class-native() { } do_install:append() { - for c in ${D}/${libdir}/python${PYTHON_MAJMIN}/_sysconfigdata*.py; do - python3 ${UNPACKDIR}/reformat_sysconfig.py $c - done rm -f ${D}${libdir}/python${PYTHON_MAJMIN}/__pycache__/_sysconfigdata*.cpython* mkdir -p ${D}${libdir}/python-sysconfigdata @@ -389,10 +385,8 @@ py_package_preprocess () { ${PKGD}/${libdir}/python${PYTHON_MAJMIN}/_sysconfig_vars*.json \ ${PKGD}/${bindir}/python${PYTHON_MAJMIN}-config - # Reformat and recompile _sysconfigdata after modifying it so that it remains - # reproducible + # Recompile _sysconfigdata after modifying it for c in ${PKGD}/${libdir}/python${PYTHON_MAJMIN}/_sysconfigdata*.py; do - python3 ${UNPACKDIR}/reformat_sysconfig.py $c python3 -mcompileall $c -s ${PKGD} -p / done From patchwork Wed Nov 11 14:17:22 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ross Burton X-Patchwork-Id: 103748 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.msgproc01-g2.10405.1794406652451998298 for ; Wed, 11 Nov 2026 06:17:32 -0800 Authentication-Results: mx.groups.io; dkim=fail reason="dkim: body hash did not verify" header.i=@arm.com header.s=foss header.b=U0/9PB3i; spf=pass (domain: arm.com, ip: 217.140.110.172, mailfrom: ross.burton@arm.com) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id E0C0B1576 for ; Wed, 11 Nov 2026 06:17:28 -0800 (PST) Received: from cesw-amp-gbt-1s-m12830-04.lab.cambridge.arm.com (usa-sjc-imap-foss1.foss.arm.com [10.121.207.14]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 5F6BA3F632 for ; Wed, 11 Nov 2026 06:17:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1794406651; bh=oMIWQ7tXVMzW6YfC0G5uU6Kui6kzaz7n+ZGhOZ33o8I=; h=From:To:Subject:Date:In-Reply-To:References:From; b=U0/9PB3iYWLpVq5yXQFxUXV4O1vpjg/W2AGPDb82Ag9dXEaWwRFTNPnSz5nQqUUlj 8XSq9apTB1atAVr+sDY24z9xigca7WCm/NlcHqeWYoz29DaTmpdoUI637PvbMZTUzb Ux5WfcbRtS/+62feFFa0f4R8+gOCC5rifvzy8bZE= From: Ross Burton To: openembedded-core@lists.openembedded.org Subject: [PATCH v2 2/6] python3: compile .pyc at packaging time, remove from manifest Date: Wed, 11 Nov 2026 14:17:22 +0000 Message-ID: <20261111141726.1496785-2-ross.burton@arm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20261111141726.1496785-1-ross.burton@arm.com> References: <20261111141726.1496785-1-ross.burton@arm.com> MIME-Version: 1.0 X-ARM-No-Footer: NoDisclaimer List-Id: X-Webhook-Received: from 45-33-107-173.ip.linodeusercontent.com [45.33.107.173] by lin-tor-korg-lkml-alma10-1 with HTTPS for ; Wed, 11 Nov 2026 14:17:35 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/openembedded-core/message/250031 Currently, the manifest lists both .py files and compiled .pyc files. This results in a large amount of duplication and potential for files to end up in the wrong package. Improve this by not installing the .pyc files directly, and instead using python's compileall module (as upstream's 'make install' does) to build them at packaging time. We can do this after the packages have been split, so the .pyc files are always in the right package. This means we can remove the cache file logic from create_manifest, and all of the cached file lists in the manifest itself. We patch out the standard library compilation at install time to avoid doing that twice, this is important as the compilation takes ~30s on my build machine. There is work upstream to make this optional, so we don't need to carry a patch in the future. The only change to the end result is that the target sysroot for Python is now missing the .pyc files. Signed-off-by: Ross Burton --- .../python/python3/create_manifest3.py | 55 +--- .../python/python3/get_module_deps3.py | 29 -- .../python/python3/no-compile-pyc.patch | 26 ++ .../python/python3/python3-manifest.json | 301 ++---------------- .../python/python3_3.14.10.bb | 63 ++-- 5 files changed, 87 insertions(+), 387 deletions(-) create mode 100644 meta/recipes-devtools/python/python3/no-compile-pyc.patch diff --git a/meta/recipes-devtools/python/python3/create_manifest3.py b/meta/recipes-devtools/python/python3/create_manifest3.py index 288d5ede3a2..5dda382de8f 100644 --- a/meta/recipes-devtools/python/python3/create_manifest3.py +++ b/meta/recipes-devtools/python/python3/create_manifest3.py @@ -30,12 +30,6 @@ # Its also important to note that this method only works for python files, and shared # libraries. Static libraries, header files and binaries need to be dealt with manually. # -# This script differs from its python2 version mostly on how shared libraries are handled -# The manifest file for python3 has an extra field which contains the cached files for -# each package. -# Tha method to handle cached files does not work when a module includes a folder which -# itself contains the pycache folder, gladly this is almost never the case. -# # Author: Alejandro Enedino Hernandez Samaniego @@ -77,12 +71,6 @@ def isFolder(value): else: return False -def isCached(item): - if '__pycache__' in item: - return True - else: - return False - def prepend_comments(comments, json_manifest): with open(json_manifest, 'r+') as manifest: json_contents = manifest.read() @@ -123,12 +111,8 @@ print_indent('Getting dependencies for package: core', 0) output = subprocess.check_output([sys.executable, 'get_module_deps3.py', 'python-core-package', '%s' % debugFlag]).decode('utf8') for coredep in output.split(): coredep = coredep.replace(pyversion,'${PYTHON_MAJMIN}') - if isCached(coredep): - if coredep not in old_manifest['core']['cached']: - old_manifest['core']['cached'].append(coredep) - else: - if coredep not in old_manifest['core']['files']: - old_manifest['core']['files'].append(coredep) + if coredep not in old_manifest['core']['files']: + old_manifest['core']['files'].append(coredep) # The second step is to loop through the existing files contained in the core package @@ -139,12 +123,8 @@ for coredep in output.split(): for filedep in old_manifest['core']['files']: if isFolder(filedep): - if isCached(filedep): - if filedep not in old_manifest['core']['cached']: - old_manifest['core']['cached'].append(filedep) - else: - if filedep not in old_manifest['core']['files']: - old_manifest['core']['files'].append(filedep) + if filedep not in old_manifest['core']['files']: + old_manifest['core']['files'].append(filedep) continue if '${bindir}' in filedep: if filedep not in old_manifest['core']['files']: @@ -175,12 +155,8 @@ for filedep in old_manifest['core']['files']: for pymodule_dep in output.split(): pymodule_dep = pymodule_dep.replace(pyversion,'${PYTHON_MAJMIN}') - if isCached(pymodule_dep): - if pymodule_dep not in old_manifest['core']['cached']: - old_manifest['core']['cached'].append(pymodule_dep) - else: - if pymodule_dep not in old_manifest['core']['files']: - old_manifest['core']['files'].append(pymodule_dep) + if pymodule_dep not in old_manifest['core']['files']: + old_manifest['core']['files'].append(pymodule_dep) # At this point we are done with the core package. @@ -223,12 +199,10 @@ for pypkg in old_manifest: new_manifest[pypkg]['summary'] = old_manifest[pypkg]['summary'] new_manifest[pypkg]['rdepends'] = [] new_manifest[pypkg]['files'] = [] - new_manifest[pypkg]['cached'] = old_manifest[pypkg]['cached'] # All packages should depend on core if pypkg != 'core': new_manifest[pypkg]['rdepends'].append('core') - new_manifest[pypkg]['cached'] = [] print('\n') print('--------------------------') @@ -334,7 +308,7 @@ for pypkg in old_manifest: for pypkg_with_folder in hasfolders: if (folderFound == False): # print('Checking folder %s on package %s' % (pymodule_dep,pypkg_with_folder)) - for folder_dep in old_manifest[pypkg_with_folder]['files'] or folder_dep in old_manifest[pypkg_with_folder]['cached']: + for folder_dep in old_manifest[pypkg_with_folder]['files']: if folder_dep == folder: print ('%s directory found in %s' % (folder, pypkg_with_folder)) folderFound = True @@ -351,16 +325,13 @@ for pypkg in old_manifest: # No directories beyond this point # We might already have this module on the dictionary since it could depend on a (previously checked) module - if pymodule_dep not in new_manifest[pypkg]['files'] and pymodule_dep not in new_manifest[pypkg]['cached']: + if pymodule_dep not in new_manifest[pypkg]['files']: # Handle core as a special package, we already did it so we pass it to NEW data structure directly if pypkg == 'core': print('Adding %s to %s FILES' % (pymodule_dep, pypkg)) if pymodule_dep.endswith('*'): wildcards.append(pymodule_dep) - if isCached(pymodule_dep): - new_manifest[pypkg]['cached'].append(pymodule_dep) - else: - new_manifest[pypkg]['files'].append(pymodule_dep) + new_manifest[pypkg]['files'].append(pymodule_dep) # Check for repeated files if pymodule_dep not in allfiles: @@ -378,7 +349,7 @@ for pypkg in old_manifest: for possible_rdep in old_manifest: # Debug # print('Checking %s ' % pymodule_dep + ' in %s' % possible_rdep) - if pymodule_dep in old_manifest[possible_rdep]['files'] or pymodule_dep in old_manifest[possible_rdep]['cached']: + if pymodule_dep in old_manifest[possible_rdep]['files']: # Since were nesting, we need to check its not the same pypkg if(possible_rdep != pypkg): if possible_rdep not in new_manifest[pypkg]['rdepends']: @@ -393,10 +364,7 @@ for pypkg in old_manifest: # A module shouldn't contain itself (${libdir}/python3/sqlite3 shouldnt be on sqlite3 files) if os.path.basename(pymodule_dep) != pypkg: reportFILES.append(('Adding %s to %s FILES\n' % (pymodule_dep, pypkg))) - if isCached(pymodule_dep): - new_manifest[pypkg]['cached'].append(pymodule_dep) - else: - new_manifest[pypkg]['files'].append(pymodule_dep) + new_manifest[pypkg]['files'].append(pymodule_dep) if pymodule_dep.endswith('*'): wildcards.append(pymodule_dep) if pymodule_dep not in allfiles: @@ -423,7 +391,6 @@ print(hasfolders) # Sort it just so it looks nicer for pypkg in new_manifest: new_manifest[pypkg]['files'].sort() - new_manifest[pypkg]['cached'].sort() new_manifest[pypkg]['rdepends'].sort() # Create the manifest from the data structure that was built diff --git a/meta/recipes-devtools/python/python3/get_module_deps3.py b/meta/recipes-devtools/python/python3/get_module_deps3.py index 8e432b49af8..9b4251af485 100644 --- a/meta/recipes-devtools/python/python3/get_module_deps3.py +++ b/meta/recipes-devtools/python/python3/get_module_deps3.py @@ -141,34 +141,5 @@ for item in dif: print (dep_path) - cpython_tag = sys.implementation.cache_tag - cached = '' - # Theres no naive way to find *.pyc files on python3 - try: - if debug == True: - log.write('\nCalling: sys.modules[' + '%s' % item + '].__cached__\n') - cached = sys.modules['%s' % item].__cached__ - except AttributeError as e: - # Deals with thread (builtin module) not having __cached__ attribute - if debug == True: - log.write(item + ' ') - log.write(str(e)) - log.write('\n') - pass - except NameError as e: - # Deals with NameError: name 'cached' is not defined - if debug == True: - log.write(item+' ') - log.write(str(e)) - pass - if cached is not None: - if debug == True: - log.write(cached + '\n') - cached = fix_path(cached) - cached = cached.replace(cpython_tag,'*') - if "_sysconfigdata" in cached: - cached = cached.replace(sysconfig._get_sysconfigdata_name(), "_sysconfigdata*") - print (cached) - if debug == True: log.close() diff --git a/meta/recipes-devtools/python/python3/no-compile-pyc.patch b/meta/recipes-devtools/python/python3/no-compile-pyc.patch new file mode 100644 index 00000000000..e95458f8a51 --- /dev/null +++ b/meta/recipes-devtools/python/python3/no-compile-pyc.patch @@ -0,0 +1,26 @@ +Don't compile the standard library to .pyc files, we'll do that at packaging instead. + +Upstream-Status: Inappropriate [https://github.com/python/cpython/issues/160835] +Signed-off-by: Ross Burton + +diff --git i/Makefile.pre.in w/Makefile.pre.in +index 3d12153cb6c..b32eef4810a 100644 +--- i/Makefile.pre.in ++++ w/Makefile.pre.in +@@ -2829,16 +2829,6 @@ libinstall: all $(srcdir)/Modules/xxmodule.c + echo "Applying app store compliance patch"; \ + patch --force --reject-file "$(abs_builddir)/app-store-compliance.rej" --strip 2 --directory "$(DESTDIR)$(LIBDEST)" --input "$(abs_srcdir)/$(APP_STORE_COMPLIANCE_PATCH)" || true ; \ + fi +- @ # Build PYC files for the 3 optimization levels (0, 1, 2) +- -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \ +- $(PYTHON_FOR_BUILD) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \ +- -o 0 -o 1 -o 2 $(COMPILEALL_OPTS) -d $(LIBDEST) -f \ +- -x 'bad_coding|badsyntax|site-packages' \ +- $(DESTDIR)$(LIBDEST) +- -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \ +- $(PYTHON_FOR_BUILD) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \ +- -o 0 -o 1 -o 2 $(COMPILEALL_OPTS) -d $(LIBDEST)/site-packages -f \ +- -x badsyntax $(DESTDIR)$(LIBDEST)/site-packages + + # bpo-21536: Misc/python-config.sh is generated in the build directory + # from $(srcdir)Misc/python-config.sh.in. diff --git a/meta/recipes-devtools/python/python3/python3-manifest.json b/meta/recipes-devtools/python/python3/python3-manifest.json index 50fdf5d0eae..4cfbbf978d1 100644 --- a/meta/recipes-devtools/python/python3/python3-manifest.json +++ b/meta/recipes-devtools/python/python3/python3-manifest.json @@ -100,8 +100,7 @@ "${libdir}/python${PYTHON_MAJMIN}/*/tests", "${libdir}/python${PYTHON_MAJMIN}/idlelib/idle_test/", "${libdir}/python${PYTHON_MAJMIN}/test" - ], - "cached": [] + ] }, "asyncio": { "summary": "Python Asynchronous I/O", @@ -118,8 +117,7 @@ "${libdir}/python${PYTHON_MAJMIN}/concurrent", "${libdir}/python${PYTHON_MAJMIN}/concurrent/futures", "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_asyncio.*.so" - ], - "cached": [] + ] }, "audio": { "summary": "Python Audio Handling", @@ -128,9 +126,6 @@ ], "files": [ "${libdir}/python${PYTHON_MAJMIN}/wave.py" - ], - "cached": [ - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/wave.*.pyc" ] }, "codecs": { @@ -140,8 +135,7 @@ ], "files": [ "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_multibytecodec.*.so" - ], - "cached": [] + ] }, "compile": { "summary": "Python bytecode compilation support", @@ -152,11 +146,6 @@ "${libdir}/python${PYTHON_MAJMIN}/compileall.py", "${libdir}/python${PYTHON_MAJMIN}/filecmp.py", "${libdir}/python${PYTHON_MAJMIN}/py_compile.py" - ], - "cached": [ - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/compileall.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/filecmp.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/py_compile.*.pyc" ] }, "compression": { @@ -170,10 +159,6 @@ "${libdir}/python${PYTHON_MAJMIN}/zipfile/", "${libdir}/python${PYTHON_MAJMIN}/compression/", "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_zstd.*.so" - ], - "cached": [ - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/gzip.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/tarfile.*.pyc" ] }, "core": { @@ -322,112 +307,6 @@ "${libdir}/python${PYTHON_MAJMIN}/weakref.py", "${libdir}/python${PYTHON_MAJMIN}/zipimport.py", "${prefix}/lib/python${PYTHON_MAJMIN}/config*/*[!.a]" - ], - "cached": [ - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/__future__.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/_ast_unparse.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/_bootlocale.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/_collections_abc.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/_colorize.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/_compression.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/_markupbase.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/_opcode_metadata.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/_py_warnings.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/_sitebuiltins.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/_sysconfigdata*.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/_weakrefset.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/abc.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/annotationlib.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/argparse.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/ast.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/bisect.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/bz2.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/code.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/codecs.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/codeop.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/configparser.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/contextlib.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/copy.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/copyreg.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/csv.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/dataclasses.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/dis.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/enum.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/fnmatch.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/functools.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/genericpath.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/getopt.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/gettext.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/glob.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/heapq.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/imp.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/inspect.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/io.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/ipaddress.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/keyword.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/linecache.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/locale.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/lzma.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/ntpath.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/opcode.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/operator.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/optparse.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/os.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/pathlib.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/pkgutil.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/platform.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/posixpath.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/re.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/reprlib.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/rlcompleter.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/runpy.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/selectors.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/shutil.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/signal.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/site.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/sre_compile.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/sre_constants.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/sre_parse.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/stat.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/stringprep.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/struct.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/subprocess.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/symbol.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/sysconfig.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/textwrap.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/threading.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/token.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/tokenize.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/traceback.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/types.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/typing.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/warnings.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/weakref.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/zipimport.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/_pyrepl/__pycache__", - "${libdir}/python${PYTHON_MAJMIN}/_pyrepl/__pycache__/pager.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/collections/__pycache__", - "${libdir}/python${PYTHON_MAJMIN}/collections/__pycache__/abc.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/encodings/__pycache__", - "${libdir}/python${PYTHON_MAJMIN}/encodings/__pycache__/aliases.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/encodings/__pycache__/latin_1.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/encodings/__pycache__/utf_8.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/importlib/__pycache__", - "${libdir}/python${PYTHON_MAJMIN}/importlib/__pycache__/_abc.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/importlib/__pycache__/abc.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/importlib/__pycache__/machinery.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/importlib/__pycache__/util.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/pathlib/__pycache__", - "${libdir}/python${PYTHON_MAJMIN}/pathlib/__pycache__/_abc.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/pathlib/__pycache__/_local.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/re/__pycache__", - "${libdir}/python${PYTHON_MAJMIN}/re/__pycache__/_casefix.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/re/__pycache__/_compiler.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/re/__pycache__/_constants.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/re/__pycache__/_parser.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/sysconfig/__pycache__", - "${libdir}/python${PYTHON_MAJMIN}/urllib/__pycache__", - "${libdir}/python${PYTHON_MAJMIN}/urllib/__pycache__/parse.*.pyc" ] }, "crypt": { @@ -443,9 +322,6 @@ "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_sha1.*.so", "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_sha2.*.so", "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_sha3.*.so" - ], - "cached": [ - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/hashlib.*.pyc" ] }, "ctypes": { @@ -459,8 +335,7 @@ "${libdir}/python${PYTHON_MAJMIN}/ctypes", "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_ctypes.*.so", "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_ctypes_test.*.so" - ], - "cached": [] + ] }, "curses": { "summary": "Python curses support", @@ -471,8 +346,7 @@ "${libdir}/python${PYTHON_MAJMIN}/curses", "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_curses.*.so", "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_curses_panel.*.so" - ], - "cached": [] + ] }, "datetime": { "summary": "Python calendar and time support", @@ -484,11 +358,6 @@ "${libdir}/python${PYTHON_MAJMIN}/calendar.py", "${libdir}/python${PYTHON_MAJMIN}/datetime.py", "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_datetime.*.so" - ], - "cached": [ - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/_strptime.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/calendar.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/datetime.*.pyc" ] }, "db": { @@ -499,8 +368,7 @@ "files": [ "${libdir}/python${PYTHON_MAJMIN}/dbm", "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_dbm.*.so" - ], - "cached": [] + ] }, "debugger": { "summary": "Python debugger", @@ -513,14 +381,9 @@ "files": [ "${libdir}/python${PYTHON_MAJMIN}/bdb.py", "${libdir}/python${PYTHON_MAJMIN}/pdb.py" - ], - "cached": [ - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/bdb.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/pdb.*.pyc" ] }, "dev": { - "cached": [], "files": [ "${base_libdir}/*.a", "${base_libdir}/*.o", @@ -546,9 +409,6 @@ ], "files": [ "${libdir}/python${PYTHON_MAJMIN}/difflib.py" - ], - "cached": [ - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/difflib.*.pyc" ] }, "doctest": { @@ -564,9 +424,6 @@ ], "files": [ "${libdir}/python${PYTHON_MAJMIN}/doctest.py" - ], - "cached": [ - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/doctest.*.pyc" ] }, "email": { @@ -583,9 +440,6 @@ "files": [ "${libdir}/python${PYTHON_MAJMIN}/email", "${libdir}/python${PYTHON_MAJMIN}/imaplib.py" - ], - "cached": [ - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/imaplib.*.pyc" ] }, "ensurepip": { @@ -595,8 +449,7 @@ ], "files": [ "${libdir}/python${PYTHON_MAJMIN}/ensurepip/" - ], - "cached": [] + ] }, "fcntl": { "summary": "Python's fcntl interface", @@ -605,8 +458,7 @@ ], "files": [ "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/fcntl.*.so" - ], - "cached": [] + ] }, "gdbm": { "summary": "Python GNU database support", @@ -615,8 +467,7 @@ ], "files": [ "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_gdbm.*.so" - ], - "cached": [] + ] }, "html": { "summary": "Python HTML processing support", @@ -625,8 +476,7 @@ ], "files": [ "${libdir}/python${PYTHON_MAJMIN}/html" - ], - "cached": [] + ] }, "idle": { "summary": "Python Integrated Development Environment", @@ -636,8 +486,7 @@ "files": [ "${bindir}/idle*", "${libdir}/python${PYTHON_MAJMIN}/idlelib" - ], - "cached": [] + ] }, "image": { "summary": "Python graphical image handling", @@ -646,9 +495,6 @@ ], "files": [ "${libdir}/python${PYTHON_MAJMIN}/colorsys.py" - ], - "cached": [ - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/colorsys.*.pyc" ] }, "io": { @@ -666,12 +512,6 @@ "${libdir}/python${PYTHON_MAJMIN}/socket.py", "${libdir}/python${PYTHON_MAJMIN}/ssl.py", "${libdir}/python${PYTHON_MAJMIN}/tempfile.py" - ], - "cached": [ - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/_pyio.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/socket.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/ssl.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/tempfile.*.pyc" ] }, "json": { @@ -682,8 +522,7 @@ "files": [ "${libdir}/python${PYTHON_MAJMIN}/json", "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_json.*.so" - ], - "cached": [] + ] }, "logging": { "summary": "Python logging support", @@ -697,8 +536,7 @@ ], "files": [ "${libdir}/python${PYTHON_MAJMIN}/logging" - ], - "cached": [] + ] }, "mailbox": { "summary": "Python mailbox format support", @@ -714,9 +552,6 @@ ], "files": [ "${libdir}/python${PYTHON_MAJMIN}/mailbox.py" - ], - "cached": [ - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/mailbox.*.pyc" ] }, "math": { @@ -728,9 +563,6 @@ "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_random.*.so", "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/cmath.*.so", "${libdir}/python${PYTHON_MAJMIN}/random.py" - ], - "cached": [ - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/random.*.pyc" ] }, "mime": { @@ -740,9 +572,6 @@ ], "files": [ "${libdir}/python${PYTHON_MAJMIN}/quopri.py" - ], - "cached": [ - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/quopri.*.pyc" ] }, "mmap": { @@ -752,11 +581,9 @@ ], "files": [ "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/mmap.*.so" - ], - "cached": [] + ] }, "modules": { - "cached": [], "files": [], "rdepends": [ "asyncio", @@ -832,8 +659,7 @@ "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_multiprocessing.*.so", "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_posixshmem.*.so", "${libdir}/python${PYTHON_MAJMIN}/multiprocessing" - ], - "cached": [] + ] }, "netclient": { "summary": "Python Internet Protocol clients", @@ -860,16 +686,6 @@ "${libdir}/python${PYTHON_MAJMIN}/smtplib.py", "${libdir}/python${PYTHON_MAJMIN}/urllib", "${libdir}/python${PYTHON_MAJMIN}/uuid.py" - ], - "cached": [ - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/base64.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/ftplib.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/hmac.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/mimetypes.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/poplib.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/secrets.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/smtplib.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/uuid.*.pyc" ] }, "netserver": { @@ -880,9 +696,6 @@ ], "files": [ "${libdir}/python${PYTHON_MAJMIN}/socketserver.py" - ], - "cached": [ - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/socketserver.*.pyc" ] }, "numbers": { @@ -898,13 +711,6 @@ "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_contextvars.*.so", "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_decimal.*.so", "${libdir}/python${PYTHON_MAJMIN}/numbers.py" - ], - "cached": [ - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/_pydecimal.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/contextvars.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/decimal.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/fractions.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/numbers.*.pyc" ] }, "pickle": { @@ -918,12 +724,6 @@ "${libdir}/python${PYTHON_MAJMIN}/pickle.py", "${libdir}/python${PYTHON_MAJMIN}/pickletools.py", "${libdir}/python${PYTHON_MAJMIN}/shelve.py" - ], - "cached": [ - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/_compat_pickle.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/pickle.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/pickletools.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/shelve.*.pyc" ] }, "pkgutil": { @@ -931,8 +731,7 @@ "rdepends": [ "core" ], - "files": [], - "cached": [] + "files": [] }, "plistlib": { "summary": "Generate and parse Mac OS X .plist files", @@ -943,9 +742,6 @@ ], "files": [ "${libdir}/python${PYTHON_MAJMIN}/plistlib.py" - ], - "cached": [ - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/plistlib.*.pyc" ] }, "pprint": { @@ -955,9 +751,6 @@ ], "files": [ "${libdir}/python${PYTHON_MAJMIN}/pprint.py" - ], - "cached": [ - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/pprint.*.pyc" ] }, "profile": { @@ -970,11 +763,6 @@ "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_lsprof.*.so", "${libdir}/python${PYTHON_MAJMIN}/profile.py", "${libdir}/python${PYTHON_MAJMIN}/pstats.py" - ], - "cached": [ - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/cProfile.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/profile.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/pstats.*.pyc" ] }, "pydoc": { @@ -986,9 +774,6 @@ "${bindir}/pydoc*", "${libdir}/python${PYTHON_MAJMIN}/pydoc.py", "${libdir}/python${PYTHON_MAJMIN}/pydoc_data" - ], - "cached": [ - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/pydoc.*.pyc" ] }, "resource": { @@ -998,8 +783,7 @@ ], "files": [ "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/resource.*.so" - ], - "cached": [] + ] }, "shell": { "summary": "Python shell-like functionality", @@ -1010,10 +794,6 @@ "files": [ "${libdir}/python${PYTHON_MAJMIN}/cmd.py", "${libdir}/python${PYTHON_MAJMIN}/shlex.py" - ], - "cached": [ - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/cmd.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/shlex.*.pyc" ] }, "sqlite3": { @@ -1025,8 +805,7 @@ "files": [ "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_sqlite3.*.so", "${libdir}/python${PYTHON_MAJMIN}/sqlite3" - ], - "cached": [] + ] }, "statistics": { "summary": "Basic statistics module", @@ -1038,9 +817,6 @@ "files": [ "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_statistics.*.so", "${libdir}/python${PYTHON_MAJMIN}/statistics.py" - ], - "cached": [ - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/statistics.*.pyc" ] }, "stringold": { @@ -1051,8 +827,7 @@ "files": [ "${libdir}/python${PYTHON_MAJMIN}/string", "${libdir}/python${PYTHON_MAJMIN}/string/__pycache__" - ], - "cached": [] + ] }, "syslog": { "summary": "Python syslog interface", @@ -1061,8 +836,7 @@ ], "files": [ "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/syslog.*.so" - ], - "cached": [] + ] }, "terminal": { "summary": "Python terminal controlling support", @@ -1073,10 +847,6 @@ "files": [ "${libdir}/python${PYTHON_MAJMIN}/pty.py", "${libdir}/python${PYTHON_MAJMIN}/tty.py" - ], - "cached": [ - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/pty.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/tty.*.pyc" ] }, "threading": { @@ -1088,10 +858,6 @@ "${libdir}/python${PYTHON_MAJMIN}/_threading_local.py", "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_queue.*.so", "${libdir}/python${PYTHON_MAJMIN}/queue.py" - ], - "cached": [ - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/_threading_local.*.pyc", - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/queue.*.pyc" ] }, "tkinter": { @@ -1101,8 +867,7 @@ ], "files": [ "${libdir}/python${PYTHON_MAJMIN}/tkinter" - ], - "cached": [] + ] }, "tomllib": { "summary": "Provides an interface for parsing TOML", @@ -1111,8 +876,7 @@ ], "files": [ "${libdir}/python${PYTHON_MAJMIN}/tomllib/" - ], - "cached": [] + ] }, "unittest": { "summary": "Python unit testing framework", @@ -1131,8 +895,7 @@ "${libdir}/python${PYTHON_MAJMIN}/unittest", "${libdir}/python${PYTHON_MAJMIN}/unittest/", "${libdir}/python${PYTHON_MAJMIN}/unittest/__pycache__" - ], - "cached": [] + ] }, "unixadmin": { "summary": "Python Unix administration support", @@ -1142,9 +905,6 @@ ], "files": [ "${libdir}/python${PYTHON_MAJMIN}/getpass.py" - ], - "cached": [ - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/getpass.*.pyc" ] }, "venv": { @@ -1157,8 +917,7 @@ "files": [ "${bindir}/pyvenv*", "${libdir}/python${PYTHON_MAJMIN}/venv" - ], - "cached": [] + ] }, "xml": { "summary": "Python basic XML support", @@ -1169,8 +928,7 @@ "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_elementtree.*.so", "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/pyexpat.*.so", "${libdir}/python${PYTHON_MAJMIN}/xml" - ], - "cached": [] + ] }, "xmlrpc": { "summary": "Python XML-RPC support", @@ -1192,8 +950,7 @@ "files": [ "${libdir}/python${PYTHON_MAJMIN}/xmlrpc", "${libdir}/python${PYTHON_MAJMIN}/xmlrpc/__pycache__" - ], - "cached": [] + ] }, "zipapp": { "summary": "Tools to manage the creation of zip files containing Python code", @@ -1203,9 +960,6 @@ ], "files": [ "${libdir}/python${PYTHON_MAJMIN}/zipapp.py" - ], - "cached": [ - "${libdir}/python${PYTHON_MAJMIN}/__pycache__/zipapp.*.pyc" ] }, "zoneinfo": { @@ -1217,7 +971,6 @@ "files": [ "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_zoneinfo.*.so", "${libdir}/python${PYTHON_MAJMIN}/zoneinfo" - ], - "cached": [] + ] } } diff --git a/meta/recipes-devtools/python/python3_3.14.10.bb b/meta/recipes-devtools/python/python3_3.14.10.bb index 28e67330d1a..c57868bf709 100644 --- a/meta/recipes-devtools/python/python3_3.14.10.bb +++ b/meta/recipes-devtools/python/python3_3.14.10.bb @@ -24,6 +24,7 @@ SRC_URI = "http://www.python.org/ftp/python/${PV}/Python-${PV}.tar.xz \ file://0001-gh-146207-Add-support-for-OpenSSL-4.0.0.patch \ file://0002-gh-148292-Update-_ssl._SSLSocket-for-OpenSSL-4.patch \ file://0003-gh-148292-Remove-shutdown-test-in-test_ssl.test_got_eof.patch \ + file://no-compile-pyc.patch \ " SRC_URI:append:class-native = " \ file://0001-Lib-sysconfig.py-use-prefix-value-from-build-configu.patch \ @@ -135,24 +136,10 @@ EOF CPPFLAGS += "-I${STAGING_INCDIR}/ncursesw -I${STAGING_INCDIR}/uuid" -# COMPILEALL_OPTS= ensures that .pyc are not compiled in parallel -# This was found to lock up builds, break reproducibility, and produce strange file ownership -# races. -# -# The upstream commit introducing the change was: -# https://github.com/python/cpython/commit/1a2dd82f56bd813aacc570e172cefe55a8a41504 -# -# The build lock up issue is reported here: -# https://bugs.python.org/issue45945 -# -# The repro failures are documented here: -# https://autobuilder.yocto.io/pub/repro-fail/oe-reproducible-20211130-yr_o1a8d/packages/diff-html/ - EXTRA_OEMAKE = '\ STAGING_LIBDIR=${STAGING_LIBDIR} \ STAGING_INCDIR=${STAGING_INCDIR} \ LIB=${baselib} \ - COMPILEALL_OPTS= \ ' # Generate a Profile Guided Optimisation wrapper script that uses qemu-user for @@ -192,15 +179,6 @@ do_install:append:class-native() { # buffer is 128 bytes long). ln -s python3-native/python3 ${D}${bindir}/nativepython3 - # Remove the opt-1.pyc and opt-2.pyc files. There are over 3,000 of them - # and the overhead in each recipe-sysroot-native isn't worth it, particularly - # when they're only used for python called with -O or -OO. - #find ${D} -name *opt-*.pyc -delete - # Remove all pyc files. There are a ton of them and it is probably faster to let - # python create the ones it wants at runtime rather than manage in the sstate - # tarballs and sysroot creation. - find ${D} -name *.pyc -delete - # Nothing should be looking into ${B} for python3-native sed -i -e 's:${B}:/build/path/unavailable/:g' \ ${D}/${libdir}/python${PYTHON_MAJMIN}/config-${PYTHON_MAJMIN}${PYTHON_ABI}*/Makefile @@ -213,8 +191,6 @@ do_install:append:class-native() { } do_install:append() { - rm -f ${D}${libdir}/python${PYTHON_MAJMIN}/__pycache__/_sysconfigdata*.cpython* - mkdir -p ${D}${libdir}/python-sysconfigdata sysconfigfile=`find ${D} -name _sysconfig*.py` sed -i \ @@ -229,11 +205,6 @@ do_install:append() { -e "s,${B},/build/path/unavailable/,g" \ $sysconfigfile cp $sysconfigfile ${D}${libdir}/python-sysconfigdata/_sysconfigdata.py - - # Remove the opt-1.pyc and opt-2.pyc files. They effectively waste space on embedded - # style targets as they're only used when python is called with the -O or -OO options - # which is rare. - find ${D} -name *opt-*.pyc -delete } do_install:append:class-nativesdk () { @@ -353,6 +324,9 @@ provide_target_config_script() { install -d ${SYSROOT_DESTDIR}${prefix}/python-target-config/ install ${D}/${bindir}/python3-config ${SYSROOT_DESTDIR}/${prefix}/python-target-config/ install ${D}/${bindir}/python${PYTHON_MAJMIN}-config ${SYSROOT_DESTDIR}/${prefix}/python-target-config/ + # Compile the sysconfigdata in the target sysroot as it will be generated if + # python3targetconfig is inherited. + python3 -mcompileall ${SYSROOT_DESTDIR}${libdir}/python${PYTHON_MAJMIN}/_sysconfigdata*.py -s ${SYSROOT_DESTDIR} -p / } SYSROOT_DIRS += "${prefix}/python-target-config/" @@ -385,11 +359,6 @@ py_package_preprocess () { ${PKGD}/${libdir}/python${PYTHON_MAJMIN}/_sysconfig_vars*.json \ ${PKGD}/${bindir}/python${PYTHON_MAJMIN}-config - # Recompile _sysconfigdata after modifying it - for c in ${PKGD}/${libdir}/python${PYTHON_MAJMIN}/_sysconfigdata*.py; do - python3 -mcompileall $c -s ${PKGD} -p / - done - mv ${PKGD}/${bindir}/python${PYTHON_MAJMIN}-config ${PKGD}/${bindir}/python${PYTHON_MAJMIN}-config-${MULTILIB_SUFFIX} #Remove the unneeded copy of target sysconfig data @@ -399,9 +368,28 @@ py_package_preprocess () { sed -i -e 's:${BUILD_ARCH}-${HOST_OS}:${HOST_ARCH}-${HOST_OS}:g' ${PKGD}/${libdir}/python${PYTHON_MAJMIN}/build-details.json } +# Compile the .py files in PKGDEST to .pyc. This is done during do_package so the .pyc files +# are always packaged with the .py. +py_compile_py() { + if [ "${INCLUDE_PYCS}" != "0" ]; then + bbnote Compiling python bytecode... + # Need to do each package individually so we can strip the correct path prefix + for dir in $(find ${PKGDEST} -type d -maxdepth 1); do + # Currently compileall isn't deterministic when ran + # in parallel so we can't yet pass -j. + # https://github.com/python/cpython/issues/129724 + nativepython3 -mcompileall \ + -f -s $dir -p / -x 'bad_coding|badsyntax' \ + $dir + done + fi +} +PACKAGESPLITFUNCS += "py_compile_py" + # We want bytecode precompiled .py files (.pyc's) by default # but the user may set it on their own conf INCLUDE_PYCS ?= "1" +INCLUDE_PYCS:class-native = "0" python(){ import collections, json @@ -452,11 +440,6 @@ python(){ for value in python_manifest[key]['files']: d.appendVar('FILES:' + pypackage, ' ' + value) - # Add cached files - if include_pycs == '1': - for value in python_manifest[key]['cached']: - d.appendVar('FILES:' + pypackage, ' ' + value) - for value in python_manifest[key]['rdepends']: # Make it work with or without $PN if '${PN}' in value: From patchwork Wed Nov 11 14:17:23 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ross Burton X-Patchwork-Id: 103749 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.msgproc01-g2.10406.1794406653002459750 for ; Wed, 11 Nov 2026 06:17:33 -0800 Authentication-Results: mx.groups.io; dkim=fail reason="dkim: body hash did not verify" header.i=@arm.com header.s=foss header.b=IEY6AUmp; spf=pass (domain: arm.com, ip: 217.140.110.172, mailfrom: ross.burton@arm.com) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 7D06D16F8 for ; Wed, 11 Nov 2026 06:17:29 -0800 (PST) Received: from cesw-amp-gbt-1s-m12830-04.lab.cambridge.arm.com (usa-sjc-imap-foss1.foss.arm.com [10.121.207.14]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 30D433F632 for ; Wed, 11 Nov 2026 06:17:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1794406652; bh=RTJMkmm4ggxtsLqcQgDNqYgOWS3QiuBEFkFGlqRJn3I=; h=From:To:Subject:Date:In-Reply-To:References:From; b=IEY6AUmp8jKPnzQIFdw4+6cFUKe48kEZyeOWwKuPUDKBvCyKyLJnqIfaAc5oQ2uP6 Nn0hNC5bfAFm4CaJPo+ywnCgMF3m6BVnJ5jR+yEg21lCSKNIHJRrShSVcajJW9+pDV N0NC/Ncin3rhaIjGrIpz4K/1inZ5loQu4iA1/sLM= From: Ross Burton To: openembedded-core@lists.openembedded.org Subject: [PATCH v2 3/6] python3: don't copy from UNPACKDIR to WORKDIR Date: Wed, 11 Nov 2026 14:17:23 +0000 Message-ID: <20261111141726.1496785-3-ross.burton@arm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20261111141726.1496785-1-ross.burton@arm.com> References: <20261111141726.1496785-1-ross.burton@arm.com> MIME-Version: 1.0 X-ARM-No-Footer: NoDisclaimer List-Id: X-Webhook-Received: from 45-33-107-173.ip.linodeusercontent.com [45.33.107.173] by lin-tor-korg-lkml-alma10-1 with HTTPS for ; Wed, 11 Nov 2026 14:17:35 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/openembedded-core/message/250032 There's no need to copy files from UNPACKDIR to WORKDIR, we can just do the work in UNPACKDIR. Signed-off-by: Ross Burton --- meta/recipes-devtools/python/python3_3.14.10.bb | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/meta/recipes-devtools/python/python3_3.14.10.bb b/meta/recipes-devtools/python/python3_3.14.10.bb index c57868bf709..574b8e31d41 100644 --- a/meta/recipes-devtools/python/python3_3.14.10.bb +++ b/meta/recipes-devtools/python/python3_3.14.10.bb @@ -475,11 +475,8 @@ do_create_manifest() { # e.g. BerkeleyDB is an optional build dependency so it may or may not # be present, we must ensure it is. - cp ${UNPACKDIR}/create_manifest3.py ${WORKDIR} - cp ${UNPACKDIR}/python3-manifest.json ${WORKDIR} - cp ${UNPACKDIR}/get_module_deps3.py ${WORKDIR} - cd ${WORKDIR} # This needs to be executed by python-native and NOT by HOST's python + cd ${UNPACKDIR} nativepython3 create_manifest3.py ${PYTHON_MAJMIN} cp python3-manifest.json.new ${THISDIR}/python3/python3-manifest.json } From patchwork Wed Nov 11 14:17:24 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ross Burton X-Patchwork-Id: 103750 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.msgproc02-g2.10228.1794406653518225283 for ; Wed, 11 Nov 2026 06:17:33 -0800 Authentication-Results: mx.groups.io; dkim=fail reason="dkim: body hash did not verify" header.i=@arm.com header.s=foss header.b=VqT+lpXm; spf=pass (domain: arm.com, ip: 217.140.110.172, mailfrom: ross.burton@arm.com) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 19B3F1576 for ; Wed, 11 Nov 2026 06:17:30 -0800 (PST) Received: from cesw-amp-gbt-1s-m12830-04.lab.cambridge.arm.com (usa-sjc-imap-foss1.foss.arm.com [10.121.207.14]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id C913A3F632 for ; Wed, 11 Nov 2026 06:17:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1794406653; bh=qu+PONV4LU0aEx8bhaZi/o/C26CyFWm4Y5jOyBbSn1g=; h=From:To:Subject:Date:In-Reply-To:References:From; b=VqT+lpXmewUsAJONV5RPY6a4ooopmeudd2g3pR9g+w3hYk8Z96nI/4FV2UOGnCsl3 AZYViwIHLqP4SOZ0ebaMMEhEsAax1QDzRi9hKHjQd3Ejjwaqy0sFDONWN8SFbCXQts 0UkqC+4fv1q6fdtANIcXiwqElaVZHz0AzYNoMVTM= From: Ross Burton To: openembedded-core@lists.openembedded.org Subject: [PATCH v2 4/6] python3: no need to use an OrderedDict Date: Wed, 11 Nov 2026 14:17:24 +0000 Message-ID: <20261111141726.1496785-4-ross.burton@arm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20261111141726.1496785-1-ross.burton@arm.com> References: <20261111141726.1496785-1-ross.burton@arm.com> MIME-Version: 1.0 X-ARM-No-Footer: NoDisclaimer List-Id: X-Webhook-Received: from 45-33-107-173.ip.linodeusercontent.com [45.33.107.173] by lin-tor-korg-lkml-alma10-1 with HTTPS for ; Wed, 11 Nov 2026 14:17:35 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/openembedded-core/message/250033 As of Python 3.7, standard dictionaries are sorted by insertion order. As this stable order was the only reason for using OrderedDict, we can switch to using a normal dictionary. Signed-off-by: Ross Burton --- meta/recipes-devtools/python/python3/create_manifest3.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/meta/recipes-devtools/python/python3/create_manifest3.py b/meta/recipes-devtools/python/python3/create_manifest3.py index 5dda382de8f..029d9235c1a 100644 --- a/meta/recipes-devtools/python/python3/create_manifest3.py +++ b/meta/recipes-devtools/python/python3/create_manifest3.py @@ -37,7 +37,6 @@ import sys import subprocess import json import os -import collections if '-d' in sys.argv: debugFlag = '-d' @@ -54,7 +53,7 @@ for p in sys.path: nativelibfolder = p[:p.find(pivot)+len(pivot)] # Empty dict to hold the whole manifest -new_manifest = collections.OrderedDict() +new_manifest = {} # Check for repeated files, folders and wildcards allfiles = [] @@ -91,7 +90,7 @@ with open('python3-manifest.json') as manifest: manifest.seek(0) comments = manifest.read(json_start) manifest_str = manifest.read() - old_manifest = json.loads(manifest_str, object_pairs_hook=collections.OrderedDict) + old_manifest = json.loads(manifest_str) # # First pass to get core-package functionality, because we base everything on the fact that core is actually working @@ -195,7 +194,7 @@ for pypkg in old_manifest: for pypkg in old_manifest: # Use an empty dict as data structure to hold data for each package and fill it up - new_manifest[pypkg] = collections.OrderedDict() + new_manifest[pypkg] = {} new_manifest[pypkg]['summary'] = old_manifest[pypkg]['summary'] new_manifest[pypkg]['rdepends'] = [] new_manifest[pypkg]['files'] = [] From patchwork Wed Nov 11 14:17:25 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ross Burton X-Patchwork-Id: 103751 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.msgproc02-g2.10229.1794406654168906466 for ; Wed, 11 Nov 2026 06:17:34 -0800 Authentication-Results: mx.groups.io; dkim=fail reason="dkim: body hash did not verify" header.i=@arm.com header.s=foss header.b=PUQ8uJqP; spf=pass (domain: arm.com, ip: 217.140.110.172, mailfrom: ross.burton@arm.com) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id A9EF41576 for ; Wed, 11 Nov 2026 06:17:30 -0800 (PST) Received: from cesw-amp-gbt-1s-m12830-04.lab.cambridge.arm.com (usa-sjc-imap-foss1.foss.arm.com [10.121.207.14]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 64A0D3F632 for ; Wed, 11 Nov 2026 06:17:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1794406653; bh=s4FoHWEX8ouZVdI6DKRyWagc5LLZenXYWQhtzw0zYtY=; h=From:To:Subject:Date:In-Reply-To:References:From; b=PUQ8uJqPIcDJYQKHGXXMXHnG8p9ski/DB8iuMVi2u5S/rm0up42GaNwL+srqYE5rl BoOU9WLPBpD4HR4X9w3Mx9NOccG3411AQkM8GRYurxyMlKCNgJw1MUieCnd4w18LmT IOeO6bebMFl0xzoJwTEATyHjIeotGoeEiZJCxtzc= From: Ross Burton To: openembedded-core@lists.openembedded.org Subject: [PATCH v2 5/6] python3: add support for skipping dependencies when building the manifest Date: Wed, 11 Nov 2026 14:17:25 +0000 Message-ID: <20261111141726.1496785-5-ross.burton@arm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20261111141726.1496785-1-ross.burton@arm.com> References: <20261111141726.1496785-1-ross.burton@arm.com> MIME-Version: 1.0 X-ARM-No-Footer: NoDisclaimer List-Id: X-Webhook-Received: from 45-33-107-173.ip.linodeusercontent.com [45.33.107.173] by lin-tor-korg-lkml-alma10-1 with HTTPS for ; Wed, 11 Nov 2026 14:17:36 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/openembedded-core/message/250034 The manifest generation works by importing modules and seeing what other modules also get included. This means the manifest is maximal, for example shutil tries to import all of the compression modules to determine what compression types are available. Add a "skip_depends" element to the manifest so we can mark up specific dependencies that should be ignored when generating the manifest. Signed-off-by: Ross Burton --- .../python/python3/create_manifest3.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/meta/recipes-devtools/python/python3/create_manifest3.py b/meta/recipes-devtools/python/python3/create_manifest3.py index 029d9235c1a..b713dba5ee9 100644 --- a/meta/recipes-devtools/python/python3/create_manifest3.py +++ b/meta/recipes-devtools/python/python3/create_manifest3.py @@ -81,6 +81,14 @@ def print_indent(msg, offset): msg = ' ' * offset + l print(msg) +def is_dependency_skipped(manifest, package, dependency): + """ + Check to see if this dependency should be ignored by matching substrings + from the optional skip_depends element in the manifest. + """ + skiplist = manifest.get('skip_depends', {}).get(package, []) + return any((skip in dependency for skip in skiplist)) + # Read existing JSON manifest with open('python3-manifest.json') as manifest: @@ -109,6 +117,8 @@ print_indent('Getting dependencies for package: core', 0) output = subprocess.check_output([sys.executable, 'get_module_deps3.py', 'python-core-package', '%s' % debugFlag]).decode('utf8') for coredep in output.split(): + if is_dependency_skipped(old_manifest['core'], "core", coredep): + continue coredep = coredep.replace(pyversion,'${PYTHON_MAJMIN}') if coredep not in old_manifest['core']['files']: old_manifest['core']['files'].append(coredep) @@ -152,6 +162,8 @@ for filedep in old_manifest['core']['files']: for pymodule_dep in output.split(): + if is_dependency_skipped(old_manifest['core'], pymodule, pymodule_dep): + continue pymodule_dep = pymodule_dep.replace(pyversion,'${PYTHON_MAJMIN}') if pymodule_dep not in old_manifest['core']['files']: @@ -197,6 +209,8 @@ for pypkg in old_manifest: new_manifest[pypkg] = {} new_manifest[pypkg]['summary'] = old_manifest[pypkg]['summary'] new_manifest[pypkg]['rdepends'] = [] + if "skip_depends" in old_manifest[pypkg]: + new_manifest[pypkg]['skip_depends'] = old_manifest[pypkg]['skip_depends'] new_manifest[pypkg]['files'] = [] # All packages should depend on core @@ -272,6 +286,8 @@ for pypkg in old_manifest: reportRDEPS = [] for pymodule_dep in output.split(): + if is_dependency_skipped(new_manifest[pypkg], pymodule, pymodule_dep): + continue # Warning: This first part is ugly # One of the dependencies that was found, could be inside of one of the folders included by another package From patchwork Wed Nov 11 14:17:26 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ross Burton X-Patchwork-Id: 103752 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.msgproc01-g2.10407.1794406654671610106 for ; Wed, 11 Nov 2026 06:17:34 -0800 Authentication-Results: mx.groups.io; dkim=fail reason="dkim: body hash did not verify" header.i=@arm.com header.s=foss header.b=t5GhxnJz; spf=pass (domain: arm.com, ip: 217.140.110.172, mailfrom: ross.burton@arm.com) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 46E151576 for ; Wed, 11 Nov 2026 06:17:31 -0800 (PST) Received: from cesw-amp-gbt-1s-m12830-04.lab.cambridge.arm.com (usa-sjc-imap-foss1.foss.arm.com [10.121.207.14]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 009B53F632 for ; Wed, 11 Nov 2026 06:17:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1794406654; bh=PjezDP8Is/Gm3pYpRFh6npoigS8p78ivQsNhH4pAtf8=; h=From:To:Subject:Date:In-Reply-To:References:From; b=t5GhxnJzaYsHKsHmsBoN9SGAqDagpQ/v+RJsW2EQPY7t5FogJ9elsOAVUrh/As2+Y Ok3eCfoRVcaAtakTQTUh1H6RpUEi6PgW8+8NxQZua3UAmxeZB4fXUJ/TTcFcUc+/SN 8b7R472WdxAjNFMwsF0SZvycyJ+8Sq2L2LS7U8PM= From: Ross Burton To: openembedded-core@lists.openembedded.org Subject: [PATCH v2 6/6] python3: refresh manifest Date: Wed, 11 Nov 2026 14:17:26 +0000 Message-ID: <20261111141726.1496785-6-ross.burton@arm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20261111141726.1496785-1-ross.burton@arm.com> References: <20261111141726.1496785-1-ross.burton@arm.com> MIME-Version: 1.0 X-ARM-No-Footer: NoDisclaimer List-Id: X-Webhook-Received: from 45-33-107-173.ip.linodeusercontent.com [45.33.107.173] by lin-tor-korg-lkml-alma10-1 with HTTPS for ; Wed, 11 Nov 2026 14:17:36 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/openembedded-core/message/250035 Add some dependency skips: - the core imports in zipimport (->compression), but as importing of .zip files is relatively niche skip this dependency. - shutil imports all of compression to determine what methods are available. Skip this dependency, packages which use shutil.make_archive() can depend on -compression. Notable, ensurepip needs to unpack a wheel. Consolidate the compression files into -compression instead of being spread across multiple packages. Put _interpreters.so and _remote_debugging.so into the appropriate packages, remove some previously installed libraries that are now part of the interpreter, and refresh the dependencies. Signed-off-by: Ross Burton --- .../python/python3/python3-manifest.json | 72 ++++++++++++++----- .../python/python3_3.14.10.bb | 1 + 2 files changed, 54 insertions(+), 19 deletions(-) diff --git a/meta/recipes-devtools/python/python3/python3-manifest.json b/meta/recipes-devtools/python/python3/python3-manifest.json index 4cfbbf978d1..b2c83ef0e50 100644 --- a/meta/recipes-devtools/python/python3/python3-manifest.json +++ b/meta/recipes-devtools/python/python3/python3-manifest.json @@ -106,6 +106,7 @@ "summary": "Python Asynchronous I/O", "rdepends": [ "core", + "debugger", "io", "logging", "netclient", @@ -154,16 +155,33 @@ "core" ], "files": [ + "${libdir}/python${PYTHON_MAJMIN}/bz2.py", + "${libdir}/python${PYTHON_MAJMIN}/compression", "${libdir}/python${PYTHON_MAJMIN}/gzip.py", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_bz2.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_lzma.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_zstd.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/zlib.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lzma.py", "${libdir}/python${PYTHON_MAJMIN}/tarfile.py", - "${libdir}/python${PYTHON_MAJMIN}/zipfile/", - "${libdir}/python${PYTHON_MAJMIN}/compression/", - "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_zstd.*.so" + "${libdir}/python${PYTHON_MAJMIN}/zipfile" ] }, "core": { "summary": "Python interpreter and core modules", - "rdepends": ["compression"], + "rdepends": [], + "skip_depends": { + "core": [ + "zipimport" + ], + "shutil": [ + "compression", + "bz2", + "lzma", + "zlib", + "zstd" + ] + }, "files": [ "${bindir}/python${PYTHON_MAJMIN}", "${bindir}/python${PYTHON_MAJMIN}.real", @@ -178,22 +196,20 @@ "${libdir}/python${PYTHON_MAJMIN}/_bootlocale.py", "${libdir}/python${PYTHON_MAJMIN}/_collections_abc.py", "${libdir}/python${PYTHON_MAJMIN}/_colorize.py", - "${libdir}/python${PYTHON_MAJMIN}/_compression.py", "${libdir}/python${PYTHON_MAJMIN}/_markupbase.py", "${libdir}/python${PYTHON_MAJMIN}/_opcode_metadata.py", "${libdir}/python${PYTHON_MAJMIN}/_py_warnings.py", "${libdir}/python${PYTHON_MAJMIN}/_pyrepl", "${libdir}/python${PYTHON_MAJMIN}/_pyrepl/pager.py", "${libdir}/python${PYTHON_MAJMIN}/_sitebuiltins.py", - "${libdir}/python${PYTHON_MAJMIN}/_sysconfigdata*.py", "${libdir}/python${PYTHON_MAJMIN}/_sysconfig_vars*.json", + "${libdir}/python${PYTHON_MAJMIN}/_sysconfigdata*.py", "${libdir}/python${PYTHON_MAJMIN}/_weakrefset.py", "${libdir}/python${PYTHON_MAJMIN}/abc.py", "${libdir}/python${PYTHON_MAJMIN}/annotationlib.py", "${libdir}/python${PYTHON_MAJMIN}/argparse.py", "${libdir}/python${PYTHON_MAJMIN}/ast.py", "${libdir}/python${PYTHON_MAJMIN}/bisect.py", - "${libdir}/python${PYTHON_MAJMIN}/bz2.py", "${libdir}/python${PYTHON_MAJMIN}/code.py", "${libdir}/python${PYTHON_MAJMIN}/codecs.py", "${libdir}/python${PYTHON_MAJMIN}/codeop.py", @@ -235,10 +251,9 @@ "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/__pycache__/time.*.so", "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/__pycache__/xreadlines.*.so", "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_bisect.*.so", - "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_bz2.*.so", "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_csv.*.so", "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_heapq.*.so", - "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_lzma.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_interpreters.*.so", "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_opcode.*.so", "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_posixsubprocess.*.so", "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_struct.*.so", @@ -254,10 +269,8 @@ "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/time.*.so", "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/unicodedata.*.so", "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/xreadlines.*.so", - "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/zlib.*.so", "${libdir}/python${PYTHON_MAJMIN}/linecache.py", "${libdir}/python${PYTHON_MAJMIN}/locale.py", - "${libdir}/python${PYTHON_MAJMIN}/lzma.py", "${libdir}/python${PYTHON_MAJMIN}/new.py", "${libdir}/python${PYTHON_MAJMIN}/ntpath.py", "${libdir}/python${PYTHON_MAJMIN}/opcode.py", @@ -268,6 +281,8 @@ "${libdir}/python${PYTHON_MAJMIN}/pathlib.py", "${libdir}/python${PYTHON_MAJMIN}/pathlib/_abc.py", "${libdir}/python${PYTHON_MAJMIN}/pathlib/_local.py", + "${libdir}/python${PYTHON_MAJMIN}/pathlib/_os.py", + "${libdir}/python${PYTHON_MAJMIN}/pathlib/types.py", "${libdir}/python${PYTHON_MAJMIN}/pkgutil.py", "${libdir}/python${PYTHON_MAJMIN}/platform.py", "${libdir}/python${PYTHON_MAJMIN}/posixpath.py", @@ -327,6 +342,7 @@ "ctypes": { "summary": "Python C types support", "rdepends": [ + "compression", "core", "io", "math" @@ -356,8 +372,7 @@ "files": [ "${libdir}/python${PYTHON_MAJMIN}/_strptime.py", "${libdir}/python${PYTHON_MAJMIN}/calendar.py", - "${libdir}/python${PYTHON_MAJMIN}/datetime.py", - "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_datetime.*.so" + "${libdir}/python${PYTHON_MAJMIN}/datetime.py" ] }, "db": { @@ -373,13 +388,22 @@ "debugger": { "summary": "Python debugger", "rdepends": [ + "asyncio", + "compression", "core", + "io", + "json", + "logging", + "math", + "netclient", + "numbers", "pprint", "shell", "stringold" ], "files": [ "${libdir}/python${PYTHON_MAJMIN}/bdb.py", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_remote_debugging.*.so", "${libdir}/python${PYTHON_MAJMIN}/pdb.py" ] }, @@ -414,9 +438,17 @@ "doctest": { "summary": "Python framework for running examples in docstrings", "rdepends": [ + "asyncio", + "compression", "core", "debugger", "difflib", + "io", + "json", + "logging", + "math", + "netclient", + "numbers", "pprint", "shell", "stringold", @@ -456,9 +488,7 @@ "rdepends": [ "core" ], - "files": [ - "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/fcntl.*.so" - ] + "files": [] }, "gdbm": { "summary": "Python GNU database support", @@ -500,6 +530,7 @@ "io": { "summary": "Python low-level I/O", "rdepends": [ + "compression", "core", "math", "netclient" @@ -645,10 +676,12 @@ "multiprocessing": { "summary": "Python multiprocessing support", "rdepends": [ + "compression", "core", "crypt", "ctypes", "io", + "json", "math", "mmap", "netclient", @@ -679,6 +712,7 @@ "${libdir}/python${PYTHON_MAJMIN}/hmac.py", "${libdir}/python${PYTHON_MAJMIN}/http", "${libdir}/python${PYTHON_MAJMIN}/http/__pycache__", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_hmac.*.so", "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_uuid.*.so", "${libdir}/python${PYTHON_MAJMIN}/mimetypes.py", "${libdir}/python${PYTHON_MAJMIN}/poplib.py", @@ -708,7 +742,6 @@ "${libdir}/python${PYTHON_MAJMIN}/contextvars.py", "${libdir}/python${PYTHON_MAJMIN}/decimal.py", "${libdir}/python${PYTHON_MAJMIN}/fractions.py", - "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_contextvars.*.so", "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_decimal.*.so", "${libdir}/python${PYTHON_MAJMIN}/numbers.py" ] @@ -788,8 +821,7 @@ "shell": { "summary": "Python shell-like functionality", "rdepends": [ - "core", - "stringold" + "core" ], "files": [ "${libdir}/python${PYTHON_MAJMIN}/cmd.py", @@ -910,8 +942,10 @@ "venv": { "summary": "Provides support for creating lightweight virtual environments with their own site directories, optionally isolated from system site directories.", "rdepends": [ + "compression", "core", "logging", + "shell", "stringold" ], "files": [ diff --git a/meta/recipes-devtools/python/python3_3.14.10.bb b/meta/recipes-devtools/python/python3_3.14.10.bb index 574b8e31d41..d7ddd5f404e 100644 --- a/meta/recipes-devtools/python/python3_3.14.10.bb +++ b/meta/recipes-devtools/python/python3_3.14.10.bb @@ -555,6 +555,7 @@ RDEPENDS:${PN}-tkinter += "${@bb.utils.contains('PACKAGECONFIG', 'tk', '${MLPREF RDEPENDS:${PN}-idle += "${@bb.utils.contains('PACKAGECONFIG', 'tk', '${PN}-tkinter ${MLPREFIX}tcl', '', d)}" DEV_PKG_DEPENDENCY = "" RDEPENDS:${PN}-pydoc += "${PN}-io" +RDEPENDS:${PN}-ensurepip += "${PN}-compression" RDEPENDS:${PN}-tests:append:class-target = " ${MLPREFIX}bash" RDEPENDS:${PN}-tests:append:class-nativesdk = " ${MLPREFIX}bash"