#!/usr/bin/env bash # ============================================================================= # vendor.sh - 폐쇄망 설치용 의존성 사전 다운로드 # 인터넷에 연결된 빌드/스테이징 머신에서 실행한다. # 산출물: wheelhouse/ (pip wheel + sdist), debs/ (apt .deb) → 타깃 Pi 4 로 전송. # # wheel/deb 는 아키텍처에 종속된다. 기본값은 타깃(Raspberry Pi OS Bookworm 64-bit, # aarch64, Python 3.11)에 맞춰 명시 핀하므로 x86_64 빌드 머신에서 받아도 올바른 # aarch64 wheel 을 확보한다(빌드호스트 arch 와 무관). 그래도 .deb 는 타깃 OS/arch # 에서 받는 것이 가장 안전하다. 필요 시 환경변수로 타깃 조정: # TARGET_PLATFORM (기본 manylinux2014_aarch64), TARGET_PYVER (기본 311), CAM # ============================================================================= set -euo pipefail cd "$(dirname "$0")" TARGET_PLATFORM="${TARGET_PLATFORM:-manylinux2014_aarch64}" TARGET_PYVER="${TARGET_PYVER:-311}" TARGET_ABI="${TARGET_ABI:-cp${TARGET_PYVER}}" echo "[vendor] (1/2) Python wheel → wheelhouse/ (platform=${TARGET_PLATFORM}, py=${TARGET_PYVER})" mkdir -p wheelhouse python3 -m pip download -r requirements.txt -d wheelhouse \ --only-binary=:all: \ --platform "${TARGET_PLATFORM}" \ --python-version "${TARGET_PYVER}" \ --implementation cp \ --abi "${TARGET_ABI}" \ || { echo "[ERROR] 타깃 wheel 다운로드 실패 (TARGET_PLATFORM/TARGET_PYVER 확인)"; exit 1; } python3 -m pip download -r requirements.txt -d wheelhouse --no-binary=:all: \ || echo "[WARN] sdist 폴백 일부 실패 (바이너리 wheel 이 모두 있으면 무시 가능)" WHEEL_COUNT="$(ls -A wheelhouse 2>/dev/null | wc -l)" echo " wheelhouse 파일 수: ${WHEEL_COUNT}" [ "${WHEEL_COUNT}" -gt 0 ] || { echo "[ERROR] wheelhouse 비어있음"; exit 1; } echo "[vendor] (2/2) apt .deb → debs/" mkdir -p debs CAM="${CAM:-}" if [ -z "${CAM}" ]; then if apt-cache show rpicam-apps >/dev/null 2>&1; then CAM=rpicam-apps; else CAM=libcamera-apps; fi fi BASE_PKGS="python3-rpi-lgpio python3-requests python3-venv ${CAM}" DEPS="$(apt-cache depends --recurse --no-recommends --no-suggests \ --no-conflicts --no-breaks --no-replaces --no-enhances ${BASE_PKGS} \ | awk '/^\w/{print $1}' | sort -u)" ( cd debs && apt-get download ${BASE_PKGS} ${DEPS} ) 2>/dev/null \ || echo "[WARN] 일부 .deb 다운로드 실패 (가상패키지/전이 의존성일 수 있음 — 필수 패키지는 아래에서 검증)" MISS=0 for p in ${BASE_PKGS}; do if ! ls debs/"${p}"_*.deb >/dev/null 2>&1; then echo "[ERROR] 필수 패키지 .deb 누락: ${p}" MISS=1 fi done [ "${MISS}" = 0 ] || { echo "[ERROR] 필수 .deb 누락 — 반드시 타깃 arch(aarch64 Bookworm)에서 vendor.sh 를 실행하세요."; exit 1; } echo " debs 파일 수: $(ls debs/*.deb 2>/dev/null | wc -l) (필수 패키지 모두 확인됨)" echo "[vendor] 완료. wheelhouse/ 와 debs/ 를 타깃 Pi 4 로 전송 후 install.sh 실행."