279 lines
8.6 KiB
Bash
Executable File
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
|