linux.sipsoftphone/build_appimage.sh
data 48ddb4b4af Initiales Release: SIP Softphone für FreePBX/Asterisk
PySide6/PJSUA2-basiertes Desktop-Softphone mit:
- SIP-Telefonie (Anrufe, DTMF, Halten, Transfer, Konferenz)
- CardDAV-Kontaktsync mit Write-Back (Multi-Account)
- Kontaktverwaltung mit Suche und Bearbeiten-Dialog
- Anrufliste mit Namensauflösung
- Favoriten-Panel (manuell + häufig angerufen)
- BLF-Panel (SIP Presence Monitoring)
- Responsives Layout (kompakt/erweitert)
- Click-to-Call (tel:/sip: URI via D-Bus)
- KDE-Integration (Tray, Benachrichtigungen)
- PipeWire/PulseAudio Audio-Routing
- AppImage Build-Support (PyInstaller + appimagetool)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 13:18:54 +01:00

142 lines
4.3 KiB
Bash

#!/bin/bash
# ============================================================
# SIP Softphone - AppImage Build-Skript
# Erstellt ein komplett unabhängiges AppImage
# ============================================================
set -e
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
BUILD_DIR="/tmp/sipwebapp_build"
VENV_DIR="/tmp/sipwebapp_build_venv"
APPDIR="$BUILD_DIR/SipWebApp.AppDir"
PJSUA2_DIR="/tmp/sipwebapp_run"
APPIMAGETOOL="/tmp/appimagetool"
OUTPUT_DIR="$SCRIPT_DIR/dist"
echo "=== SIP Softphone AppImage Builder ==="
echo "Quellverzeichnis: $SCRIPT_DIR"
echo "Build-Verzeichnis: $BUILD_DIR"
echo ""
# === 1. Voraussetzungen prüfen ===
echo "[1/6] Voraussetzungen prüfen..."
if [ ! -f "$PJSUA2_DIR/_pjsua2."*".so" ]; then
echo "FEHLER: pjsua2 Bindings nicht gefunden in $PJSUA2_DIR"
echo "Bitte zuerst die App normal starten, damit die Bindings kopiert werden."
exit 1
fi
if [ ! -f "$APPIMAGETOOL" ]; then
echo "appimagetool herunterladen..."
curl -L -o "$APPIMAGETOOL" \
https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage
chmod +x "$APPIMAGETOOL"
fi
# === 2. Build-venv erstellen ===
echo "[2/6] Python Build-Umgebung..."
if [ ! -d "$VENV_DIR" ]; then
python3 -m venv "$VENV_DIR"
"$VENV_DIR/bin/pip" install -q pyinstaller PySide6 vobject requests
fi
# pjsua2 + dbus ins venv kopieren
SITE_PKG=$("$VENV_DIR/bin/python3" -c "import site; print(site.getsitepackages()[0])")
SYS_SITE="/usr/lib/python3.14/site-packages"
cp "$PJSUA2_DIR"/pjsua2.py "$SITE_PKG/"
cp "$PJSUA2_DIR"/_pjsua2.*.so "$SITE_PKG/"
if [ -d "$SYS_SITE/dbus" ]; then
cp -r "$SYS_SITE/dbus" "$SITE_PKG/" 2>/dev/null || true
cp "$SYS_SITE"/_dbus_bindings*.so "$SITE_PKG/" 2>/dev/null || true
cp "$SYS_SITE"/_dbus_glib_bindings*.so "$SITE_PKG/" 2>/dev/null || true
fi
echo " Python-Deps OK"
# === 3. PyInstaller ausführen ===
echo "[3/6] PyInstaller bündelt Anwendung..."
rm -rf "$BUILD_DIR/pyinstaller_build" "$BUILD_DIR/pyinstaller_dist"
cd "$SCRIPT_DIR"
"$VENV_DIR/bin/pyinstaller" \
--distpath "$BUILD_DIR/pyinstaller_dist" \
--workpath "$BUILD_DIR/pyinstaller_build" \
--noconfirm \
--clean \
sipwebapp.spec
echo " PyInstaller fertig"
# === 4. AppDir erstellen ===
echo "[4/6] AppDir aufbauen..."
rm -rf "$APPDIR"
mkdir -p "$APPDIR/usr/bin"
mkdir -p "$APPDIR/usr/lib"
mkdir -p "$APPDIR/usr/share/applications"
mkdir -p "$APPDIR/usr/share/icons/hicolor/scalable/apps"
# PyInstaller-Output kopieren
cp -r "$BUILD_DIR/pyinstaller_dist/sipwebapp/"* "$APPDIR/usr/bin/"
# .desktop Datei (AppImage-Root + share)
cp "$SCRIPT_DIR/resources/sipwebapp.desktop" "$APPDIR/"
cp "$SCRIPT_DIR/resources/sipwebapp.desktop" "$APPDIR/usr/share/applications/"
# Icon (SVG → AppImage-Root und share)
cp "$SCRIPT_DIR/resources/icons/phone.svg" "$APPDIR/sipwebapp.svg"
cp "$SCRIPT_DIR/resources/icons/phone.svg" \
"$APPDIR/usr/share/icons/hicolor/scalable/apps/sipwebapp.svg"
# === 5. AppRun erstellen ===
echo "[5/6] AppRun erstellen..."
cat > "$APPDIR/AppRun" << 'APPRUN_EOF'
#!/bin/bash
# AppRun für SIP Softphone
# Setzt die nötigen Umgebungsvariablen und startet die App
SELF="$(readlink -f "$0")"
HERE="${SELF%/*}"
APPBIN="$HERE/usr/bin"
# Bibliotheken im AppImage finden
export LD_LIBRARY_PATH="$APPBIN:$HERE/usr/lib:${LD_LIBRARY_PATH}"
# Qt-Plugins im AppImage finden
export QT_PLUGIN_PATH="$APPBIN/PySide6/Qt/plugins:${QT_PLUGIN_PATH}"
export QML2_IMPORT_PATH="$APPBIN/PySide6/Qt/qml:${QML2_IMPORT_PATH}"
# XDG-Integration
export XDG_DATA_DIRS="$HERE/usr/share:${XDG_DATA_DIRS:-/usr/local/share:/usr/share}"
# PipeWire/PulseAudio erlauben (Audio braucht Host-Zugriff)
# Keine Sandbox, weil SIP-Audio direkt über ALSA/PipeWire läuft
exec "$APPBIN/sipwebapp" "$@"
APPRUN_EOF
chmod +x "$APPDIR/AppRun"
echo " AppDir komplett"
# === 6. AppImage erstellen ===
echo "[6/6] AppImage packen..."
mkdir -p "$OUTPUT_DIR"
ARCH=x86_64 "$APPIMAGETOOL" "$APPDIR" \
"$OUTPUT_DIR/SipSoftphone-x86_64.AppImage" 2>&1 | tail -5
chmod +x "$OUTPUT_DIR/SipSoftphone-x86_64.AppImage"
echo ""
echo "=== FERTIG ==="
SIZE=$(du -h "$OUTPUT_DIR/SipSoftphone-x86_64.AppImage" | cut -f1)
echo "AppImage: $OUTPUT_DIR/SipSoftphone-x86_64.AppImage ($SIZE)"
echo ""
echo "Starten mit: $OUTPUT_DIR/SipSoftphone-x86_64.AppImage"
echo "Oder: chmod +x SipSoftphone-x86_64.AppImage && ./SipSoftphone-x86_64.AppImage"