Fortunatamente, esiste un package AUR per la compilazione di Python 3.10, a partire dai sorgenti rilasciati upstream.
preparazione
Il primo passo e' scaricare il sorgente del package AUR:
git clone https://aur.archlinux.org/python310.git
. Il passo
successivo consiste nel modificare il PKGBUILD al fine di applicare una
patch per revertare il commit incriminato.
diff --git a/PKGBUILD b/PKGBUILD
index 63fb046..7fbce3f 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -10,6 +10,7 @@ pkgdesc="Major release 3.10 of the Python high-level programming language"
arch=('i686' 'x86_64')
license=('custom')
url="https://www.python.org/"
+conflicts=('python')
depends=('bzip2' 'expat' 'gdbm' 'libffi' 'libnsl' 'libxcrypt' 'openssl' 'zlib')
makedepends=('bluez-libs' 'mpdecimal' 'gdb')
optdepends=('sqlite' 'mpdecimal: for decimal' 'xz: for lzma' 'tk: for tkinter')
@@ -27,6 +28,8 @@ prepare() {
# FS#23997
sed -i -e "s|^#.* /usr/local/bin/python|#!/usr/bin/python|" Lib/cgi.py
+ patch -p 0 < /some/where/damn.patch
+
# Ensure that we are using the system copy of various libraries (expat, zlib and libffi),
# rather than copies shipped in the tarball
rm -rf Modules/expat
@@ -38,6 +41,7 @@ prepare() {
build() {
cd "${srcdir}/Python-${pkgver}"
+
CFLAGS="${CFLAGS} -fno-semantic-interposition"
./configure --prefix=/usr \
--enable-shared \
@@ -50,6 +54,7 @@ build() {
--with-system-libmpdec \
--enable-loadable-sqlite-extensions \
--without-ensurepip \
+ --enable-optimizations \
--with-tzpath=/usr/share/zoneinfo
make EXTRA_CFLAGS="$CFLAGS"
La patch, indicata con il nome "/some/where/damn.patch", deriva dal task 73002 di Archlinux, da cui sono state rimosse manualmente le informazioni inserite da git durante la creazione della patch
+++ Lib/test/test_capi.py
@@ -774,37 +774,6 @@ def test_mutate_exception(self):
self.assertFalse(hasattr(binascii.Error, "foobar"))
- def test_module_state_shared_in_global(self):
- """
- bpo-44050: Extension module state should be shared between interpreters
- when it doesn't support sub-interpreters.
- """
- r, w = os.pipe()
- self.addCleanup(os.close, r)
- self.addCleanup(os.close, w)
-
- script = textwrap.dedent(f"""
- import importlib.machinery
- import importlib.util
- import os
-
- fullname = '_test_module_state_shared'
- origin = importlib.util.find_spec('_testmultiphase').origin
- loader = importlib.machinery.ExtensionFileLoader(fullname, origin)
- spec = importlib.util.spec_from_loader(fullname, loader)
- module = importlib.util.module_from_spec(spec)
- attr_id = str(id(module.Error)).encode()
-
- os.write({w}, attr_id)
- """)
- exec(script)
- main_attr_id = os.read(r, 100)
-
- ret = support.run_in_subinterp(script)
- self.assertEqual(ret, 0)
- subinterp_attr_id = os.read(r, 100)
- self.assertEqual(main_attr_id, subinterp_attr_id)
-
class TestThreadState(unittest.TestCase):
+++ Modules/_testmultiphase.c
@@ -848,28 +848,6 @@ PyInit__testmultiphase_meth_state_access(PyObject *spec)
return PyModuleDef_Init(&def_meth_state_access);
}
-static PyModuleDef def_module_state_shared = {
- PyModuleDef_HEAD_INIT,
- .m_name = "_test_module_state_shared",
- .m_doc = PyDoc_STR("Regression Test module for single-phase init."),
- .m_size = -1,
-};
-
-PyMODINIT_FUNC
-PyInit__test_module_state_shared(PyObject *spec)
-{
- PyObject *module = PyModule_Create(&def_module_state_shared);
- if (module == NULL) {
- return NULL;
- }
-
- if (PyModule_AddObjectRef(module, "Error", PyExc_Exception) < 0) {
- Py_DECREF(module);
- return NULL;
- }
- return module;
-}
-
/*** Helper for imp test ***/
+++ Python/import.c
@@ -441,9 +441,7 @@ _PyImport_FixupExtensionObject(PyObject *mod, PyObject *name,
return -1;
}
- // bpo-44050: Extensions and def->m_base.m_copy can be updated
- // when the extension module doesn't support sub-interpreters.
- if (_Py_IsMainInterpreter(tstate->interp) || def->m_size == -1) {
+ if (_Py_IsMainInterpreter(tstate->interp)) {
if (def->m_size == -1) {
if (def->m_base.m_copy) {
/* Somebody already imported the module,
build package
Avviare quindi il processo di build:
makepkg --cleanbuild --clean --syncdeps
, ed aspettare la
conclusione della build del pacchetto. su un vecchio pentium G-4 con 8
giga di RAM e pacman configurato per utilizzare tutti i core
disponibili, servono circa 10-15 minuti.
installazione
una volta generato, installare tramite
pacman -U ./python310-3.10.1-1-x86_64.pkg.tar.zst
.
nota: dovrebbe funzionare, io ho sfruttato l'installazione di questo
package tramite un repo pacman custom nella mia rete di casa.
symlink post-install
una volta installato (e rimosso python base, dato che python310 e'
stato configurato per andare in conflitto, e quindi forzare la
sostituzione del package base), bisogna creare un symlink
python -> python3.10
e
python3 -> python3.10
.
cd /usr/bin
sudo ln -s python3.10 python3
sudo ln -s python3.10 python
testing
se Kodi parte, allora va tutto bene ^^