# -*- mode: python ; coding: utf-8 -*-
"""PyInstaller 設定(PLAN_02 ステップ 8: Windows 単体 exe).
ビルド: `uv run pyinstaller TIASjudge.spec --noconfirm`
成果物: `dist/TIASjudge.exe`(onefile・コンソール非表示)
同梱データ `data/data.csv` は onefile 実行時に `sys._MEIPASS/data/data.csv` へ展開され,
`gui/main_window.py` の `default_training_data_path()` がそれを解決する.
アイコン `packaging/TIASjudge.ico`(旧 MFC 実装 `IDR_MAINFRAME` と同一ファイル)は
exe のファイルアイコンに設定しつつ同梱もし,実行時のウィンドウアイコンにも使う
(`gui/main_window.py` の `default_icon_path()` が解決する).
パスはすべて spec の位置(`SPECPATH`)からの相対で組み立てる(絶対パスを埋め込まない).
"""
from pathlib import Path
project_root = Path(SPECPATH) # noqa: F821 - PyInstaller が注入する
icon_path = project_root / "packaging" / "TIASjudge.ico"
a = Analysis( # noqa: F821
[str(project_root / "packaging" / "entry.py")],
pathex=[str(project_root / "src")],
binaries=[],
datas=[
(str(project_root / "data" / "data.csv"), "data"),
# ウィンドウ・タスクバーのアイコン用に同梱する(展開先は `sys._MEIPASS/packaging/`)
(str(icon_path), "packaging"),
],
hiddenimports=["tiasjudge", "tiasjudge.gui.main_window", "tiasjudge.gui.result_window"],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
# 不要な GUI ツールキット・開発用ツールを除外して exe を小さくする
excludes=["tkinter", "pytest", "ruff", "PyQt5", "PyQt6", "PySide2"],
noarchive=False,
optimize=0,
)
pyz = PYZ(a.pure) # noqa: F821
exe = EXE( # noqa: F821
pyz,
a.scripts,
a.binaries,
a.datas,
[],
name="TIASjudge",
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=False, # GUI アプリのためコンソールを出さない
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
icon=str(icon_path), # 旧 MFC 実装と同じアイコンを exe に埋め込む
)