112 lines
2.6 KiB
Python
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
|