# -*- 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