Fix pyinstaller spec files

This commit is contained in:
Brett Williams
2026-01-12 09:08:35 -06:00
parent 8b3fdd14b5
commit 0a69c184eb
3 changed files with 280 additions and 174 deletions

View File

@@ -38,7 +38,8 @@ git clone https://github.com/blw1138/Zordon.git
pip3 install -r requirements.txt pip3 install -r requirements.txt
pip3 install pyinstaller pip3 install pyinstaller
pip3 install pyinstaller_versionfile pip3 install pyinstaller_versionfile
pyinstaller main.spec pyinstaller client.spec
pyinstaller server.spec
``` ```
## License ## License

View File

@@ -1,121 +1,158 @@
# -*- mode: python ; coding: utf-8 -*- # -*- mode: python ; coding: utf-8 -*-
from PyInstaller.utils.hooks import collect_all
# - get version from version file from PyInstaller.utils.hooks import collect_all
from pathlib import Path
import os import os
import sys import sys
import platform import platform
src_path = os.path.abspath("src")
sys.path.insert(0, src_path)
from version import APP_NAME, APP_VERSION, APP_AUTHOR
sys.path.insert(0, os.path.abspath('.'))
datas = [('resources', 'resources'), ('src/engines/blender/scripts/', 'src/engines/blender/scripts')] # ------------------------------------------------------------
# Project paths
# ------------------------------------------------------------
project_root = Path(SPECPATH).resolve()
src_dir = project_root / "src"
# Ensure `src.*` imports work during analysis
sys.path.insert(0, str(project_root))
# ------------------------------------------------------------
# Import version info
# ------------------------------------------------------------
from src.version import APP_NAME, APP_VERSION, APP_AUTHOR
APP_NAME = f"{APP_NAME}-client"
# ------------------------------------------------------------
# PyInstaller data / imports
# ------------------------------------------------------------
datas = [
("resources", "resources"),
("src/engines/blender/scripts", "src/engines/blender/scripts"),
]
binaries = [] binaries = []
hiddenimports = ['zeroconf'] hiddenimports = ["zeroconf", "src.version"]
tmp_ret = collect_all('zeroconf')
datas += tmp_ret[0]; binaries += tmp_ret[1]; hiddenimports += tmp_ret[2]
tmp_ret = collect_all("zeroconf")
datas += tmp_ret[0]
binaries += tmp_ret[1]
hiddenimports += tmp_ret[2]
# ------------------------------------------------------------
# Analysis
# ------------------------------------------------------------
a = Analysis( a = Analysis(
['client.py'], ["client.py"],
pathex=[], pathex=[str(project_root)],
binaries=binaries, binaries=binaries,
datas=datas, datas=datas,
hiddenimports=hiddenimports, hiddenimports=hiddenimports,
hookspath=[], hookspath=[],
hooksconfig={}, hooksconfig={},
runtime_hooks=[], runtime_hooks=[],
excludes=[], excludes=[],
noarchive=False, noarchive=False,
optimize=1, # fyi: optim level 2 breaks on windows optimize=1, # optimize=2 breaks Windows builds
) )
pyz = PYZ(a.pure) pyz = PYZ(a.pure)
if platform.system() == 'Darwin': # macOS # ------------------------------------------------------------
# Platform targets
# ------------------------------------------------------------
exe = EXE( if platform.system() == "Darwin": # macOS
pyz,
a.scripts,
[],
exclude_binaries=True,
name=APP_NAME,
debug=False,
bootloader_ignore_signals=False,
strip=True,
upx=True,
console=False,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)
app = BUNDLE(
exe,
a.binaries,
a.datas,
strip=True,
name=f'{APP_NAME}.app',
icon='resources/Server.png',
bundle_identifier=None,
version=APP_VERSION
)
elif platform.system() == 'Windows': exe = EXE(
pyz,
a.scripts,
[],
exclude_binaries=True,
name=APP_NAME,
debug=False,
bootloader_ignore_signals=False,
strip=True,
upx=True,
console=False,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)
import pyinstaller_versionfile app = BUNDLE(
import tempfile exe,
a.binaries,
a.datas,
strip=True,
name=f"{APP_NAME}.app",
icon="resources/Server.png",
bundle_identifier=None,
version=APP_VERSION,
)
version_file_path = os.path.join(tempfile.gettempdir(), 'versionfile.txt') elif platform.system() == "Windows":
pyinstaller_versionfile.create_versionfile( import pyinstaller_versionfile
output_file=version_file_path, import tempfile
version=APP_VERSION,
company_name=APP_AUTHOR,
file_description=APP_NAME,
internal_name=APP_NAME,
legal_copyright=f"© {APP_AUTHOR}",
original_filename=f"{APP_NAME}.exe",
product_name=APP_NAME
)
exe = EXE( version_file_path = os.path.join(
pyz, tempfile.gettempdir(), "versionfile.txt"
a.scripts, )
a.binaries,
a.datas,
[],
name=APP_NAME,
debug=False,
bootloader_ignore_signals=False,
strip=True,
upx=True,
console=False,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
version=version_file_path
)
else: # linux pyinstaller_versionfile.create_versionfile(
exe = EXE( output_file=version_file_path,
pyz, version=APP_VERSION,
a.scripts, company_name=APP_AUTHOR,
a.binaries, file_description=APP_NAME,
a.datas, internal_name=APP_NAME,
[], legal_copyright=f"© {APP_AUTHOR}",
name=APP_NAME, original_filename=f"{APP_NAME}.exe",
debug=False, product_name=APP_NAME,
bootloader_ignore_signals=False, )
strip=True,
upx=True, exe = EXE(
console=False, pyz,
disable_windowed_traceback=False, a.scripts,
argv_emulation=False, a.binaries,
target_arch=None, a.datas,
codesign_identity=None, [],
entitlements_file=None name=APP_NAME,
) debug=False,
bootloader_ignore_signals=False,
strip=True,
upx=True,
console=False,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
version=version_file_path,
)
else: # Linux
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.datas,
[],
name=APP_NAME,
debug=False,
bootloader_ignore_signals=False,
strip=True,
upx=True,
console=False,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)

View File

@@ -1,90 +1,158 @@
# -*- mode: python ; coding: utf-8 -*- # -*- mode: python ; coding: utf-8 -*-
from PyInstaller.utils.hooks import collect_all
# - get version from version file from PyInstaller.utils.hooks import collect_all
from pathlib import Path
import os import os
import sys import sys
import platform import platform
sys.path.insert(0, os.path.abspath('.'))
from version import APP_NAME, APP_VERSION, APP_AUTHOR
APP_NAME = APP_NAME + " Server" # ------------------------------------------------------------
datas = [('resources', 'resources'), ('src/engines/blender/scripts/', 'src/engines/blender/scripts')] # Project paths
# ------------------------------------------------------------
project_root = Path(SPECPATH).resolve()
src_dir = project_root / "src"
# Ensure `src.*` imports work during analysis
sys.path.insert(0, str(project_root))
# ------------------------------------------------------------
# Import version info
# ------------------------------------------------------------
from src.version import APP_NAME, APP_VERSION, APP_AUTHOR
APP_NAME = f"{APP_NAME}-server"
# ------------------------------------------------------------
# PyInstaller data / imports
# ------------------------------------------------------------
datas = [
("resources", "resources"),
("src/engines/blender/scripts", "src/engines/blender/scripts"),
]
binaries = [] binaries = []
hiddenimports = ['zeroconf'] hiddenimports = ["zeroconf", "src.version"]
tmp_ret = collect_all('zeroconf')
datas += tmp_ret[0]; binaries += tmp_ret[1]; hiddenimports += tmp_ret[2]
tmp_ret = collect_all("zeroconf")
datas += tmp_ret[0]
binaries += tmp_ret[1]
hiddenimports += tmp_ret[2]
# ------------------------------------------------------------
# Analysis
# ------------------------------------------------------------
a = Analysis( a = Analysis(
['server.py'], ["server.py"],
pathex=[], pathex=[str(project_root)],
binaries=binaries, binaries=binaries,
datas=datas, datas=datas,
hiddenimports=hiddenimports, hiddenimports=hiddenimports,
hookspath=[], hookspath=[],
hooksconfig={}, hooksconfig={},
runtime_hooks=[], runtime_hooks=[],
excludes=[], excludes=[],
noarchive=False, noarchive=False,
optimize=1, # fyi: optim level 2 breaks on windows optimize=1, # optimize=2 breaks Windows builds
) )
pyz = PYZ(a.pure) pyz = PYZ(a.pure)
if platform.system() == 'Windows': # ------------------------------------------------------------
# Platform targets
# ------------------------------------------------------------
import pyinstaller_versionfile if platform.system() == "Darwin": # macOS
import tempfile
version_file_path = os.path.join(tempfile.gettempdir(), 'versionfile.txt') exe = EXE(
pyz,
a.scripts,
[],
exclude_binaries=True,
name=APP_NAME,
debug=False,
bootloader_ignore_signals=False,
strip=True,
upx=True,
console=False,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)
pyinstaller_versionfile.create_versionfile( app = BUNDLE(
output_file=version_file_path, exe,
version=APP_VERSION, a.binaries,
company_name=APP_AUTHOR, a.datas,
file_description=APP_NAME, strip=True,
internal_name=APP_NAME, name=f"{APP_NAME}.app",
legal_copyright=f"© {APP_AUTHOR}", icon="resources/Server.png",
original_filename=f"{APP_NAME}.exe", bundle_identifier=None,
product_name=APP_NAME version=APP_VERSION,
) )
exe = EXE( elif platform.system() == "Windows":
pyz,
a.scripts,
a.binaries,
a.datas,
[],
name=APP_NAME,
debug=False,
bootloader_ignore_signals=False,
strip=True,
upx=True,
console=True,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
version=version_file_path
)
else: # linux / macOS import pyinstaller_versionfile
exe = EXE( import tempfile
pyz,
a.scripts, version_file_path = os.path.join(
a.binaries, tempfile.gettempdir(), "versionfile.txt"
a.datas, )
[],
name=APP_NAME, pyinstaller_versionfile.create_versionfile(
debug=False, output_file=version_file_path,
bootloader_ignore_signals=False, version=APP_VERSION,
strip=True, company_name=APP_AUTHOR,
upx=True, file_description=APP_NAME,
console=False, internal_name=APP_NAME,
disable_windowed_traceback=False, legal_copyright=f"© {APP_AUTHOR}",
argv_emulation=False, original_filename=f"{APP_NAME}.exe",
target_arch=None, product_name=APP_NAME,
codesign_identity=None, )
entitlements_file=None
) exe = EXE(
pyz,
a.scripts,
a.binaries,
a.datas,
[],
name=APP_NAME,
debug=False,
bootloader_ignore_signals=False,
strip=True,
upx=True,
console=False,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
version=version_file_path,
)
else: # Linux
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.datas,
[],
name=APP_NAME,
debug=False,
bootloader_ignore_signals=False,
strip=True,
upx=True,
console=False,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)