#!/usr/bin/env python3 """ 리눅스용 빌드 스크립트 PyInstaller를 사용하여 리눅스 실행파일 생성 """ import os import sys import subprocess import shutil import platform from pathlib import Path def main(): # 아키텍처 감지 arch = platform.machine().lower() is_arm = arch in ('arm64', 'aarch64', 'arm', 'armv7l') arch_name = "ARM" if is_arm else "x86_64" print(f"🐧 리눅스용 AutoPercenty3 빌드 시작... (아키텍처: {arch_name})") # 현재 디렉토리 확인 if not os.path.exists("main.py"): print("❌ main.py가 없습니다. 프로젝트 루트에서 실행하세요.") sys.exit(1) # 아키텍처별 의존성 설치 if is_arm and os.path.exists("requirements_arm.txt"): print("📦 ARM용 의존성 설치 중...") subprocess.run([sys.executable, "-m", "pip", "install", "-r", "requirements_arm.txt"]) elif os.path.exists("requirements_linux.txt"): print("📦 x86_64용 의존성 설치 중...") subprocess.run([sys.executable, "-m", "pip", "install", "-r", "requirements_linux.txt"]) else: print("⚠️ 적절한 requirements 파일을 찾을 수 없습니다.") # PyInstaller 설치 확인 try: import PyInstaller except ImportError: print("📦 PyInstaller 설치 중...") subprocess.run([sys.executable, "-m", "pip", "install", "pyinstaller"]) # 빌드 디렉토리 정리 build_dirs = ["build", "dist", "__pycache__"] for dir_name in build_dirs: if os.path.exists(dir_name): shutil.rmtree(dir_name) print(f"🧹 {dir_name} 디렉토리 정리 완료") # PyInstaller 명령어 구성 app_name = f"AutoPercenty3_Linux_{arch_name}" pyinstaller_cmd = [ sys.executable, "-m", "PyInstaller", f"--name={app_name}", "--onedir", # 단일 디렉토리로 패키징 "--windowed", # GUI 모드 "--clean", # 데이터 파일 포함 "--add-data=src:src", "--add-data=kiprisCategories.json:.", "--add-data=prompt.json:.", "--add-data=config.ini:.", # 폰트 파일들 포함 "--add-data=src/modules/fonts:src/modules/fonts", # 히든 임포트 "--hidden-import=PySide6.QtCore", "--hidden-import=PySide6.QtGui", "--hidden-import=PySide6.QtWidgets", "--hidden-import=playwright", "--hidden-import=paddleocr", "--hidden-import=cv2", "--hidden-import=numpy", "--hidden-import=pandas", "--hidden-import=requests", # 제외할 모듈 "--exclude-module=pywin32", "--exclude-module=pywinauto", "--exclude-module=tkinter", "main.py" ] print("🔨 PyInstaller 빌드 실행...") result = subprocess.run(pyinstaller_cmd) if result.returncode == 0: print("✅ 빌드 성공!") print(f"📁 실행파일 위치: dist/{app_name}/") print(f"🚀 실행 방법: cd dist/{app_name} && ./{app_name}") print(f"🎯 아키텍처: {arch_name} ({arch})") # 실행 권한 설정 exec_file = f"dist/{app_name}/{app_name}" if os.path.exists(exec_file): os.chmod(exec_file, 0o755) print("✅ 실행 권한 설정 완료") # 시작 스크립트 생성 create_launcher_script(app_name, arch_name) else: print("❌ 빌드 실패!") sys.exit(1) def create_launcher_script(app_name, arch_name): """리눅스용 시작 스크립트 생성""" launcher_content = f"""#!/bin/bash # AutoPercenty3 Linux Launcher ({arch_name}) # 현재 스크립트 위치 SCRIPT_DIR="$(cd "$(dirname "${{BASH_SOURCE[0]}}")" && pwd)" EXEC_PATH="$SCRIPT_DIR/{app_name}" echo "🐧 AutoPercenty3 starting on {arch_name}..." # 환경 변수 설정 export QT_QPA_PLATFORM=xcb export QT_AUTO_SCREEN_SCALE_FACTOR=1 # ARM 최적화 설정 if [[ "$(uname -m)" =~ ^(arm|aarch) ]]; then echo "🔧 ARM 최적화 설정 적용 중..." export OMP_NUM_THREADS=4 export OPENBLAS_NUM_THREADS=4 fi # 필요한 라이브러리 경로 추가 export LD_LIBRARY_PATH="$SCRIPT_DIR:$LD_LIBRARY_PATH" # 실행 cd "$SCRIPT_DIR" exec "./{app_name}" "$@" """ launcher_path = f"dist/{app_name}/start.sh" with open(launcher_path, 'w') as f: f.write(launcher_content) os.chmod(launcher_path, 0o755) print("✅ 시작 스크립트 생성: start.sh") # 아키텍처별 추가 안내 if "ARM" in arch_name: print("\n🔧 ARM 관련 주의사항:") print(" - PaddleOCR 대신 EasyOCR 사용") print(" - GPU 가속 제한적 (CPU 모드)") print(" - 시스템 Chromium 권장") if __name__ == "__main__": main()