Files
ninlight-w600/tools/build_nocreds.sh
T
Robin von Bülow 8294688e37 feat(board): ledshield_rgb — Montana Black RGB-LED-Shield (analoge RGB-Streifen)
Viertes Analog-Profil neben den SM2135EH-Lampen: PWM-Kanaele R=PB13 (ch1),
G=PB16 (ch2), B=PB15 (ch3) bei 800 Hz, PIN-belegt aus der Original-Firmware
(qcl_build_config_lamp.h, HARDWARE_MOBL_LED_SHIELD). Kein CW/WW-Zweig:
ct_min == ct_max ist das Erkennungszeichen fuer 'weiss = RGB-Mischung',
nl_color.c gibt in diesem Fall alle drei Farbkanalgleich.

Neues Bauziel in allen Skripten; test_release zaehlt Dateizahlen jetzt aus
TARGETS statt hart 8/16.
2026-09-25 17:26:46 +02:00

78 lines
3.3 KiB
Bash
Executable File

#!/usr/bin/env bash
# Baut Firmwareabzuege OHNE einkompilierte WLAN-Zugangsdaten: die Lampen starten damit
# im Onboarding-AP (ninlight-<mac4>), statt sich in ein fremdes WLAN einzuwaehlen.
#
# Aufruf: tools/build_nocreds.sh [ziel ...] (ohne Argumente: alle Ziele)
#
# Ergebnis: je Ziel ein Build-Verzeichnis unter $NINLIGHT_NOCREDS_BUILD_REL (Vorgabe
# "build-nocreds", relativ zum Repo-Wurzelverzeichnis) mit den ueblichen Artefakten
# (ninlight_<ziel>_gz.img, ninlight_<ziel>_ota.img, ...). Bewusst NICHT build/: die
# dortigen Abzuege sind die des Entwicklers - mit seinem WLAN - und bleiben unangetastet.
#
# Dieses Skript ist ausdruecklich zum Wiederverwenden da: tools/release.sh baut damit das
# Auslieferungsarchiv, und die Migrationsstation wird damit die Wahl "Lampe startet im
# Onboarding-AP" bedienen. Deshalb steht die Logik hier und nicht in release.sh.
#
# Umgebungsvariablen:
# NINLIGHT_DOCKER Build-Vorspann (Vorgabe tools/docker.sh); Tests stubben ihn
# NINLIGHT_NOCREDS_BUILD_REL Ausgabeverzeichnis relativ zur Repo-Wurzel
set -euo pipefail
ROOT=$(cd "$(dirname "$0")/.." && pwd)
DOCKER=${NINLIGHT_DOCKER:-$ROOT/tools/docker.sh}
BUILD_REL=${NINLIGHT_NOCREDS_BUILD_REL:-build-nocreds}
DEVICES=(evk e27_rgb e14_rgb gu10_rgb e27_cw e14_cw gu10_cw g95_cw ledshield_rgb)
if [ $# -gt 0 ]; then
TARGETS=("$@")
else
TARGETS=("${DEVICES[@]}")
fi
for t in "${TARGETS[@]}"; do
ok=0
for d in "${DEVICES[@]}"; do [ "$t" = "$d" ] && ok=1; done
[ "$ok" -eq 1 ] || { echo "Fehler: unbekanntes Ziel '$t' (bekannt: ${DEVICES[*]})" >&2; exit 1; }
done
# config.local.cmake wird in CMakeLists.txt mit gewoehnlichem set() eingebunden und
# SCHLAEGT damit jedes -D auf der Kommandozeile. Ein Bau ohne Zugangsdaten ist deshalb
# nur moeglich, wenn die Datei fuer die Dauer des Baus beiseite liegt. In ihr stehen die
# echte SSID, das WLAN-Passwort und das API-Token - sie muss auch dann zurueckkommen,
# wenn der Bau abbricht oder jemand Strg-C drueckt. Darum ein trap auf EXIT UND auf
# INT/TERM (EXIT allein laeuft bei einem Signal zwar auch, aber der Exit-Code soll das
# Signal widerspiegeln, statt als Erfolg durchzugehen).
LOCAL="$ROOT/config.local.cmake"
STASH_DIR=""
restore_local() {
[ -n "$STASH_DIR" ] || return 0
if [ -f "$STASH_DIR/config.local.cmake" ]; then
cp -p "$STASH_DIR/config.local.cmake" "$LOCAL" || {
echo "ACHTUNG: config.local.cmake konnte nicht zurueckgelegt werden - Kopie liegt unter $STASH_DIR" >&2
STASH_DIR=""
return 1
}
fi
rm -rf "$STASH_DIR"
STASH_DIR=""
}
if [ -f "$LOCAL" ]; then
STASH_DIR=$(mktemp -d)
cp -p "$LOCAL" "$STASH_DIR/config.local.cmake"
trap 'restore_local' EXIT
trap 'restore_local; trap - INT; kill -INT $$' INT
trap 'restore_local; exit 143' TERM
rm -f "$LOCAL"
echo "config.local.cmake liegt fuer diesen Bau beiseite (keine WLAN-Zugangsdaten im Abzug)"
fi
for t in "${TARGETS[@]}"; do
echo "== $t (ohne Zugangsdaten)"
# Relative Pfade, weil der Bau ueblicherweise im Container laeuft, der das Repo unter
# /work einhaengt - absolute Hostpfade gaebe es dort nicht.
"$DOCKER" cmake -S . -B "$BUILD_REL/$t" -G Ninja \
-DCMAKE_TOOLCHAIN_FILE=cmake/arm-none-eabi.cmake -DNINLIGHT_DEVICE="$t" >/dev/null
"$DOCKER" cmake --build "$BUILD_REL/$t"
done
echo "fertig - Abzuege ohne Zugangsdaten unter $ROOT/$BUILD_REL"