Files
python-appimage/python_appimage/deps.py
Valentin Niess dc3acadb9a Initial commit
2020-03-29 11:59:23 +02:00

100 lines
3.1 KiB
Python

import os
import platform
import stat
from .fs import copy_file, copy_tree, make_tree
from .log import log
from .system import system
from .tmp import TemporaryDirectory
from .url import urlretrieve
__all__ = ['APPIMAGETOOL', 'EXCLUDELIST', 'PATCHELF', 'PREFIX',
'ensure_appimagetool', 'ensure_excludelist', 'ensure_patchelf',
'fetch_all']
_ARCH = platform.machine()
PREFIX = os.path.abspath(os.path.dirname(__file__))
'''Package installation prefix'''
APPIMAGETOOL = PREFIX + '/bin/appimagetool.' + _ARCH
'''Location of the appimagetool binary'''
EXCLUDELIST = PREFIX + '/data/excludelist'
'''AppImage exclusion list'''
PATCHELF = PREFIX + '/bin/patchelf.' + _ARCH
'''Location of the PatchELF binary'''
def ensure_appimagetool():
'''Fetch appimagetool from the web if not available locally
'''
if os.path.exists(APPIMAGETOOL):
return
appimage = 'appimagetool-{0:}.AppImage'.format(_ARCH)
baseurl = 'https://github.com/AppImage/AppImageKit/releases/' \
'download/continuous'
log('INSTALL', 'appimagetool from %s', baseurl)
appdir_name = 'appimagetool-{:}.appdir'.format(_ARCH)
appdir = os.path.join(os.path.dirname(APPIMAGETOOL), appdir_name)
if not os.path.exists(appdir):
make_tree(os.path.dirname(appdir))
with TemporaryDirectory() as tmpdir:
urlretrieve(os.path.join(baseurl, appimage), appimage)
os.chmod(appimage, stat.S_IRWXU)
system('./' + appimage, '--appimage-extract')
copy_tree('squashfs-root', appdir)
if not os.path.exists(APPIMAGETOOL):
os.symlink(appdir_name + '/AppRun', APPIMAGETOOL)
# Installers for dependencies
def ensure_excludelist():
'''Fetch the AppImage excludelist from the web if not available locally
'''
if os.path.exists(EXCLUDELIST):
return
baseurl = 'https://raw.githubusercontent.com/probonopd/AppImages/master'
log('INSTALL', 'excludelist from %s', baseurl)
urlretrieve(baseurl + '/excludelist', EXCLUDELIST)
mode = os.stat(EXCLUDELIST)[stat.ST_MODE]
os.chmod(EXCLUDELIST, mode | stat.S_IWGRP | stat.S_IWOTH)
def ensure_patchelf():
'''Fetch PatchELF from the web if not available locally
'''
if os.path.exists(PATCHELF):
return
iarch = 'i386' if _ARCH == 'i686' else _ARCH
appimage = 'patchelf-{0:}.AppImage'.format(iarch)
baseurl = 'https://github.com/niess/patchelf.appimage/releases/download'
log('INSTALL', 'patchelf from %s', baseurl)
dirname = os.path.dirname(PATCHELF)
patchelf = dirname + '/patchelf.' + _ARCH
make_tree(dirname)
with TemporaryDirectory() as tmpdir:
urlretrieve(os.path.join(baseurl, 'rolling', appimage), appimage)
os.chmod(appimage, stat.S_IRWXU)
system('./' + appimage, '--appimage-extract')
copy_file('squashfs-root/usr/bin/patchelf', patchelf)
os.chmod(patchelf, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
def fetch_all():
'''Fetch all dependencies from the web
'''
ensure_appimagetool()
ensure_excludelist()
ensure_patchelf()