# -*- mode: python ; coding: utf-8 -*- """PyInstaller spec: build the PSP Preservation Tool (onedir). Bundles the read-only resources (DATs, PS1 loader, offline cover bundles, icons) under ``lib/`` next to the executable. User-writable data (credentials, manual covers, PS1 templates, NPS cache, library DB, cover cache) lives in the OS state dir at runtime — see ``app/config.py``. Usage: pyinstaller --clean --noconfirm psp-preserve.spec Output: dist/psp-preserve/ """ from PyInstaller.utils.hooks import collect_dynamic_libs, collect_submodules datas = [ ("data/dats", "data/dats"), ("data/loader", "data/loader"), ("data/supplement.json", "data"), ("data/covers/libretro-covers.zip", "data/covers"), ("data/covers/openvgdb-covers.zip", "data/covers"), ("data/covers/libretro-index.json", "data/covers"), ("data/covers/openvgdb-index.json", "data/covers"), ("data/covers/UMD_COVER_TEMPLATE.png", "data/covers"), ("data/covers/UMD_COVER_TEMPLATE_FEATURE.png", "data/covers"), ("data/covers/UMD_GAME_COVER_TEMPLATE.png", "data/covers"), ("img/app-icon.png", "img"), ("img/chevron.png", "img"), ("packaging/psp-preserve.desktop", "."), ] a = Analysis( ["run.py"], pathex=[], binaries=collect_dynamic_libs("curl_cffi"), datas=datas, hiddenimports=collect_submodules("curl_cffi"), hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=["tkinter", "unittest", "pydoc"], noarchive=False, ) pyz = PYZ(a.pure) exe = EXE( pyz, a.scripts, [], exclude_binaries=True, name="psp-preserve", debug=False, bootloader_ignore_signals=False, strip=False, upx=False, console=False, disable_windowed_traceback=False, ) coll = COLLECT( exe, a.binaries, a.datas, strip=False, upx=False, name="psp-preserve", contents_directory="lib", )