HoDA_Radio/BUILD.spec
2025-09-21 20:13:54 +02:00

112 lines
2.6 KiB
Python

# -*- mode: python ; coding: utf-8 -*-
import json
import sys
import os
from pathlib import Path
from os import getenv
# --- Load config.json ---
config_path = Path("../config.json")
with config_path.open("r", encoding="utf-8") as f:
config = json.load(f)
# --- Extract values ---
version = config.get("app_version", "0.0.0")
arch = config.get("architecture", "x64")
python_version = config.get("python_version", "3.x")
os_name = config.get("app_os", sys.platform)
app_name = config.get("app_name", "Application")
# --- Construct dynamic name ---
name = f"{app_name}-{os_name}-{arch}-v{version}"
# --- Optional icon path ---
icon = getenv("ICON_PATH", "")
# --- Data files to bundle ---
datas = [
("data/assets/*", "data/assets/"),
("data/", "data/"),
("config.json", "."),
(".env", "."),
]
binaries = []
# --- Analysis ---
a = Analysis(
["main.py"],
pathex=[],
binaries=binaries,
datas=datas,
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
noarchive=False,
optimize=0,
)
pyz = PYZ(a.pure)
# --- EXE common to all platforms ---
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.datas,
[],
name=name,
icon=icon if icon else None,
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=False, # pas de terminal par défaut
disable_windowed_traceback=False,
argv_emulation=(sys.platform == "darwin"), # utile sur macOS GUI
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)
# --- Platform-specific targets ---
if sys.platform == "darwin":
# macOS: wrap EXE in a .app bundle
app = BUNDLE(
exe,
name=f"{name}.app",
icon=icon if icon else None,
bundle_identifier=f"com.example.{app_name.lower()}"
)
# La dernière variable = objet final PyInstaller doit construire
coll = app
elif sys.platform.startswith("linux"):
# Linux: keep binary + generate .desktop file
coll = exe
dist_dir = Path("build")
dist_bin = dist_dir / name
desktop_file = dist_dir / f"{app_name}.desktop"
desktop_content = f"""[Desktop Entry]
Type=Application
Name={app_name}
Exec={dist_bin}
Icon={icon if icon else "application-default-icon"}
Terminal=false
Categories=Utility;
"""
# Création post-build
os.makedirs(dist_dir, exist_ok=True)
with open(desktop_file, "w", encoding="utf-8") as f:
f.write(desktop_content)
os.chmod(desktop_file, 0o755)
else:
# Windows: just the exe
coll = exe