Skip to content

Build VLEAPP with one PyInstaller driver on every platform - #274

Merged
Johann-PLW merged 1 commit into
abrignoni:mainfrom
Johann-PLW:feat/packaging-build-driver
Oct 1, 2026
Merged

Johann-PLW merged 1 commit into
abrignoni:mainfrom
Johann-PLW:feat/packaging-build-driver

Conversation

@Johann-PLW

@Johann-PLW Johann-PLW commented Oct 1, 2026 •

Copy link
Copy Markdown
Collaborator

Replaces the six PyInstaller specs under scripts/pyinstaller/ with packaging/build.py, ported from iLEAPP's (abrignoni/iLEAPP#2298) by way of RLEAPP's (abrignoni/RLEAPP#541). It has four commands, exe, smoke, installer and verify, and builds in two phases so signing can happen in between. One spec covers every platform.

What changes

  • One executable, vleapp, built from packaging/entrypoint.py. Started without arguments it opens the window; with arguments it is the command line. Tools that run vleapp -t fs -i ... -o ... see no change. On Linux with no display, it prints the help. There is no vleappGUI in a build any more.
  • macOS: the app is VLEAPP.app with bundle id org.leapps.VLEAPP, replacing 4n6.brigs.VLEAPP. macOS treats it as a different app, so permissions granted to the old one, Full Disk Access included, have to be granted again. LSBackgroundOnly is set back to false so the window gets a Dock icon and a menu bar.
  • Hidden imports: every artifact module is now a hidden import, so PyInstaller follows what the artifacts import. compression.zstd is named outright because search_files.py imports it by a name built at run time. The old specs' stdlib list (bz2, gzip, tarfile, xml.etree.ElementTree) is kept.
  • Version: read from scripts/version_info.py, so the two Windows version files are gone. vleapp.py gains --version.
  • smoke runs four checks: --version; a run over an empty extraction; a run over the NTFS raw fixture; and a new --selfcheck in vleappGUI.py, which starts Tk, loads the images and every artifact, compares the artifact count with the source, then exits before drawing a window.
  • Installers:
    • Windows: Inno Setup with VLEAPP's own AppId.
    • macOS: a dmgbuild disk image with a Retina @2x background.
    • Linux: an AppImage built with pinned tools (appimagetool 1.9.1 and runtime 20251108, checked by digest).
  • test_builds.yml builds and smoke-tests six legs: Windows x64 and ARM64, macOS Apple silicon and Intel, Linux x64 and ARM64. Linux builds on Ubuntu 22.04 for glibc 2.35, actions are on their Node 24 releases, and jobs are named after the machine. It runs weekly, on dispatch, and on PRs that touch packaging.
  • release.yml builds a draft release from a v* tag:
    • It refuses a tag that does not match vleapp_version.
    • Assets are named VLEAPP-<version>-<platform>-<arch>, staged in release-assets/ (never assets/, which holds the window's images), and listed in SHA256SUMS.txt. Linux ships the AppImage alone, with no .tar.gz.
    • macOS signing and notarisation are mandatory for a tag: without the MACOS_* secrets the macOS legs stop before building. A dispatched rehearsal builds unsigned.
  • No OpenSSL step on Windows ARM64, unlike iLEAPP and RLEAPP: nothing VLEAPP requires depends on cryptography.
  • scripts/lavafuncs.py reports leapp_mode as GUI when the GUI module is loaded. Apart from the tool's name, the file is now identical to RLEAPP's.

Download names change

The per-program downloads (vleapp-v*-Windows_x86_64.zip, vleappGUI-v*-macOS_Apple_Silicon.dmg and so on, up to v2026.4.1) are replaced by the names above. leapps.org links will need updating at the next release. .github/release-footer.md tells tools that launch VLEAPP what changed for them.

Verified locally

macOS arm64, Python 3.14.7, PyInstaller 6.22.3:

  • Phase 1 takes 18 s and produces a 69 MB bundle; the disk image is 32 MB.
  • All smoke checks pass, with 103 of 103 artifacts loaded by the build.
  • hdiutil verify passes. The background TIFF holds both resolutions (960x540 and 1920x1080), and the .DS_Store places the icons at the positions above.
  • The full test suite passes on 3.14 (501 tests) and on 3.10.
  • lint_changed.py finds no new warnings, and actionlint passes on the workflows.

Windows, Linux, the AppImage and notarisation are checked only by this PR's CI.

Cross-core

The lavafuncs.py change brings VLEAPP into line with iLEAPP, ALEAPP and RLEAPP. DLEAPP still has neither this leapp_mode check nor the packaging driver.

🤖 Generated with Claude Code

Replaces the six PyInstaller specs under scripts/pyinstaller/ with
packaging/build.py, ported from iLEAPP's (abrignoni/iLEAPP#2298) by way
of RLEAPP's: exe, smoke, installer and verify, in two phases so signing
fits between them, and one spec for every platform.

- One executable, vleapp, from packaging/entrypoint.py: the window
  without arguments, the command line with them. On macOS VLEAPP.app,
  bundle id org.leapps.VLEAPP, LSBackgroundOnly set back to false.
- Every artifact module is a hidden import; compression.zstd is named
  outright because search_files.py imports it by a run-time name. The
  old specs' stdlib list (bz2, gzip, tarfile, xml.etree) is kept.
- The version is read from scripts/version_info.py; the two Windows
  version files are gone. vleapp.py gains --version.
- smoke runs --version, an empty extraction, the NTFS raw fixture and
  the new --selfcheck in vleappGUI.py, which compares the artifact
  count with the source.
- Installers: Inno Setup with VLEAPP's own AppId, a dmgbuild disk image
  with a Retina @2x background, and an AppImage from pinned tools.
  VLEAPP's background draws the arrow 44 points right of the other
  LEAPPs', so the icons sit at (304, 290) and (654, 290); a test finds
  the arrow and requires the icons to straddle it.
- test_builds.yml builds and smoke-tests six legs, Linux on Ubuntu
  22.04, actions on their Node 24 releases, jobs named by machine;
  release.yml builds a draft release from a v* tag, stages assets in
  release-assets/, ships Linux as the AppImage alone, and refuses an
  unsigned macOS build. No OpenSSL step on Windows ARM64: nothing
  VLEAPP requires depends on cryptography.
- lavafuncs.py reports leapp_mode GUI when the GUI module is loaded,
  as iLEAPP, ALEAPP and RLEAPP already do.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Johann-PLW Johann-PLW added the Needs Cross Core Leveling for a PR that needs to be applied across other cores. remove once leveled to all. label Oct 1, 2026
@Johann-PLW
Johann-PLW merged commit 5d11b73 into abrignoni:main Oct 1, 2026
15 checks passed
@Johann-PLW
Johann-PLW deleted the feat/packaging-build-driver branch October 1, 2026 07:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Needs Cross Core Leveling for a PR that needs to be applied across other cores. remove once leveled to all.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant