feature/dual-mode-build #8

Merged
ergosum merged 19 commits from feature/dual-mode-build into master 2026-07-21 11:34:13 +03:00
Owner
No description provided.
- Three-layer defense against unwanted Qt modules (WebEngine, 3D, multimedia):
  1. QT_LIB_KEEP whitelist (30 Qt .so + 10 .abi3.so stems)
  2. EXCLUDED_MODULES substring filter on collect_data_files
  3. _toc_filter post-processing to catch hook-injected entries

- Dual-mode: onefile (PORTABLE) via default, onedir via ONEDIR=1 env var
- Renamed EXE from 'main' to 'qt-hledger'
- CI produces both artifacts per platform (Linux: .bin + .tar.gz,
  Windows: .exe + .zip) uploaded to release on tag push
- Reduces onefile binary from 247 MB to 155 MB (37% savings)
- Add _selective_plugins() to collect essential Qt plugin .so files
  (platforms, tls, iconengines, imageformats, wayland-*, xcbglintegrations)
- Add libQt6WaylandClient to QT_LIB_KEEP
- Narrow EXCLUDED_MODULES to only exclude compositor Wayland libs,
  not libQt6WaylandClient
- Strip LD_LIBRARY_PATH contamination from child processes (QProcess,
  subprocess) so bundled Qt libs don't shadow hledger's system deps
- Encapsulate PyInstaller bundle detection in core/bundle.py
collect_data_files('PySide6') returns zero QML plugin .so files —
PyInstaller classifies them as binaries. Add _selective_qml_plugins()
to collect .so files from needed QML module dirs (QtQuick, QtCore,
QtQml, QtNetwork, Qt5Compat, Qt/labs) into the binaries list.
- Remove unused VERSION from main.spec
- Guard update archive tar step with directory checks
- Extract duplicate release upload into ci/upload-release.sh
- Rewrite Windows update archive one-liner as readable multi-line heredoc
- Derive _toc_filter from EXCLUDED_MODULES (single source of truth)
- Respect existing QT_QPA_PLATFORM_PLUGIN_PATH in runtime_hook.py
fix: review fixes — MEDIUM + LOW issues
Some checks failed
Build binaries / lint (push) Failing after 6s
Build binaries / build-linux (push) Has been skipped
Build binaries / build-windows (push) Has been skipped
610e1a3913
MEDIUM:
- Extract _pyside6_root() helper to reduce duplication in main.spec
- Deduplicate _system_deps ldd inputs (seen set)
- Extract shared _exe_kwargs dict for onefile/onedir EXE blocks
- Cache clean_child_env via lru_cache (called 3x per hledger invocation)
- Defer PySide6 import in clean_qprocess_env for testability

LOW:
- Split imports to one per line in main.spec (PEP 8)
- Add comment about '3D' false-positive risk in EXCLUDED_MODULES
- Improve bundle.py docstring to describe actual purpose
- Use UUID suffix in build-windows.sh VM naming (prevents collisions)
fix: add __future__ annotations to resolve F821 in bundle.py
Some checks failed
Build binaries / lint (push) Failing after 5s
Build binaries / build-linux (push) Has been skipped
Build binaries / build-windows (push) Has been skipped
fe141964c1
fix: revert to module-level PySide6 import in bundle.py
Some checks failed
Build binaries / lint (push) Successful in 6s
Build binaries / build-linux (push) Failing after 36s
Build binaries / build-windows (push) Failing after 3s
3c7fb89253
Deferred import creates unresolvable conflict with ANN return type
annotations. Module-level import is correct since this module only
runs inside a PySide6 app.
fix: wrap EXCLUDED_MODULES in set() for TOC_EXCLUDE union
Some checks failed
Build binaries / lint (push) Successful in 6s
Build binaries / build-linux (push) Successful in 2m48s
Build binaries / build-windows (push) Failing after 3s
0ec1ab424d
fix: replace uuidgen with /dev/urandom for Alpine compat
Some checks failed
Build binaries / lint (push) Successful in 5s
Build binaries / build-linux (push) Successful in 2m47s
Build binaries / build-windows (push) Failing after 11m0s
69ec997a24
fix: use .ps1 file for Windows update archive (heredoc stdin broken over SSH)
Some checks failed
Build binaries / lint (push) Successful in 6s
Build binaries / build-linux (push) Successful in 2m46s
Build binaries / build-windows (push) Failing after 10m36s
c6aa7bb1ec
fix: bypass PowerShell execution policy for remote .ps1 script
All checks were successful
Build binaries / lint (push) Successful in 6s
Build binaries / build-linux (push) Successful in 2m48s
Build binaries / build-windows (push) Successful in 10m49s
620e17fb9e
fix: make PyInstaller spec cross-platform for Windows builds
All checks were successful
Build binaries / lint (push) Successful in 8s
Build binaries / build-linux (push) Successful in 2m50s
Build binaries / build-windows (push) Successful in 14m0s
55a4b0944a
fix: cross-platform PySide6 paths + include ShaderTools dependency
All checks were successful
Build binaries / lint (push) Successful in 6s
Build binaries / build-linux (push) Successful in 2m49s
Build binaries / build-windows (push) Successful in 14m44s
ab76e1c7ea
- Detect .dll/.pyd on Windows instead of only .so
- Handle flat PySide6 layout on Windows (no Qt/ subdirectory)
- Skip ldd-based _system_deps on Windows
- Set PATH instead of LD_LIBRARY_PATH in runtime_hook on Windows
- Add ShaderTools to bundled Qt modules (required by Qt5Compat/GraphicalEffects)
- Remove ShaderTools from EXCLUDED_MODULES
- Add Windows variant to _TOC_EXCLUDE for WaylandEglCompositor
ergosum merged commit 1dd0c6e0f5 into master 2026-07-21 11:34:13 +03:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
public/qt-hledger!8
No description provided.