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>
This commit is contained in:
136
scripts/build-all.sh
Executable file
136
scripts/build-all.sh
Executable file
@@ -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"
|
||||
Reference in New Issue
Block a user