Files
2026-07-21 21:11:19 +09:00

115 lines
3.5 KiB
Bash
Executable File

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