115 lines
3.5 KiB
Bash
Executable File
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
|