From d1eb24e0f4756cbfc4004278f95bf10789ca00d3 Mon Sep 17 00:00:00 2001 From: Valentin Niess Date: Thu, 22 May 2025 17:43:43 +0200 Subject: [PATCH] Manylinux1 patch --- python_appimage/manylinux/__init__.py | 6 +++- python_appimage/manylinux/extract.py | 11 +++--- python_appimage/manylinux/patch.py | 48 +++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 6 deletions(-) create mode 100644 python_appimage/manylinux/patch.py diff --git a/python_appimage/manylinux/__init__.py b/python_appimage/manylinux/__init__.py index f80b859..a849ec6 100644 --- a/python_appimage/manylinux/__init__.py +++ b/python_appimage/manylinux/__init__.py @@ -3,10 +3,11 @@ from types import SimpleNamespace from .config import Arch, LinuxTag, PythonImpl, PythonVersion from .download import Downloader from .extract import ImageExtractor, PythonExtractor +from .patch import Patcher __all__ = ['Arch', 'Downloader', 'ensure_image', 'ImageExtractor', 'LinuxTag', - 'PythonExtractor', 'PythonImpl', 'PythonVersion'] + 'Patcher', 'PythonExtractor', 'PythonImpl', 'PythonVersion'] 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) + patcher = Patcher(tag=tag, arch=arch) + patcher.patch(destination = image_extractor.default_destination()) + return SimpleNamespace( arch = arch, tag = tag, diff --git a/python_appimage/manylinux/extract.py b/python_appimage/manylinux/extract.py index f89e6f0..11f1167 100644 --- a/python_appimage/manylinux/extract.py +++ b/python_appimage/manylinux/extract.py @@ -247,12 +247,13 @@ class PythonExtractor: raise NotImplementedError() # Copy Tcl & Tk data. - tcltk_src = self.prefix / 'usr/local/lib' 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 = tx_version[-1] diff --git a/python_appimage/manylinux/patch.py b/python_appimage/manylinux/patch.py new file mode 100644 index 0000000..603179e --- /dev/null +++ b/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())