calibre/bypy/init_env.py
2025-03-04 07:58:40 +05:30

203 lines
5.5 KiB
Python

#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPL v3 Copyright: 2019, Kovid Goyal <kovid at kovidgoyal.net>
import json
import os
import re
import subprocess
import sys
from bypy.constants import LIBDIR, PREFIX, PYTHON, build_dir, islinux, ismacos, worker_env
from bypy.constants import SRC as CALIBRE_DIR
from bypy.utils import run_shell
dlls = [
'Core',
'Concurrent',
'Gui',
'Network',
# 'NetworkAuth',
'PrintSupport',
'WebChannel',
# 'WebSockets',
# 'WebView',
'Positioning',
'Sensors',
'SpatialAudio',
'Sql',
'Svg',
'TextToSpeech',
'WebChannel',
'WebEngineCore',
'WebEngineWidgets',
'Widgets',
'Multimedia',
'MultimediaWidgets',
'OpenGL',
'OpenGLWidgets',
'Quick',
'QuickWidgets',
'Qml',
'QmlMeta',
'QmlModels',
'QmlWorkerScript',
'Xml',
# 'XmlPatterns',
]
if islinux:
dlls += ['XcbQpa', 'WaylandClient', 'WaylandEglClientHwIntegration', 'DBus']
elif ismacos:
dlls += ['DBus']
QT_MAJOR = 6
QT_DLLS = frozenset(
f'Qt{QT_MAJOR}' + x for x in dlls
)
QT_PLUGINS = [
'imageformats',
'iconengines',
'tls',
'multimedia',
'texttospeech',
# 'mediaservice',
'platforms',
# 'playlistformats',
'sqldrivers',
# 'webview',
# 'audio', 'printsupport', 'bearer', 'position',
]
if islinux:
QT_PLUGINS += [
'egldeviceintegrations',
'platforminputcontexts',
'platformthemes',
'wayland-decoration-client',
'wayland-graphics-integration-client',
'wayland-shell-integration',
'xcbglintegrations',
]
else:
QT_PLUGINS.append('styles')
PYQT_MODULES = (
'Qt',
'QtCore',
'QtGui',
'QtNetwork',
'QtMultimedia', 'QtMultimediaWidgets',
'QtTextToSpeech',
'QtPrintSupport',
'QtSensors',
'QtSvg',
'QtWidgets',
'QtOpenGL',
'QtOpenGLWidgets',
'QtWebEngine',
'QtWebEngineCore',
'QtWebEngineWidgets',
'QtWebChannel',
)
del dlls
def read_cal_file(name):
with open(os.path.join(CALIBRE_DIR, 'src', 'calibre', name), 'rb') as f:
return f.read().decode('utf-8')
def initialize_constants():
calibre_constants = {}
src = read_cal_file('constants.py')
nv = re.search(r'numeric_version\s+=\s+\((\d+), (\d+), (\d+)\)', src)
calibre_constants['version'
] = '%s.%s.%s' % (nv.group(1), nv.group(2), nv.group(3))
def get_str_assign(which):
pat = r'__appname__\s+=\s+(u{0,1})[\'"]([^\'"]+)[\'"]'.replace('__appname__', which)
return re.search(pat, src).group(2)
calibre_constants['appname'] = get_str_assign('__appname__')
calibre_constants['MAIN_APP_UID'] = get_str_assign('MAIN_APP_UID')
calibre_constants['VIEWER_APP_UID'] = get_str_assign('VIEWER_APP_UID')
calibre_constants['EDITOR_APP_UID'] = get_str_assign('EDITOR_APP_UID')
epsrc = re.compile(r'entry_points = (\{.*?\})',
re.DOTALL).search(read_cal_file('linux.py')).group(1)
entry_points = eval(epsrc, {'__appname__': calibre_constants['appname']})
def e2b(ep):
return re.search(r'\s*(.*?)\s*=', ep).group(1).strip()
def e2s(ep, base='src'):
return (
base + os.path.sep +
re.search(r'.*=\s*(.*?):', ep).group(1).replace('.', '/') + '.py'
).strip()
def e2m(ep):
return re.search(r'.*=\s*(.*?)\s*:', ep).group(1).strip()
def e2f(ep):
return ep[ep.rindex(':') + 1:].strip()
calibre_constants['basenames'] = basenames = {}
calibre_constants['functions'] = functions = {}
calibre_constants['modules'] = modules = {}
calibre_constants['scripts'] = scripts = {}
for x in ('console', 'gui'):
y = x + '_scripts'
basenames[x] = list(map(e2b, entry_points[y]))
functions[x] = list(map(e2f, entry_points[y]))
modules[x] = list(map(e2m, entry_points[y]))
scripts[x] = list(map(e2s, entry_points[y]))
src = read_cal_file('ebooks/__init__.py')
be = re.search(
r'^BOOK_EXTENSIONS\s*=\s*(\[.+?\])', src, flags=re.DOTALL | re.MULTILINE
).group(1)
calibre_constants['book_extensions'] = json.loads(be.replace("'", '"'))
return calibre_constants
def run(*args, **extra_env):
env = os.environ.copy()
env.update(worker_env)
env.update(extra_env)
env['SW'] = PREFIX
env['LD_LIBRARY_PATH'] = LIBDIR
env['SIP_BIN'] = os.path.join(PREFIX, 'bin', 'sip')
env['QMAKE'] = os.path.join(PREFIX, 'qt', 'bin', 'qmake')
return subprocess.call(list(args), env=env, cwd=CALIBRE_DIR)
def build_c_extensions(ext_dir, args):
bdir = os.path.join(build_dir(), 'calibre-extension-objects')
cmd = [
PYTHON, 'setup.py', 'build',
'--output-dir', ext_dir, '--build-dir', bdir,
]
if args.build_only:
cmd.extend(('--only', args.build_only))
if run(*cmd, COMPILER_CWD=bdir) != 0:
print('Building of calibre C extensions failed', file=sys.stderr)
os.chdir(CALIBRE_DIR)
run_shell()
raise SystemExit('Building of calibre C extensions failed')
return ext_dir
def run_tests(path_to_calibre_debug, cwd_on_failure):
ret = run(path_to_calibre_debug, '--test-build')
if ret != 0:
os.chdir(cwd_on_failure)
print(
'running calibre build tests failed with return code:', ret, 'and exe:', path_to_calibre_debug, file=sys.stderr)
run_shell()
raise SystemExit('running calibre build tests failed')
if __name__ == 'program':
calibre_constants = initialize_constants()