Quellcode durchsuchen

Manylinux1 patch

Valentin Niess vor 8 Monaten
Ursprung
Commit
d1eb24e0f4

+ 5 - 1
python_appimage/manylinux/__init__.py

@@ -3,10 +3,11 @@ from types import SimpleNamespace
 from .config import Arch, LinuxTag, PythonImpl, PythonVersion
 from .config import Arch, LinuxTag, PythonImpl, PythonVersion
 from .download import Downloader
 from .download import Downloader
 from .extract import ImageExtractor, PythonExtractor
 from .extract import ImageExtractor, PythonExtractor
+from .patch import Patcher
 
 
 
 
 __all__ = ['Arch', 'Downloader', 'ensure_image', 'ImageExtractor', 'LinuxTag',
 __all__ = ['Arch', 'Downloader', 'ensure_image', 'ImageExtractor', 'LinuxTag',
-           'PythonExtractor', 'PythonImpl', 'PythonVersion']
+           'Patcher', 'PythonExtractor', 'PythonImpl', 'PythonVersion']
 
 
 
 
 def ensure_image(tag, *, clean=False, extract=True):
 def ensure_image(tag, *, clean=False, extract=True):
@@ -31,6 +32,9 @@ def ensure_image(tag, *, clean=False, extract=True):
         )
         )
         image_extractor.extract(clean=clean)
         image_extractor.extract(clean=clean)
 
 
+        patcher = Patcher(tag=tag, arch=arch)
+        patcher.patch(destination = image_extractor.default_destination())
+
         return SimpleNamespace(
         return SimpleNamespace(
             arch = arch,
             arch = arch,
             tag = tag,
             tag = tag,

+ 6 - 5
python_appimage/manylinux/extract.py

@@ -247,12 +247,13 @@ class PythonExtractor:
             raise NotImplementedError()
             raise NotImplementedError()
 
 
         # Copy Tcl & Tk data.
         # Copy Tcl & Tk data.
-        tcltk_src = self.prefix / 'usr/local/lib'
         tx_version = []
         tx_version = []
-        for match in glob.glob(str(tcltk_src / 'tk*')):
-            path = Path(match)
-            if path.is_dir():
-                tx_version.append(LooseVersion(path.name[2:]))
+        for location in ('usr/local/lib', 'usr/share'):
+            tcltk_src = self.prefix / location
+            for match in glob.glob(str(tcltk_src / 'tk*')):
+                path = Path(match)
+                if path.is_dir():
+                    tx_version.append(LooseVersion(path.name[2:]))
         tx_version.sort()
         tx_version.sort()
         tx_version = tx_version[-1]
         tx_version = tx_version[-1]
 
 

+ 48 - 0
python_appimage/manylinux/patch.py

@@ -0,0 +1,48 @@
+from dataclasses import dataclass
+from pathlib import Path
+import os
+import stat
+import subprocess
+from typing import Optional
+
+from .config import Arch, LinuxTag
+from ..utils.deps import CACHE_DIR
+from ..utils.log import debug, log
+from ..utils.url import urlretrieve
+
+
+@dataclass(frozen=True)
+class Patcher:
+    '''Manylinux tag.'''
+    tag: LinuxTag
+
+    '''Platform architecture.'''
+    arch: Optional[Arch] = None
+
+
+    def patch(self, destination: Path):
+        '''Apply any patch'''
+
+        cache = Path(CACHE_DIR) / f'share/patches/'
+
+        if self.tag == LinuxTag.MANYLINUX_1:
+            patch = f'tk-manylinux1_{self.arch}'
+            log('PATCH', patch)
+            tarfile = f'{patch}.tar.gz'
+            path = cache / patch
+            if not path.exists():
+                url = f'https://github.com/niess/python-appimage/releases/download/manylinux1/{tarfile}'
+                urlretrieve(url, path)
+                mode = os.stat(path)[stat.ST_MODE]
+                os.chmod(path, mode | stat.S_IWGRP | stat.S_IWOTH)
+
+            debug('EXTRACT', tarfile)
+            cmd = ''.join((
+                 f'trap \'chmod u+rw -R {destination}\' EXIT ; ',
+                 f'mkdir -p {destination} && ',
+                 f'tar -xzf {tarfile} -C {destination}',
+            ))
+            r = subprocess.run(f'/bin/bash -c "{cmd}"', shell=True,
+                               capture_output=True)
+            if r.returncode != 0:
+                raise ValueError(r.stderr.decode())