95 lines
2.4 KiB
Bash
95 lines
2.4 KiB
Bash
|
|
#!/usr/bin/env bash
|
||
|
|
set -euo pipefail
|
||
|
|
|
||
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
|
|
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||
|
|
|
||
|
|
SKETCH_PATH="${MEMLNAUT_FIRMWARE_SKETCH:-$REPO_ROOT/MEMLNaut-NISPS.ino}"
|
||
|
|
SKETCH_NAME="$(basename "$SKETCH_PATH")"
|
||
|
|
BUILD_DIR="${MEMLNAUT_FIRMWARE_BUILD_DIR:-/tmp/memlnaut-firmware-build}"
|
||
|
|
UF2_PATH_DEFAULT="${MEMLNAUT_FIRMWARE_UF2:-$BUILD_DIR/${SKETCH_NAME}.uf2}"
|
||
|
|
|
||
|
|
FQBN="${MEMLNAUT_FIRMWARE_FQBN:-rp2040:rp2040:solderparty_rp2350_stamp_xl:opt=Optimize3}"
|
||
|
|
CXX20_BUILD_PROPERTY="${MEMLNAUT_FIRMWARE_CXX20_PROPERTY:-compiler.cpp.extra_flags=-std=gnu++20}"
|
||
|
|
|
||
|
|
ensure_arduino_cli() {
|
||
|
|
if ! command -v arduino-cli >/dev/null 2>&1; then
|
||
|
|
echo "error: arduino-cli is not installed or not on PATH" >&2
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
ensure_git() {
|
||
|
|
if ! command -v git >/dev/null 2>&1; then
|
||
|
|
echo "error: git is not installed or not on PATH" >&2
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
ensure_submodules_ready() {
|
||
|
|
ensure_git
|
||
|
|
|
||
|
|
local status
|
||
|
|
status="$(git -C "$REPO_ROOT" submodule status --recursive)"
|
||
|
|
if grep -qE '^[+-]' <<<"$status"; then
|
||
|
|
echo "error: submodules are not initialized or not at the recorded revision" >&2
|
||
|
|
echo "run: git submodule update --init --recursive" >&2
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
resolve_path() {
|
||
|
|
local path="$1"
|
||
|
|
|
||
|
|
if [[ "$path" = /* ]]; then
|
||
|
|
printf '%s\n' "$path"
|
||
|
|
else
|
||
|
|
printf '%s\n' "$(pwd)/$path"
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
find_boot_mount() {
|
||
|
|
local candidates=(
|
||
|
|
"/run/media/${USER}/RP2350"
|
||
|
|
"/run/media/${USER}/RPI-RP2"
|
||
|
|
"/media/${USER}/RP2350"
|
||
|
|
"/media/${USER}/RPI-RP2"
|
||
|
|
"/mnt/RP2350"
|
||
|
|
"/mnt/RPI-RP2"
|
||
|
|
)
|
||
|
|
local candidate
|
||
|
|
|
||
|
|
for candidate in "${candidates[@]}"; do
|
||
|
|
if [[ -d "$candidate" ]]; then
|
||
|
|
printf '%s\n' "$candidate"
|
||
|
|
return 0
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
|
||
|
|
local base
|
||
|
|
for base in "/run/media/${USER}" "/media/${USER}" "/mnt"; do
|
||
|
|
[[ -d "$base" ]] || continue
|
||
|
|
candidate="$(find "$base" -maxdepth 2 -type f -name INFO_UF2.TXT -printf '%h\n' 2>/dev/null | head -n 1 || true)"
|
||
|
|
if [[ -n "$candidate" ]]; then
|
||
|
|
printf '%s\n' "$candidate"
|
||
|
|
return 0
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
|
||
|
|
return 1
|
||
|
|
}
|
||
|
|
|
||
|
|
assert_boot_mount() {
|
||
|
|
local mountpoint="$1"
|
||
|
|
|
||
|
|
if [[ ! -d "$mountpoint" ]]; then
|
||
|
|
echo "error: bootloader mount does not exist: $mountpoint" >&2
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
if [[ ! -f "$mountpoint/INFO_UF2.TXT" && ! -f "$mountpoint/INDEX.HTM" ]]; then
|
||
|
|
echo "error: $mountpoint does not look like an RP2040/RP2350 UF2 boot volume" >&2
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
}
|