diff --git a/packaging/livesub.spec b/packaging/livesub.spec index 5d26e2f..6aa9609 100644 --- a/packaging/livesub.spec +++ b/packaging/livesub.spec @@ -72,7 +72,8 @@ a = Analysis( # noqa: F821 binaries=binaries, datas=datas, hiddenimports=hiddenimports, - hookspath=[], + # contrib 훅이 빌드를 중단시키는 것을 덮어쓴다 (hook-webrtcvad.py 주석 참고). + hookspath=[str(ROOT / "packaging" / "pyinstaller-hooks")], runtime_hooks=[], excludes=excludes, noarchive=False, diff --git a/packaging/pyinstaller-hooks/hook-webrtcvad.py b/packaging/pyinstaller-hooks/hook-webrtcvad.py new file mode 100644 index 0000000..d4b63f8 --- /dev/null +++ b/packaging/pyinstaller-hooks/hook-webrtcvad.py @@ -0,0 +1,25 @@ +"""webrtcvad 훅 재정의 — contrib 훅이 배포 이름을 찾지 못해 빌드를 중단시킨다. + +우리가 설치하는 건 `webrtcvad-wheels` 다. 원본 `webrtcvad` 는 Windows 용 휠을 +올리지 않아서 MSVC 컴파일이 필요하기 때문이다. import 이름(`webrtcvad`)은 같지만 +**배포 이름이 다르다.** + +pyinstaller-hooks-contrib 의 `hook-webrtcvad.py` 는 `copy_metadata('webrtcvad')` 를 +부른다. 배포 이름이 없으니 `PackageNotFoundError` 가 나고, PyInstaller 는 훅 모듈 +import 실패를 `ImportErrorWhenRunningHook` 으로 올려 **빌드를 통째로 중단한다.** +Windows 포터블 빌드가 정확히 여기서 죽어 dist\\LiveSub.exe 가 안 나왔다. + +hookspath 의 훅이 contrib 훅보다 먼저 검색되므로 같은 파일명으로 덮어쓴다. +메타데이터를 실제 배포 이름으로 수집하고, 둘 다 없으면 그냥 넘어간다 — +webrtcvad 런타임은 importlib.metadata 를 읽지 않으므로 없어도 동작한다. +""" + +from PyInstaller.utils.hooks import copy_metadata + +datas = [] +for dist in ("webrtcvad-wheels", "webrtcvad"): + try: + datas = copy_metadata(dist) + break + except Exception: # noqa: BLE001 - 배포 이름이 없을 때만 다음 후보로 넘어간다 + continue