Add PyInstaller Windows release build system.

Frozen builds resolve paths correctly, stage portable onedir output, and zip releases for distribution.
This commit is contained in:
Dr Jones
2026-05-22 19:20:06 -07:00
parent bef3de1245
commit 05a32015db
10 changed files with 548 additions and 24 deletions

49
main.py
View File

@@ -11,23 +11,51 @@ import logging
import sys
import os
# Add project root to path
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
# Project root on sys.path when running from source (PyInstaller bundles modules directly)
if not getattr(sys, "frozen", False):
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from config import ensure_dirs, DATA_DIR, APP_NAME, APP_VERSION
# bug #35: ensure data directories exist before any module tries to write them
from config import ensure_dirs
ensure_dirs()
# Configure logging
_handlers = [logging.StreamHandler()]
if getattr(sys, "frozen", False):
_log_file = DATA_DIR / "godcwak.log"
_handlers.append(logging.FileHandler(_log_file, encoding="utf-8"))
logging.basicConfig(
level=logging.INFO,
format="[%(asctime)s] %(levelname)s: %(message)s",
datefmt="%H:%M:%S",
handlers=_handlers,
)
logger = logging.getLogger(__name__)
def _fatal(message: str, exc: Exception | None = None):
"""Show a visible error in dev (console) and in frozen builds (dialog + log file)."""
if exc is not None:
logger.error(message, exc_info=exc)
else:
logger.error(message)
if getattr(sys, "frozen", False):
try:
import tkinter as tk
from tkinter import messagebox
root = tk.Tk()
root.withdraw()
messagebox.showerror(APP_NAME, message)
root.destroy()
except Exception:
pass
else:
input("\nPress Enter to exit...")
sys.exit(1)
def check_dependencies():
"""Check that critical dependencies are available."""
missing = []
@@ -83,12 +111,13 @@ def check_dependencies():
def main():
"""Application entry point."""
logger.info("=" * 60)
logger.info(" GODCWAK v1.0")
logger.info(f" {APP_NAME} v{APP_VERSION}")
if getattr(sys, "frozen", False):
logger.info(" (packaged build)")
logger.info("=" * 60)
if not check_dependencies():
input("\nPress Enter to exit...")
sys.exit(1)
_fatal("Missing required dependencies. Reinstall the application or run pip install -r requirements.txt")
try:
from src.gui.app import GODCWAKApp
@@ -98,9 +127,7 @@ def main():
app.mainloop()
except Exception as e:
logger.error(f"Fatal error: {e}", exc_info=True)
input("\nPress Enter to exit...")
sys.exit(1)
_fatal(f"Fatal error: {e}", exc=e)
if __name__ == "__main__":