pointcab_renamer/release/PointCab_Renamer_v4.2.1/build_windows_on_linux.sh

279 lines
8.6 KiB
Bash
Executable File

#!/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