diff --git a/spike/00-bootstrap-termux.sh b/spike/00-bootstrap-termux.sh index efafc99..3a6af05 100755 --- a/spike/00-bootstrap-termux.sh +++ b/spike/00-bootstrap-termux.sh @@ -38,11 +38,33 @@ done # zur Laufzeit; das Ergebnis landet im GPU-Profil. section "GPU-Pakete" GPU_PKGS=(virglrenderer-android vulkan-loader-android vulkan-tools angle-android - mesa-vulkan-icd-wrapper mesa-zink virglrenderer-mesa-zink) + mesa-zink virglrenderer-mesa-zink) for p in "${GPU_PKGS[@]}"; do if try pkg install -y "$p"; then ok "$p"; else warn "$p nicht verfügbar — kein Beinbruch"; fi done +# Der Vulkan-Treiber ist der einzige GPU-Teil, der wirklich zählt: ohne ihn bleibt +# nur Software-Rendering. Die Paketnamen haben sich in Termux mehrfach geändert, +# deshalb werden mehrere Kandidaten probiert, bis einer greift. +section "Vulkan-Treiber (Turnip)" +ICD_KANDIDATEN=(mesa-vulkan-icd-freedreno mesa-vulkan-icd-wrapper + mesa-vulkan-icd-wrapper-android mesa-vulkan-icd-swrast) +ICD_GEFUNDEN="" +for p in "${ICD_KANDIDATEN[@]}"; do + if pkg install -y "$p" >>"$LOG" 2>&1; then + ICD_GEFUNDEN="$p" + ok "$p installiert" + break + fi + hint "$p — nicht verfügbar" +done +if [ -z "$ICD_GEFUNDEN" ]; then + warn "Kein Vulkan-Treiber installierbar." + hint "Ohne ihn läuft der Desktop im Software-Rendering — S1 wird träge," + hint "sagt aber trotzdem etwas über die Machbarkeit aus." + hint "Verfügbare Kandidaten prüfen: pkg search mesa-vulkan" +fi + section "GPU erkennen" PLATFORM="$(getprop ro.board.platform 2>/dev/null)" HARDWARE="$(getprop ro.hardware 2>/dev/null)" @@ -124,16 +146,66 @@ section "Debian-Rootfs" if ! proot-distro list >/dev/null 2>&1; then fail "proot-distro ist installiert, lässt sich aber nicht ausführen" PD="$(command -v proot-distro)" - log " Datei: $PD" - log " Shebang: $(head -1 "$PD" 2>/dev/null)" - hint "Meist fehlt der Interpreter aus der Shebang-Zeile, nicht das Programm." - hint "Reparaturversuch:" - try pkg install -y bash coreutils proot proot-distro + SHEBANG="$(head -1 "$PD" 2>/dev/null)" + INTERPRETER="$(printf '%s' "$SHEBANG" | sed 's|^#!||; s| .*||')" + log " Datei: $PD" + log " Shebang: $SHEBANG" + log " Interpreter: ${INTERPRETER:-(keiner)}" + + if [ -n "$INTERPRETER" ] && [ ! -x "$INTERPRETER" ]; then + fail "Der Interpreter fehlt — nicht proot-distro selbst." + log "" + log " Das ist der klassische Termux-Teilupgrade-Fehler: das Paket wurde gegen" + log " eine Fassung gebaut, installiert ist eine andere. Termux verträgt keine" + log " Teilupgrades — hier hilft nur, alles auf denselben Stand zu bringen." + + # Schritt 1: fehlendes Paket nachziehen. Bei python3.x heißt es schlicht python. + case "$(basename "$INTERPRETER")" in + python3*|python) try pkg install -y python ;; + bash) try pkg install -y bash ;; + *) try pkg install -y "$(basename "$INTERPRETER")" ;; + esac + + # Schritt 2: Vollupgrade. Das ist die eigentliche Reparatur. + if [ ! -x "$INTERPRETER" ]; then + log "" + warn "Reicht nicht — jetzt das Vollupgrade. Das dauert und lädt einiges." + try pkg update -y + try pkg upgrade -y + try pkg install -y proot proot-distro + fi + + # Schritt 3: Notnagel. Nur für Python, und nur weil proot-distro reines + # Python ohne kompilierte Erweiterungen ist — sonst wäre eine Version + # überzustülpen grob fahrlässig. + if [ ! -x "$INTERPRETER" ]; then + case "$(basename "$INTERPRETER")" in + python3.*) + VORHANDEN="$(ls "$PREFIX/bin"/python3.* 2>/dev/null | grep -v config | head -1)" + if [ -n "$VORHANDEN" ]; then + log "" + warn "Notnagel: verweise $(basename "$INTERPRETER") auf $(basename "$VORHANDEN")" + hint "Vertretbar, weil proot-distro reines Python ist." + hint "Sauber wird es erst mit einem vollständigen 'pkg upgrade'." + ln -sf "$VORHANDEN" "$INTERPRETER" && ok "Verweis angelegt" + fi + ;; + esac + fi + else + try pkg install -y bash coreutils proot proot-distro + fi + if ! proot-distro list >/dev/null 2>&1; then fail "Bleibt defekt — ohne proot-distro geht es nicht weiter." + log "" + log " Von Hand versuchen, in dieser Reihenfolge:" + log " pkg update && pkg upgrade -y # Vollupgrade, keine Teilschritte" + log " pkg install -y python proot proot-distro" + log " termux-change-repo # falls der Spiegel unstimmig ist" exit 1 fi - ok "Nach der Neuinstallation läuft proot-distro" + ok "proot-distro läuft wieder" fi if proot-distro list --installed 2>/dev/null | grep -q "^$DISTRO\b" \