Redirect the per-channel build scratch to /dev/shm and skip UPX, a big win when building from a USB stick / SD card (I/O-bound on flash): - TMPDIR + PIP_CACHE_DIR -> tmpfs - PyInstaller: --workpath -> tmpfs (PYI_WORKPATH); UPX off via TESTIUM_NO_UPX - Flatpak: build dir + ostree repo -> tmpfs (FLATPAK_BUILDDIR/REPODIR); the .flatpak-builder download cache stays on disk - AppImage: bind-mount a tmpfs dir at the in-container AppDir path (APPIMAGE_APPDIR_TMPFS) Scratch is freed on exit. Each build.sh honors the env vars with on-disk defaults, so behavior is unchanged without --ram. With --ram, prefer --serial on RAM-limited machines (flatpak+appimage are ~1 GB each). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
105 lines
3.9 KiB
Python
105 lines
3.9 KiB
Python
# -*- mode: python ; coding: utf-8 -*-
|
|
import os
|
|
from PyInstaller.utils.hooks import collect_submodules
|
|
|
|
# Language-server dependencies for `testium lsp`. pygls/lsprotocol register
|
|
# converters and features dynamically, so we collect their submodules wholesale
|
|
# and force-import their pure-python deps (cattrs/attrs/typing_extensions).
|
|
# The testium lsp modules are imported lazily by the CLI dispatch
|
|
# (`from lsp.server import serve`), which PyInstaller's static analysis misses —
|
|
# hence the explicit names. No source files need bundling: the schema export is
|
|
# now fully declarative (PARAMS + ACTIONS class attributes), so it no longer
|
|
# reads .py source via inspect.getsource (which fails in a frozen build).
|
|
_LSP_HIDDEN = (
|
|
collect_submodules("pygls")
|
|
+ collect_submodules("lsprotocol")
|
|
+ ["cattrs", "attr", "attrs", "typing_extensions",
|
|
"lsp", "lsp.server", "lsp.schema"]
|
|
)
|
|
|
|
# junit_xml is imported by post_exec scripts running under the *host* Python,
|
|
# not the frozen interpreter — so bundling it via hiddenimports alone is not
|
|
# enough. We also drop its source files at the _MEIPASS root so the host
|
|
# python3 finds them via the PYTHONPATH that py_process.py sets to
|
|
# tstium_path (= _MEIPASS when frozen).
|
|
import junit_xml as _junit_xml
|
|
JUNIT_XML_DIR = os.path.dirname(_junit_xml.__file__)
|
|
|
|
a = Analysis(
|
|
['../../src/testium/__main__.py'],
|
|
pathex=['../../src/testium',
|
|
'../../src/testium/main_win/resources'],
|
|
binaries=[],
|
|
# py_func/ and runtime/ are bundled at the _MEIPASS root because the
|
|
# py_func subprocess is launched with the *host* Python (not the
|
|
# frozen interpreter): it needs the source files on disk to find them
|
|
# via cwd=subproc_path() and `python3 py_func` + `from runtime.*`.
|
|
# py_func/, lua_func/ and runtime/ are bundled at the _MEIPASS root
|
|
# because the py_func subprocess is launched with the *host* Python
|
|
# (not the frozen interpreter): it needs the source files on disk to
|
|
# find them via cwd=subproc_path() and `python3 py_func` +
|
|
# `from runtime.*`. api/ and interpreter/ are intentionally NOT
|
|
# exposed: user py_func scripts must go through py_func.tm
|
|
# (JSON-RPC bridge) for any testium API call.
|
|
datas=[('../../src/VERSION', '.'),
|
|
('../../src/testium/lua_func', 'lua_func'),
|
|
('../../src/testium/py_func', 'py_func'),
|
|
('../../src/testium/runtime', 'runtime'),
|
|
(JUNIT_XML_DIR, 'junit_xml')],
|
|
hiddenimports=["git",
|
|
"interpreter",
|
|
"main_win",
|
|
"runtime",
|
|
"py_func",
|
|
"py_func.tm",
|
|
"py_func.handle",
|
|
"py_func.func_call",
|
|
"api",
|
|
"api.console",
|
|
"api.termconsole",
|
|
"api.console_ssh",
|
|
"api.raw_tcp_console",
|
|
"api.runtime_plot",
|
|
"api.testium",
|
|
"matplotlib.backends.backend_pdf",
|
|
"telnetlib3",
|
|
"serial",
|
|
"yaml",
|
|
"pexpect",
|
|
"jinja2",
|
|
"colorama",
|
|
"matplotlib",
|
|
"junit_xml",
|
|
"lxml"] + _LSP_HIDDEN,
|
|
hookspath=[],
|
|
hooksconfig={},
|
|
runtime_hooks=[],
|
|
excludes=[],
|
|
noarchive=False,
|
|
)
|
|
pyz = PYZ(a.pure)
|
|
|
|
exe = EXE(
|
|
pyz,
|
|
a.scripts,
|
|
a.binaries,
|
|
a.datas,
|
|
[],
|
|
name='testium',
|
|
debug=False,
|
|
bootloader_ignore_signals=False,
|
|
strip=False,
|
|
# UPX is CPU+IO heavy for a marginal size gain — build_all --ram sets
|
|
# TESTIUM_NO_UPX=1 to skip it (much faster on slow/flash storage).
|
|
upx=not os.environ.get("TESTIUM_NO_UPX"),
|
|
upx_exclude=[],
|
|
runtime_tmpdir=None,
|
|
console=True,
|
|
disable_windowed_traceback=False,
|
|
argv_emulation=False,
|
|
target_arch=None,
|
|
codesign_identity=None,
|
|
entitlements_file=None,
|
|
ico='../testium.png'
|
|
)
|