#!/usr/bin/env bash # build-all.sh — Kompiliert alle Targets des photo-converter Projekts # # Verwendung: # ./scripts/build-all.sh [--release|--debug] [--clean] [--no-gui] [--no-tests] # # Optionen: # --release Release-Build (Standard) # --debug Debug-Build # --clean Build-Verzeichnis vor dem Kompilieren löschen # --no-gui GUI-Target überspringen # --no-tests Tests überspringen set -euo pipefail # ── Farben ──────────────────────────────────────────────────────────────────── RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color log_info() { echo -e "${BLUE}[build]${NC} $*"; } log_ok() { echo -e "${GREEN}[ok]${NC} $*"; } log_warn() { echo -e "${YELLOW}[warn]${NC} $*"; } log_error() { echo -e "${RED}[error]${NC} $*"; } # ── Standardwerte ───────────────────────────────────────────────────────────── BUILD_TYPE="Release" BUILD_DIR="build" BUILD_GUI=ON BUILD_TESTS=ON CLEAN=0 JOBS=$(nproc 2>/dev/null || sysctl -n hw.logicalcpu 2>/dev/null || echo 4) # ── Argumente parsen ────────────────────────────────────────────────────────── for arg in "$@"; do case "$arg" in --release) BUILD_TYPE="Release" ;; --debug) BUILD_TYPE="Debug"; BUILD_DIR="build-debug" ;; --clean) CLEAN=1 ;; --no-gui) BUILD_GUI=OFF ;; --no-tests) BUILD_TESTS=OFF ;; --help|-h) sed -n '2,12p' "$0" | sed 's/^# \?//' exit 0 ;; *) log_error "Unbekannte Option: $arg" exit 1 ;; esac done # ── Projektverzeichnis ermitteln ─────────────────────────────────────────────── SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_DIR="$(dirname "$SCRIPT_DIR")" BUILD_PATH="$PROJECT_DIR/$BUILD_DIR" cd "$PROJECT_DIR" echo "" log_info "photo-converter Build" log_info " Typ: $BUILD_TYPE" log_info " Pfad: $BUILD_PATH" log_info " GUI: $BUILD_GUI" log_info " Tests: $BUILD_TESTS" log_info " Jobs: $JOBS" echo "" # ── Sauber bauen ────────────────────────────────────────────────────────────── if [[ $CLEAN -eq 1 && -d "$BUILD_PATH" ]]; then log_info "Lösche $BUILD_PATH ..." rm -rf "$BUILD_PATH" fi # ── Abhängigkeiten prüfen ───────────────────────────────────────────────────── MISSING=() for dep in cmake ninja pkg-config; do command -v "$dep" &>/dev/null || MISSING+=("$dep") done if [[ ${#MISSING[@]} -gt 0 ]]; then log_error "Fehlende Tools: ${MISSING[*]}" log_error "Installieren mit: sudo apt install cmake ninja-build pkg-config" exit 1 fi # Qt nur prüfen wenn GUI gewünscht if [[ "$BUILD_GUI" == "ON" ]]; then if ! pkg-config --exists Qt6Widgets 2>/dev/null && ! command -v qmake6 &>/dev/null; then log_warn "Qt6 nicht gefunden — baue ohne GUI (--no-gui um Warnung zu unterdrücken)" BUILD_GUI=OFF fi fi # ── CMake konfigurieren ─────────────────────────────────────────────────────── log_info "Konfiguriere CMake ..." cmake -B "$BUILD_PATH" \ -G Ninja \ -DCMAKE_BUILD_TYPE="$BUILD_TYPE" \ -DBUILD_GUI="$BUILD_GUI" \ -DBUILD_TESTS="$BUILD_TESTS" \ 2>&1 | sed "s/^/ /" log_ok "CMake konfiguriert" # ── Kompilieren ─────────────────────────────────────────────────────────────── log_info "Kompiliere ($JOBS parallele Jobs) ..." cmake --build "$BUILD_PATH" --parallel "$JOBS" 2>&1 | sed "s/^/ /" log_ok "Build erfolgreich" # ── Ergebnisse auflisten ────────────────────────────────────────────────────── echo "" log_info "Erzeugte Binaries:" find "$BUILD_PATH" -maxdepth 3 -type f \( -name "photo-converter" -o -name "test_*" \) \ | sort \ | while read -r f; do size=$(du -sh "$f" 2>/dev/null | cut -f1) echo -e " ${GREEN}✓${NC} $f (${size})" done # ── Tests ausführen ─────────────────────────────────────────────────────────── if [[ "$BUILD_TESTS" == "ON" ]]; then echo "" log_info "Führe Tests aus ..." if ctest --test-dir "$BUILD_PATH" --output-on-failure -j"$JOBS" 2>&1 | sed "s/^/ /"; then log_ok "Alle Tests bestanden" else log_warn "Einige Tests fehlgeschlagen (Exit-Code wird ignoriert)" fi fi echo "" log_ok "Fertig. Starten mit: $BUILD_PATH/photo-converter --batch --config config.ini"