Die Merkmalsliste richtet sich nach der vorgefundenen Binaryen-Fassung

Der Nachoptimierer wasm-opt bekommt aus „deploy/webpaket.sh“ eine einzeln
aufgezählte Liste zugelassener Wasm-Merkmale. Die selbsttätige Prüfung brach
daran ab: „Unknown option '--enable-bulk-memory-opt'“. Das Merkmal führen erst
jüngere Binaryen-Fassungen; die Paketfassung von Ubuntu 26.04 kennt es nicht,
und ein unbekannter Schalter beendet wasm-opt, statt übergangen zu werden.

Die Liste wird deshalb vor dem Aufruf an der Hilfeausgabe des vorgefundenen
wasm-opt gemessen und um das gekürzt, was diese nicht aufführt; die
ausgesonderten Merkmale werden benannt. Die Messung achtet auf Wortgrenzen,
damit „--enable-bulk-memory“ nicht schon durch „--enable-bulk-memory-opt“ als
vorhanden gilt. Unschädlich ist die Kürzung, weil eine Fassung nicht ausgibt,
was sie nicht kennt: Das Modul bleibt gültig und wird allenfalls um einige
Bytes größer. Beim Grundsatz, die Merkmale einzeln statt als „--all-features“
zu erteilen, bleibt es.

Geprüft: „sh -n“ geht auf; auf dem hiesigen Binaryen 132 sondert die Messung
keines der dreizehn Merkmale aus, und gegen eine verkürzte Hilfeausgabe
gehalten sondert sie genau die fehlenden Schalter aus.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GuVaax1nzPPH9Xk73JugUw
Change-Id: Ie7363affeaebe862aace0e1e19e0802c388b513d
diff --git a/FASSUNGEN.txt b/FASSUNGEN.txt
index 5e8327c..5d6a782 100644
--- a/FASSUNGEN.txt
+++ b/FASSUNGEN.txt
@@ -27,7 +27,10 @@
 
 Die Sprachfassung des Bausatzes wird von 21 auf 25 angehoben (Artikel 1); der
 Wasm-Zweig folgt (Artikel 2). Der Enforcer wacht fortan über die vorausgesetzte
-Fassung (Artikel 3). Das Handbuch weist dies aus (Artikel 4).
+Fassung (Artikel 3). Das Handbuch weist dies aus (Artikel 4). Die Liste der dem
+Nachoptimierer zugelassenen Wasm-Merkmale wird fortan an der vorgefundenen
+Binaryen-Fassung gemessen, damit ein unbekannter Schalter den Bau nicht mehr
+abbricht (Artikel 5); auch dies weist das Handbuch aus (Artikel 6).
 
 
 Artikel 1
@@ -67,11 +70,44 @@
 
 
 Artikel 5
+Anpassung der Wasm-Merkmalsliste an die vorgefundene Binaryen-Fassung
+
+„deploy/webpaket.sh“ zählt die dem Nachoptimierer (wasm-opt) zugelassenen
+Wasm-Merkmale einzeln auf. Die selbsttätige Prüfung brach an dieser Stelle ab:
+„Unknown option '--enable-bulk-memory-opt'“. Das Merkmal ist erst in jüngeren
+Binaryen-Fassungen vorhanden; die Paketfassung der Verteilung (Ubuntu 26.04)
+kennt es nicht, und wasm-opt bricht bei einem unbekannten Schalter ab, statt ihn
+zu übergehen.
+
+(1) Vor dem Aufruf wird die Hilfeausgabe des vorgefundenen „wasm-opt“ erhoben.
+    Jedes Merkmal der Liste wird an ihr gemessen; die dort nicht aufgeführten
+    werden ausgesondert. Die Messung achtet auf Wortgrenzen, damit
+    „--enable-bulk-memory“ nicht schon durch „--enable-bulk-memory-opt“ als
+    vorhanden gilt.
+
+(2) Die Aussonderung bleibt unschädlich: Was eine Fassung nicht kennt, gibt sie
+    auch nicht aus; das Modul bleibt gültig und wird allenfalls um einige Bytes
+    größer. Die ausgesonderten Merkmale werden benannt.
+
+(3) Unberührt bleibt der Grundsatz, die Merkmale einzeln aufzuzählen und nicht
+    „--all-features“ zu erteilen (§ 14 Absatz 7 Nummer 4 des Handbuchs).
+
+
+Artikel 6
+Handbuch
+
+§ 14 Absatz 7 Nummer 4 des Handbuchs (README.md) weist die Messung an der
+Hilfeausgabe und ihren Anlass aus.
+
+
+Artikel 7
 Prüfung
 
 Der Bau geht auf einem Oracle GraalVM 25.0.4 auf: „./mvnw verify“ meldet BUILD
 SUCCESS mit 456 von 456 Tests, Spotless beanstandet nichts, und der Enforcer
 lässt die neue Regel durchgehen. Auch das Profil „wasm“ übersetzt („target 25“).
+Die Merkmalsmessung sondert auf dem hiesigen Binaryen 132 nichts aus; gegen eine
+verkürzte Hilfeausgabe geprüft, sondert sie genau die fehlenden Schalter aus.
 
 
 ════════════════════════════════════════════════════════════════════════════════
diff --git a/README.md b/README.md
index 0a1fbea..99e5e00 100644
--- a/README.md
+++ b/README.md
@@ -956,7 +956,11 @@
 4. `wasm-opt -Oz` als Nachlauf. Die zugelassenen Wasm-Merkmale sind in
    `webpaket.sh` einzeln aufgezählt und nicht als `--all-features` erteilt: Sonst
    nutzt Binaryen auch Vorschläge, die noch kein Browser annimmt, und das Modul
-   scheitert erst beim Instanziieren.
+   scheitert erst beim Instanziieren. Die Liste wird vor dem Aufruf an der
+   Hilfeausgabe des vorgefundenen `wasm-opt` gemessen und um das gekürzt, was
+   ältere Fassungen nicht kennen — die Paketfassungen der Verteilungen kennen
+   etwa `--enable-bulk-memory-opt` nicht und brächen sonst mit „Unknown option“
+   ab.
 
 (8) Im Quelltextarchiv fehlt der Beispielkorpus; `.gitattributes` nimmt
 `src/test/resources/sampledata` von `git archive` aus. Es sind Gesetzes- und
diff --git a/deploy/webpaket.sh b/deploy/webpaket.sh
index ba47ea5..ce99633 100755
--- a/deploy/webpaket.sh
+++ b/deploy/webpaket.sh
@@ -57,15 +57,37 @@
 # was Web Image braucht: WasmGC samt Referenztypen, das Ausnahmen-Proposal, endständige
 # Aufrufe. Fehlt wasm-opt, bleibt das Modul, wie es ist — der Bau soll daran nicht
 # scheitern.
-wasm_merkmale="--enable-gc --enable-reference-types --enable-exception-handling
-               --enable-tail-call --enable-bulk-memory --enable-bulk-memory-opt
-               --enable-nontrapping-float-to-int --enable-sign-ext
-               --enable-mutable-globals --enable-multivalue --enable-extended-const
-               --enable-simd --enable-call-indirect-overlong"
+#
+# Jüngere Merkmale kennt nicht jedes Binaryen: „--enable-bulk-memory-opt“ etwa
+# fehlt den Paketfassungen der Linux-Verteilungen, und wasm-opt bricht dann mit
+# „Unknown option“ ab. Darum wird die Liste an der Hilfeausgabe gemessen und um
+# das gekürzt, was die vorgefundene Fassung nicht kennt: Was sie nicht kennt,
+# gibt sie auch nicht aus, das Ergebnis bleibt mithin gültig — nur womöglich um
+# ein paar Bytes größer.
+wasm_merkmale_alle="--enable-gc --enable-reference-types --enable-exception-handling
+                    --enable-tail-call --enable-bulk-memory --enable-bulk-memory-opt
+                    --enable-nontrapping-float-to-int --enable-sign-ext
+                    --enable-mutable-globals --enable-multivalue --enable-extended-const
+                    --enable-simd --enable-call-indirect-overlong"
 
 if [ -f "$ziel/aendggner.js.wasm" ]; then
   vorher="$(groesse "$ziel/aendggner.js.wasm")"
   if command -v wasm-opt >/dev/null 2>&1; then
+    wasm_hilfe="$(wasm-opt --help 2>&1)"
+    wasm_merkmale=""
+    wasm_fehlend=""
+    for merkmal in $wasm_merkmale_alle; do
+      if printf '%s\n' "$wasm_hilfe" \
+           | grep -qE -- "(^|[^A-Za-z0-9-])$merkmal([^A-Za-z0-9-]|\$)"; then
+        wasm_merkmale="$wasm_merkmale $merkmal"
+      else
+        wasm_fehlend="$wasm_fehlend $merkmal"
+      fi
+    done
+    if [ -n "$wasm_fehlend" ]; then
+      echo "webpaket: wasm-opt kennt diese Merkmale nicht und läuft ohne sie:" \
+           "$wasm_fehlend" >&2
+    fi
     # shellcheck disable=SC2086  # die Merkmalsliste soll in Wörter zerfallen
     wasm-opt $wasm_merkmale -Oz \
       -o "$ziel/aendggner.js.wasm.neu" "$ziel/aendggner.js.wasm"