#!/usr/bin/env bash # Baut die Windows-.exe mit Windows-Python unter Wine (z. B. im Container tobix/pywine:3.12). # Ergebnis: dist/Provisionsmanager95.exe und dist/Provisionsmanager95-.zip set -euo pipefail cd "$(dirname "$0")/.." export WINEDEBUG=-all export LANG=C.UTF-8 LC_ALL=C.UTF-8 # sonst kann Wine keine Umlaute in Dateinamen abbilden export WINEPREFIX="${WINEPREFIX:-/opt/wineprefix}" PY="wine python" # Ein virtueller Bildschirm für den GANZEN Build – vor dem ersten Wine-Aufruf starten! # Wine bindet seinen Hintergrundprozess (wineserver/Desktop) an das DISPLAY des ersten Aufrufs. # Läuft z. B. „pip install“ ohne Bildschirm und die GUI-Tests später mit, scheitert Tk unter # Wine mit „Failed to create the menu window“. wineserver -k 2>/dev/null || true ANZEIGE=":$((90 + RANDOM % 9))" Xvfb "$ANZEIGE" -screen 0 1280x800x24 -nolisten tcp >/dev/null 2>&1 & XVFB_PID=$! trap 'wineserver -k 2>/dev/null || true; kill $XVFB_PID 2>/dev/null || true' EXIT export DISPLAY="$ANZEIGE" sleep 1 $PY --version $PY -m pip install --disable-pip-version-check -q -r requirements-dev.txt echo "== Tests inkl. Oberfläche (Windows-Python unter Wine) ==" # PROVTOOL_GUI_TESTS=1: fehlt der Bildschirm, ist das ein Fehler (nicht „übersprungen“) PROVTOOL_GUI_TESTS=1 $PY -m pytest -q -p no:cacheprovider echo "== Version ==" VERSION=$($PY build/version_info.py | tr -d '\r') echo "Version $VERSION" echo "== PyInstaller ==" $PY -m PyInstaller --noconfirm --clean --distpath dist --workpath build/tmp build/provisionsmanager.spec test -f dist/Provisionsmanager95.exe echo "== Selbsttest der fertigen .exe ==" rm -f selbsttest.txt set +e timeout 300 wine dist/Provisionsmanager95.exe --selbsttest selbsttest.txt CODE=$? set -e cat selbsttest.txt 2>/dev/null || echo "(keine Ergebnisdatei – die .exe ist vermutlich gar nicht gestartet)" if [ "$CODE" -ne 0 ] || ! head -1 selbsttest.txt 2>/dev/null | tr -d '\r' | grep -qx OK; then echo "Selbsttest der .exe FEHLGESCHLAGEN (Exit-Code $CODE)" exit 1 fi echo "Selbsttest bestanden" cp README.md dist/LIESMICH.md 2>/dev/null || true ( cd dist && rm -f Provisionsmanager95-*.zip && \ python3 -c "import zipfile,sys; z=zipfile.ZipFile(sys.argv[1],'w',zipfile.ZIP_DEFLATED); [z.write(f) for f in sys.argv[2:]]; z.close()" \ "Provisionsmanager95-${VERSION}.zip" Provisionsmanager95.exe LIESMICH.md 2>/dev/null \ || $PY -c "import zipfile,sys; z=zipfile.ZipFile(sys.argv[1],'w',zipfile.ZIP_DEFLATED); [z.write(f) for f in sys.argv[2:]]; z.close()" \ "Provisionsmanager95-${VERSION}.zip" Provisionsmanager95.exe LIESMICH.md ) echo "$VERSION" > dist/VERSION ls -la dist