#!/bin/bash # ============================================================================ # PointCab Renamer - Windows Build unter Linux (Docker-Methode) # Version: 4.1.2 # ============================================================================ # # Dieses Skript erstellt eine Windows .exe unter Linux mittels Docker. # Es verwendet das cdrx/pyinstaller-windows Image für zuverlässige Builds. # # VORAUSSETZUNGEN: # - Docker muss installiert sein (wird bei Bedarf mit sudo gestartet) # - Internet-Verbindung für den ersten Docker-Image-Download # # VERWENDUNG: # ./build_windows_on_linux.sh # # TROUBLESHOOTING: # Falls Docker nicht startet, prüfen Sie: # - sudo systemctl start docker # - Benutzer zur docker-Gruppe hinzufügen: sudo usermod -aG docker $USER # - In Container-Umgebungen (z.B. Docker-in-Docker): --privileged Flag nötig # # ============================================================================ set -e # Bei Fehlern abbrechen # Farben für Ausgabe RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Banner echo -e "${BLUE}" echo "============================================================================" echo " PointCab Renamer - Windows Cross-Compilation unter Linux" echo " Version 4.1.2" echo "============================================================================" echo -e "${NC}" # Hilfsfunktion: Docker-Befehl mit oder ohne sudo docker_cmd() { if docker "$@" 2>/dev/null; then return 0 elif sudo docker "$@" 2>/dev/null; then USE_SUDO=1 return 0 else return 1 fi } run_docker() { if [ "$USE_SUDO" = "1" ]; then sudo docker "$@" else docker "$@" fi } # [1/7] Prüfe ob Docker installiert ist echo -e "${YELLOW}[1/7] Prüfe Docker-Installation...${NC}" if ! command -v docker &> /dev/null; then echo -e "${RED}FEHLER: Docker ist nicht installiert!${NC}" echo "" echo "Installiere Docker mit:" echo " Ubuntu/Debian:" echo " sudo apt update" echo " sudo apt install docker.io" echo " sudo systemctl start docker" echo " sudo systemctl enable docker" echo " sudo usermod -aG docker \$USER" echo " # Danach neu einloggen oder: newgrp docker" echo "" echo " Fedora/RHEL:" echo " sudo dnf install docker" echo " sudo systemctl start docker" echo "" echo "Alternativ: Verwende ./build_windows_wine.sh (Wine-basiert)" exit 1 fi echo -e "${GREEN}✓ Docker ist installiert${NC}" # [2/7] Prüfe ob Docker-Daemon läuft, versuche Start mit sudo falls nötig echo -e "${YELLOW}[2/7] Prüfe Docker-Daemon...${NC}" USE_SUDO=0 if docker info &> /dev/null; then echo -e "${GREEN}✓ Docker-Daemon läuft (ohne sudo)${NC}" elif sudo docker info &> /dev/null; then USE_SUDO=1 echo -e "${GREEN}✓ Docker-Daemon läuft (mit sudo)${NC}" else # Versuche Docker zu starten echo -e "${YELLOW}Docker-Daemon läuft nicht. Versuche zu starten...${NC}" # Versuche systemd if command -v systemctl &> /dev/null; then sudo systemctl start docker 2>/dev/null && sleep 2 fi # Prüfe erneut if docker info &> /dev/null; then echo -e "${GREEN}✓ Docker-Daemon erfolgreich gestartet${NC}" elif sudo docker info &> /dev/null; then USE_SUDO=1 echo -e "${GREEN}✓ Docker-Daemon erfolgreich gestartet (mit sudo)${NC}" else echo -e "${RED}FEHLER: Docker-Daemon konnte nicht gestartet werden!${NC}" echo "" echo "Mögliche Ursachen und Lösungen:" echo "" echo "1. Docker-Service nicht gestartet:" echo " sudo systemctl start docker" echo "" echo "2. Berechtigungsproblem:" echo " sudo usermod -aG docker \$USER" echo " # Dann neu einloggen" echo "" echo "3. In Container-Umgebung (Docker-in-Docker):" echo " Docker kann nicht in unprivilegierten Containern laufen." echo " Nutze stattdessen: ./build_windows_wine.sh" echo " Oder: Baue auf einem System mit nativem Docker." echo "" echo "4. WSL2 unter Windows:" echo " Starte Docker Desktop und aktiviere WSL2-Integration." echo "" echo "Alternative Build-Methoden:" echo " - ./build_windows_wine.sh (Wine-basiert)" echo " - GitHub Actions (siehe .github/workflows/)" echo " - Natives Windows: build_windows.bat" exit 1 fi fi # Arbeitsverzeichnis SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$SCRIPT_DIR" # [3/7] Prüfe ob notwendige Dateien existieren echo -e "${YELLOW}[3/7] Prüfe Projektdateien...${NC}" if [ ! -f "pointcab_renamer.py" ]; then echo -e "${RED}FEHLER: pointcab_renamer.py nicht gefunden!${NC}" echo "Stelle sicher, dass du dich im richtigen Verzeichnis befindest." exit 1 fi if [ ! -f "cluster_cleanup.txt" ]; then echo -e "${RED}FEHLER: cluster_cleanup.txt nicht gefunden!${NC}" exit 1 fi echo -e "${GREEN}✓ Alle Projektdateien vorhanden${NC}" # [4/7] Aufräumen echo -e "${YELLOW}[4/7] Räume alte Build-Artefakte auf...${NC}" rm -rf build/ dist/ *.spec 2>/dev/null || true mkdir -p dist echo -e "${GREEN}✓ Build-Verzeichnisse bereinigt${NC}" # Docker Image DOCKER_IMAGE="cdrx/pyinstaller-windows:python3" # [5/7] Prüfe/Lade Docker Image echo -e "${YELLOW}[5/7] Prüfe Docker Image...${NC}" echo " Image: $DOCKER_IMAGE" echo " (Beim ersten Mal wird ~1.5 GB heruntergeladen)" if ! run_docker image inspect "$DOCKER_IMAGE" &> /dev/null; then echo "" echo "Lade Docker Image herunter..." run_docker pull "$DOCKER_IMAGE" fi echo -e "${GREEN}✓ Docker Image bereit${NC}" # [6/7] Build durchführen echo -e "${YELLOW}[6/7] Erstelle Windows .exe mit PyInstaller...${NC}" echo " Dies kann 2-5 Minuten dauern..." echo "" # Erstelle temporäres Build-Skript für Docker-Container BUILD_SCRIPT=$(mktemp) cat > "$BUILD_SCRIPT" << 'DOCKERSCRIPT' #!/bin/bash set -e cd /src echo "=== Docker Container gestartet ===" echo "Python-Version: $(python --version)" echo "PyInstaller-Version: $(pip show pyinstaller | grep Version)" echo "" # Installiere requirements falls vorhanden if [ -f "requirements.txt" ]; then echo "Installiere requirements..." pip install -r requirements.txt --quiet fi echo "Starte PyInstaller Build..." # PyInstaller Build pyinstaller --onefile \ --windowed \ --name "PointCab_Renamer" \ --add-data "cluster_cleanup.txt;." \ --add-data "BENUTZERHANDBUCH.md;." \ --icon="NONE" \ --clean \ pointcab_renamer.py echo "" echo "=== Build im Container abgeschlossen ===" DOCKERSCRIPT chmod +x "$BUILD_SCRIPT" # Docker Container ausführen if [ "$USE_SUDO" = "1" ]; then sudo docker run --rm \ -v "$SCRIPT_DIR":/src \ -v "$BUILD_SCRIPT":/docker_build.sh:ro \ "$DOCKER_IMAGE" \ bash /docker_build.sh else docker run --rm \ -v "$SCRIPT_DIR":/src \ -v "$BUILD_SCRIPT":/docker_build.sh:ro \ "$DOCKER_IMAGE" \ bash /docker_build.sh fi # Aufräumen rm -f "$BUILD_SCRIPT" # [7/7] Prüfe Ergebnis echo "" echo -e "${YELLOW}[7/7] Verifiziere Build-Ergebnis...${NC}" if [ -f "dist/PointCab_Renamer.exe" ]; then echo -e "${GREEN}✓ Windows .exe erfolgreich erstellt!${NC}" # Kopiere zusätzliche Dateien cp cluster_cleanup.txt dist/ [ -f "BENUTZERHANDBUCH.md" ] && cp BENUTZERHANDBUCH.md dist/ [ -f "BENUTZERHANDBUCH.pdf" ] && cp BENUTZERHANDBUCH.pdf dist/ [ -f "README.md" ] && cp README.md dist/ [ -f "LICENSE.txt" ] && cp LICENSE.txt dist/ # Zeige Ergebnis echo "" echo -e "${BLUE}============================================================================${NC}" echo -e "${GREEN}BUILD ERFOLGREICH!${NC}" echo -e "${BLUE}============================================================================${NC}" echo "" echo "Erstellte Dateien in dist/:" ls -lh dist/ echo "" EXE_SIZE=$(du -h "dist/PointCab_Renamer.exe" | cut -f1) echo "Executable-Größe: $EXE_SIZE" echo "" echo "Pfad: $SCRIPT_DIR/dist/" echo "" echo -e "${YELLOW}WICHTIG:${NC}" echo " 1. Teste die .exe auf einem echten Windows-System!" echo " 2. Stelle sicher, dass cluster_cleanup.txt im gleichen" echo " Ordner wie die .exe liegt." echo "" else echo -e "${RED}FEHLER: Build fehlgeschlagen!${NC}" echo "" echo "Die Datei dist/PointCab_Renamer.exe wurde nicht erstellt." echo "" echo "Prüfe die Fehlermeldungen oben und versuche:" echo " 1. ./build_windows_wine.sh (Wine-Alternative)" echo " 2. Build auf nativem Windows mit build_windows.bat" echo "" exit 1 fi