go back to index - go to tags
2021-12-18
source: ./1639825135-python-3.10.1---come-risolvere-crash-di-kodi.html

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 ^^