From 8a462d74f9f28a0cb50151004d3d862e4062ab18 Mon Sep 17 00:00:00 2001 From: "Christoph K." Date: Sat, 14 Mar 2026 09:59:02 +0100 Subject: [PATCH] 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 --- scripts/build-all.sh | 136 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100755 scripts/build-all.sh diff --git a/scripts/build-all.sh b/scripts/build-all.sh new file mode 100755 index 0000000..37b8ddd --- /dev/null +++ b/scripts/build-all.sh @@ -0,0 +1,136 @@ +#!/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"