#!/usr/bin/env bash # install.sh — set up the Kidsbox development environment # Installs ESP-IDF v5.2 + ESP-ADF v2.7, or validates an existing installation. set -euo pipefail BOLD='\033[1m'; GREEN='\033[0;32m'; YELLOW='\033[0;33m'; RED='\033[0;31m'; NC='\033[0m' info() { echo -e "${GREEN}[install]${NC} $*"; } warn() { echo -e "${YELLOW}[warn]${NC} $*"; } die() { echo -e "${RED}[error]${NC} $*" >&2; exit 1; } heading() { echo -e "\n${BOLD}$*${NC}"; } IDF_VERSION="v5.2.3" ADF_VERSION="v2.7" IDF_DEFAULT="$HOME/esp/esp-idf" ADF_DEFAULT="$HOME/esp/esp-adf" # ── prerequisites ────────────────────────────────────────────────────────────── heading "Checking prerequisites" for cmd in git python3 pip3 cmake ninja; do if command -v "$cmd" &>/dev/null; then info "$cmd: $(command -v $cmd)" else die "$cmd not found. Please install it and re-run." fi done PYTHON_VERSION=$(python3 -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")') python3 -c 'import sys; sys.exit(0 if sys.version_info >= (3,8) else 1)' \ || die "Python >= 3.8 required (found $PYTHON_VERSION)" info "Python $PYTHON_VERSION: OK" # ── ESP-IDF ──────────────────────────────────────────────────────────────────── heading "ESP-IDF ($IDF_VERSION)" if [[ -n "${IDF_PATH:-}" && -f "$IDF_PATH/export.sh" ]]; then INSTALLED_TAG=$(git -C "$IDF_PATH" describe --tags 2>/dev/null || echo "unknown") info "Found existing ESP-IDF at \$IDF_PATH=$IDF_PATH (tag: $INSTALLED_TAG)" warn "Skipping IDF install. To use a fresh install, unset \$IDF_PATH." else IDF_PATH="${IDF_DEFAULT}" info "Installing ESP-IDF $IDF_VERSION to $IDF_PATH" mkdir -p "$(dirname "$IDF_PATH")" if [[ -d "$IDF_PATH/.git" ]]; then git -C "$IDF_PATH" fetch --tags git -C "$IDF_PATH" checkout "$IDF_VERSION" else git clone --depth 1 --branch "$IDF_VERSION" \ https://github.com/espressif/esp-idf.git "$IDF_PATH" fi git -C "$IDF_PATH" submodule update --init --recursive info "Running ESP-IDF install script" "$IDF_PATH/install.sh" esp32 info "ESP-IDF installed." fi # ── ESP-ADF ──────────────────────────────────────────────────────────────────── heading "ESP-ADF ($ADF_VERSION)" if [[ -n "${ADF_PATH:-}" && -d "$ADF_PATH" ]]; then INSTALLED_TAG=$(git -C "$ADF_PATH" describe --tags 2>/dev/null || echo "unknown") info "Found existing ESP-ADF at \$ADF_PATH=$ADF_PATH (tag: $INSTALLED_TAG)" warn "Skipping ADF install. To use a fresh install, unset \$ADF_PATH." else ADF_PATH="${ADF_DEFAULT}" info "Installing ESP-ADF $ADF_VERSION to $ADF_PATH" mkdir -p "$(dirname "$ADF_PATH")" if [[ -d "$ADF_PATH/.git" ]]; then git -C "$ADF_PATH" fetch --tags git -C "$ADF_PATH" checkout "$ADF_VERSION" else git clone --depth 1 --branch "$ADF_VERSION" \ https://github.com/espressif/esp-adf.git "$ADF_PATH" fi git -C "$ADF_PATH" submodule update --init --recursive info "ESP-ADF installed." fi # ── env file ─────────────────────────────────────────────────────────────────── heading "Writing .env" ENV_FILE="$(dirname "$0")/.env" cat > "$ENV_FILE" <