release: add ARM64 release build script; installer knows its pinned release

- scripts/build-release.sh WORKDIR VERSION fetches SHA-256-pinned SDL3
  3.2.16 and OpenVR SDK 2.15.6, builds audio-only SDL3 and FrameYap, runs
  the tests, then stages and packages an external-runtime archive.
- RELEASE_VERSION (set in a tagged release commit) makes the attended
  installer ask only y/n: install this release from GitHub, the speech
  model, the CPU runtime. Flag-driven binary installs default to it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
baketnkandClaude Opus 5.5 committed 2026-09-25 11:06:50 -04:00
1 parent e6cb07e8b8
commit 4cbeff08d4
4 files changed
+126 -8

No files matched your search

+15 -1
View File
@@ -43,6 +43,9 @@ from urllib.parse import quote
import urllib.request
KEY = "local.frameyap.overlay"
# The pinned release this installer belongs to (set in the release commit that
# is tagged vRELEASE_VERSION); empty in a development tree.
RELEASE_VERSION = ""
MARKER = "# FrameYap managed launcher v1\n"
ARCHIVE_LIMIT = 12 * 1024**3
MEMBER_LIMIT = 50000
@@ -980,6 +983,9 @@ def resolve_args(argv):
if args.install_runtime and (args.version or args.without_model or args.autolaunch is not None or
args.backend != "redux" or args.model_dir or args.expected_manifest_sha256):
parser.error("--install-runtime is independent of release/model flags")
if not (args.rollback or args.uninstall or args.install_model or args.install_runtime or args.version) \
and RELEASE_VERSION and args.mode == "binary" and not args.archive:
args.version = RELEASE_VERSION # this installer's own pinned release, not a moving tag
if not (args.rollback or args.uninstall or args.install_model or args.install_runtime) and not args.version:
parser.error("--version VERSION is required; no moving/latest release")
if args.uninstall != args.unregistered:
@@ -1120,6 +1126,11 @@ def interactive_options():
Returns one argv per step; each step is an ordinary flag-driven operation."""
print("If you piped this script without reading it, you can press Ctrl+C now and read it first.")
if RELEASE_VERSION:
print(f"FrameYap installer for release v{RELEASE_VERSION} (github.com/baketnk/frame-yap).")
if not ask_yes_no(f"Download and install FrameYap v{RELEASE_VERSION} from GitHub (checksum verified)?"):
raise UsageError("download not approved; no installation started")
return optional_steps([["--mode", "binary", "--version", RELEASE_VERSION, "--yes"]])
print("FrameYap installer: choose binary (verified archive) or source (local build).")
mode = input("Mode [binary/source]: ").strip().lower()
if mode not in ("binary", "source"):
@@ -1138,7 +1149,10 @@ def interactive_options():
else:
for flag in ("source", "openvr-root", "openvr-library", "openvr-license", "sdl-library", "sdl-license"):
chosen += ["--" + flag, input(flag + " local path: ").strip()]
steps = [chosen]
return optional_steps([chosen])
def optional_steps(steps):
# Each download is described and separately approved; nothing is fetched on a default.
if ask_yes_no("Download the Parakeet Redux speech model (about 180 MB, CC-BY-4.0) from Hugging Face?"):
steps.append(["--install-model", "--backend", "redux", "--yes"])