Files
negative-converter/scripts/build-all.sh
Christoph K. 8a462d74f9 feat: add build-all.sh script for all targets
Compiles photo-converter, all test binaries, and runs ctest.
Supports --release/--debug, --clean, --no-gui, --no-tests flags.
Auto-detects available CPU cores and skips Qt if not installed.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-14 09:59:02 +01:00

137 lines
5.4 KiB
Bash
Executable File

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