import os import sys import subprocess from pathlib import Path def build_windows_exe(): agent_dir = Path(__file__).resolve().parent assets_dir = agent_dir / "assets" ico_path = assets_dir / "icon.ico" if not ico_path.exists(): print("[*] Generating icons...") from create_icons import generate_app_icons generate_app_icons() print("========================================================================") print(" BUILDING ONEVER DRIVE MODERN PYQT6 WINDOWS EXECUTABLE (.EXE) ") print("========================================================================") dist_dir = agent_dir / "dist" build_dir = agent_dir / "build" # PyInstaller arguments for modern PyQt6 standalone agent pyinstaller_args = [ sys.executable, "-m", "PyInstaller", "--noconfirm", "--onedir", "--windowed", # No console popup, pure GUI and tray f"--icon={str(ico_path)}", f"--name=OnEverDriveAgent", f"--distpath={str(dist_dir)}", f"--workpath={str(build_dir)}", f"--add-data={str(assets_dir)}{os.pathsep}assets", "--hidden-import=PyQt6", "--hidden-import=PyQt6.QtCore", "--hidden-import=PyQt6.QtGui", "--hidden-import=PyQt6.QtWidgets", "--hidden-import=httpx", "--hidden-import=pydantic", "--hidden-import=pydantic_settings", "--hidden-import=schedule", "--hidden-import=sqlite3", str(agent_dir / "agent_app_pyqt.py") ] print(f"[*] Compiling PyQt6 directory bundle...") subprocess.run(pyinstaller_args, check=True, cwd=str(agent_dir)) # Single-file build standalone_args = [ sys.executable, "-m", "PyInstaller", "--noconfirm", "--onefile", "--windowed", f"--icon={str(ico_path)}", f"--name=OnEverDriveAgent-Standalone", f"--distpath={str(dist_dir)}", f"--workpath={str(build_dir)}", f"--add-data={str(assets_dir)}{os.pathsep}assets", "--hidden-import=PyQt6", "--hidden-import=PyQt6.QtCore", "--hidden-import=PyQt6.QtGui", "--hidden-import=PyQt6.QtWidgets", "--hidden-import=httpx", "--hidden-import=pydantic", "--hidden-import=pydantic_settings", "--hidden-import=schedule", "--hidden-import=sqlite3", str(agent_dir / "agent_app_pyqt.py") ] print(f"[*] Compiling standalone single-file .exe...") subprocess.run(standalone_args, check=True, cwd=str(agent_dir)) exe_path = dist_dir / "OnEverDriveAgent" / "OnEverDriveAgent.exe" single_exe_path = dist_dir / "OnEverDriveAgent-Standalone.exe" print("") echo = "========================================================================" print(echo) print(f"[+] PyQt6 Executables built successfully:") print(f" 1. {exe_path}") print(f" 2. {single_exe_path}") print(echo) return exe_path if __name__ == "__main__": build_windows_exe()