redox-wayland-compositor/run-qemu.sh
Votre Nom 18391c85f7 🎉 Phase 13.1.b — simple_window upstream validé runtime sur Redox
4 bugs identifiés et corrigés grâce au client tiers :
- ESC mangée par le compositor au lieu d'être forwardée (raccourci compo
  déplacé sur Ctrl+Q + tracking ctrl_held)
- Cursor accumulait les deltas PS/2 hors-écran (ajout screen_w/h +
  clamp_cursor + set_screen_size au boot)
- Keycode envoyé scancode+8 au lieu d'evdev brut (bug racine — le +8
  est entre evdev et X11, pas entre PS/2 et evdev)
- Event loop client ne tolérait pas Interrupted/BrokenPipe transitoires
  → FAIL au lieu de PASS sur sortie normale (5e adaptation Redox côté
  client, upstream-compatible)

Plus : tick log compo passé en debug! pour silencer la console série,
run-qemu.sh durci (check /dev/fuse, IMAGE/REDOXFS overridables).

6/6 checkpoints 13.1 verts. Bugs secondaires (curseur stuck en bas-droite,
ion page fault sur broken pipe d'un job background) listés dans le doc
pour follow-up en 13.1.c.

Leyoda 2026 – GPLv3
2026-05-16 10:59:35 +02:00

127 lines
4 KiB
Bash
Executable file

#!/usr/bin/env bash
# Phase 13.1 — bootstrap runtime test : copie compositor + client tiers
# dans l'image Redox, démonte, lance `make qemu`.
#
# Usage :
# ./run-qemu.sh # cycle complet (mount, copy, umount, qemu)
# ./run-qemu.sh --no-qemu # juste mount + copy + umount (pas de boot)
# REDOX_SRC=/autre/chemin ./run-qemu.sh
#
# Pré-requis :
# - Avoir cross-compilé les deux binaires :
# cd crates/redox-wl-compositor && redoxer build --release
# cd crates/redox-wl-real-client-simple-window && redoxer build --release
# - redoxfs accessible dans REDOX_SRC/build/fstools/bin/
# - L'image harddrive.img présente dans REDOX_SRC/build/x86_64/desktop/
# - /dev/fuse disponible sur l'hôte
# - PAS de QEMU déjà ouvert sur la même image (corromprait le disque).
#
# Une fois Redox bootée :
# Ctrl+Alt+F2 → VT 2 (texte, sans Orbital)
# login root / password
# RUST_LOG=info redox-wl-compositor &
# sleep 1
# redox-wl-real-client-simple-window
set -euo pipefail
ROOT="$(cd "$(dirname "$0")" && pwd)"
REDOX_SRC="${REDOX_SRC:-$HOME/Projets/Redox/redox-src}"
IMAGE="${IMAGE:-$REDOX_SRC/build/x86_64/desktop/harddrive.img}"
REDOXFS="${REDOXFS:-$REDOX_SRC/build/fstools/bin/redoxfs}"
MOUNT="${MOUNT:-/tmp/redox-mnt}"
COMPOSITOR_BIN="$ROOT/crates/redox-wl-compositor/target/x86_64-unknown-redox/release/redox-wl-compositor"
CLIENT_BIN="$ROOT/crates/redox-wl-real-client-simple-window/target/x86_64-unknown-redox/release/redox-wl-real-client-simple-window"
NO_QEMU=0
for arg in "$@"; do
case "$arg" in
--no-qemu) NO_QEMU=1 ;;
-h|--help)
awk '/^# / { sub(/^# ?/, ""); print; next } /^[^#]/ { exit }' "$0"
exit 0
;;
*)
echo "ERR : option inconnue : $arg" >&2
exit 1
;;
esac
done
cleanup() {
local exit_code=$?
if mountpoint -q "$MOUNT" 2>/dev/null; then
echo "==> cleanup : umount $MOUNT"
fusermount -u "$MOUNT" 2>/dev/null || true
fi
if [[ -d "$MOUNT" ]] && ! mountpoint -q "$MOUNT" 2>/dev/null; then
rmdir "$MOUNT" 2>/dev/null || true
fi
exit $exit_code
}
trap cleanup EXIT INT TERM
# --- 1. Pré-vérifs ---
missing=0
for f in "$IMAGE" "$REDOXFS" "$COMPOSITOR_BIN" "$CLIENT_BIN"; do
if [[ ! -e "$f" ]]; then
echo "ERR : introuvable : $f" >&2
missing=1
fi
done
if [[ $missing -ne 0 ]]; then
echo >&2
echo "Si un binaire manque, cross-compile via :" >&2
echo " cd crates/<crate> && redoxer build --release" >&2
echo "Si redoxfs/image manquent, ajuste REDOX_SRC=... (actuel : $REDOX_SRC)" >&2
exit 1
fi
if [[ ! -e /dev/fuse ]]; then
echo "ERR : /dev/fuse absent sur l'hôte" >&2
echo "RedoxFS en a besoin pour monter l'image avant le boot QEMU." >&2
echo "Sur Linux, charge le module fuse ou exécute sur un host où FUSE est disponible." >&2
exit 3
fi
# --- 2. Mount ---
mkdir -p "$MOUNT"
echo "==> monter $IMAGE -> $MOUNT"
"$REDOXFS" "$IMAGE" "$MOUNT" &
REDOXFS_PID=$!
# Attendre que le mount soit effectif (redoxfs prend ~100-500 ms à se setup)
for i in {1..50}; do
if mountpoint -q "$MOUNT"; then
break
fi
sleep 0.1
if [[ $i -eq 50 ]]; then
echo "ERR : mount $MOUNT n'a pas abouti après 5s" >&2
kill $REDOXFS_PID 2>/dev/null || true
exit 2
fi
done
echo " monté (pid redoxfs=$REDOXFS_PID)"
# --- 3. Copy ---
echo "==> copier les binaires dans /usr/bin/"
cp -v "$COMPOSITOR_BIN" "$MOUNT/usr/bin/"
cp -v "$CLIENT_BIN" "$MOUNT/usr/bin/"
# --- 4. umount avant make qemu (sinon QEMU et FUSE se battent sur le même fichier) ---
echo "==> démonter $MOUNT"
sync
fusermount -u "$MOUNT"
rmdir "$MOUNT" 2>/dev/null || true
trap - EXIT INT TERM # plus rien à cleaner
if [[ $NO_QEMU -eq 1 ]]; then
echo "==> --no-qemu : on s'arrête là."
exit 0
fi
# --- 5. Boot QEMU ---
echo "==> lancer make qemu (Ctrl+Alt+F2 pour VT2 ; login root / password)"
cd "$REDOX_SRC"
exec make qemu audio=no QEMU_USER_FLAGS="-k fr"