#!/usr/bin/env bash # Baut Firmwareabzuege OHNE einkompilierte WLAN-Zugangsdaten: die Lampen starten damit # im Onboarding-AP (ninlight-), statt sich in ein fremdes WLAN einzuwaehlen. # # Aufruf: tools/build_nocreds.sh [ziel ...] (ohne Argumente: alle acht Ziele) # # Ergebnis: je Ziel ein Build-Verzeichnis unter $NINLIGHT_NOCREDS_BUILD_REL (Vorgabe # "build-nocreds", relativ zum Repo-Wurzelverzeichnis) mit den ueblichen Artefakten # (ninlight__gz.img, ninlight__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) 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"