#!/usr/bin/env bash
# =============================================================================
#  brahman :: check-shared-cores.sh — guardián no_std de los núcleos compartidos
# -----------------------------------------------------------------------------
#  Algunos crates de brahman son NÚCLEOS COMPARTIDOS: lógica pura que también
#  compila el kernel bare-metal de renaser (ver docs/renaser-integracion.md).
#  Para seguir siéndolo deben permanecer `no_std` — y eso se rompe en silencio
#  con sólo añadir una dependencia que arrastre `std`.
#
#  Este script es la red de seguridad: compila cada núcleo registrado para
#  `x86_64-unknown-none` (el target del kernel de renaser). Si un núcleo
#  recobró `std`, la compilación falla aquí y no semanas después en renaser.
#
#  Uso:   ./scripts/check-shared-cores.sh
#  Sale 0 si todos los núcleos compilan no_std; 1 si alguno falla.
# =============================================================================
set -euo pipefail

# --- Núcleos compartidos registrados -----------------------------------------
# Al promover un crate a núcleo compartido (hacerlo `no_std` y enlazarlo desde
# renaser), añádelo a esta lista. Es el contrato: lo que está aquí, renaser lo
# puede consumir; mantenerlo no_std es obligatorio.
CORES=(
  mirada-layout   # motor de teselado del compositor (Fase 8 de renaser)
)

TARGET="x86_64-unknown-none"

cd "$(dirname "$0")/.."

echo "guardián no_std — núcleos compartidos brahman ↔ renaser"
echo "target bare-metal: ${TARGET}"
echo

# El target bare-metal debe estar instalado para el toolchain activo.
if ! rustup target list --installed 2>/dev/null | grep -qx "${TARGET}"; then
  echo "instalando el target ${TARGET}…"
  rustup target add "${TARGET}"
fi

fallos=0
for core in "${CORES[@]}"; do
  printf '  %-20s ' "${core}"
  if cargo build -q -p "${core}" --target "${TARGET}" 2>/tmp/check-core-"${core}".log; then
    echo "ok — compila no_std"
  else
    echo "FALLA — recobró std o no compila bare-metal"
    sed 's/^/      /' /tmp/check-core-"${core}".log
    fallos=$((fallos + 1))
  fi
done

echo
if [ "${fallos}" -eq 0 ]; then
  echo "todos los núcleos siguen siendo no_std (${#CORES[@]}/${#CORES[@]})."
  exit 0
else
  echo "${fallos} núcleo(s) rompieron la garantía no_std."
  exit 1
fi
