AutoPercenty3/build_linux.py

156 lines
4.8 KiB
Python

#!/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()