#!/usr/bin/env bash # Windows 오프라인 초기 설정 — Git Bash / MSYS (cmd.exe 경로 변환 없이 직접 실행) set -euo pipefail ROOT="$(cd "$(dirname "$0")/.." && pwd)" cd "$ROOT" WHEELS="$ROOT/vendor/wheels" GETPIP="$ROOT/vendor/get-pip.py" LIBUSB="$ROOT/vendor/libusb-1.0.dll" EMBED_PY="$ROOT/vendor/python-windows/python.exe" VENV_PY="$ROOT/.venv/Scripts/python.exe" MAC_VENV="$ROOT/.venv/bin/python" if [[ ! -f "$WHEELS/pyusb-1.2.1-py3-none-any.whl" || ! -f "$LIBUSB" ]]; then echo "[!] vendor 번들이 불완전합니다. 압축 시 vendor/ 폴더를 반드시 포함하세요." >&2 echo " 필요: vendor/wheels, vendor/libusb-1.0.dll, vendor/get-pip.py" >&2 exit 1 fi # Mac .venv 가 zip 에 섞이면 Windows 에서 깨짐 if [[ -f "$MAC_VENV" && ! -f "$VENV_PY" ]]; then echo "[*] Mac .venv 제거 중…" rm -rf "$ROOT/.venv" fi venv_ok() { [[ -f "$VENV_PY" ]] || return 1 PYTHONPATH="$ROOT${PYTHONPATH:+:$PYTHONPATH}" "$VENV_PY" -c "import usb" 2>/dev/null || return 1 PYTHONPATH="$ROOT${PYTHONPATH:+:$PYTHONPATH}" "$VENV_PY" -c " from juc500_xfer.usb_link import libusb_path import sys sys.exit(0 if libusb_path() else 1) " 2>/dev/null } if venv_ok; then exit 0 fi echo "============================================" echo " JUC500 Windows 오프라인 초기 설정" echo "============================================" pick_boot_py() { if command -v py >/dev/null 2>&1; then if py -3 -c "import sys" 2>/dev/null; then echo "py -3" return 0 fi fi if command -v python >/dev/null 2>&1; then if python -c "import sys" 2>/dev/null; then echo "python" return 0 fi fi if [[ -f "$EMBED_PY" ]]; then echo "$EMBED_PY" echo "Using vendored Python: vendor/python-windows/python.exe" >&2 return 0 fi return 1 } BOOT_PY="$(pick_boot_py)" || { echo "[!] Python 없음. vendor/python-windows 가 있는지 확인하세요." >&2 exit 1 } echo "Bootstrap: $BOOT_PY" run_boot() { # shellcheck disable=SC2086 $BOOT_PY "$@" } if ! run_boot -c "import virtualenv" 2>/dev/null; then echo "Installing virtualenv from vendor/wheels …" if ! run_boot -m pip install --no-index --find-links="$WHEELS" virtualenv 2>/dev/null; then if [[ -f "$GETPIP" ]]; then run_boot "$GETPIP" --no-index --find-links="$WHEELS" pip setuptools wheel run_boot -m pip install --no-index --find-links="$WHEELS" virtualenv else echo "[!] virtualenv 설치 실패" >&2 exit 1 fi fi fi if [[ ! -f "$VENV_PY" ]]; then echo "Creating .venv (offline)…" run_boot -m virtualenv --no-periodic-update --no-setuptools --no-pip "$ROOT/.venv" run_boot "$GETPIP" --no-index --find-links="$WHEELS" pip setuptools wheel packaging elif ! "$VENV_PY" -m pip --version >/dev/null 2>&1; then echo "[*] .venv 손상 — 재생성…" rm -rf "$ROOT/.venv" run_boot -m virtualenv --no-periodic-update --no-setuptools --no-pip "$ROOT/.venv" run_boot "$GETPIP" --no-index --find-links="$WHEELS" pip setuptools wheel packaging fi echo "Installing dependencies from vendor/wheels (no PyPI)…" "$VENV_PY" -m pip install --no-index --find-links="$WHEELS" -U pip setuptools wheel packaging "$VENV_PY" -m pip install --no-index --find-links="$WHEELS" -r "$ROOT/requirements.txt" "$VENV_PY" -m pip install --no-index --find-links="$WHEELS" --no-build-isolation -e "$ROOT" cp -f "$LIBUSB" "$ROOT/.venv/Scripts/libusb-1.0.dll" echo "libusb-1.0.dll → .venv/Scripts/" if ! venv_ok; then echo "[!] 초기 설정 후에도 .venv 검증 실패" >&2 exit 1 fi echo "[*] Windows 초기 설정 완료" exit 0