156 lines
4.8 KiB
Python
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()
|