#!/bin/bash # run-qt.sh — Build and run the HCIE Qt6 image editor. # # Usage: # ./run-qt.sh — build + run # ./run-qt.sh build — build only # ./run-qt.sh run — run only (skip build) # ./run-qt.sh clean — clean build directory set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" QT_DIR="$SCRIPT_DIR/hcie-qt-app" BUILD_DIR="$QT_DIR/build" # ── Colors ──────────────────────────────────────────────────────────────── RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' CYAN='\033[0;36m' NC='\033[0m' info() { echo -e "${CYAN}[INFO]${NC} $*"; } ok() { echo -e "${GREEN}[OK]${NC} $*"; } warn() { echo -e "${YELLOW}[WARN]${NC} $*"; } err() { echo -e "${RED}[ERROR]${NC} $*"; } # ── Engine static library check ─────────────────────────────────────────── ENGINE_LIB="$SCRIPT_DIR/target/debug/libhcie_engine_api.a" ensure_engine_lib() { if [ ! -f "$ENGINE_LIB" ]; then warn "Engine static library not found at $ENGINE_LIB" info "Building engine with cargo..." cargo build -p hcie-engine-api 2>&1 if [ ! -f "$ENGINE_LIB" ]; then err "Failed to build engine library. Aborting." exit 1 fi ok "Engine library built." fi } # ── Build ───────────────────────────────────────────────────────────────── do_build() { info "Ensuring engine static library exists..." ensure_engine_lib info "Configuring CMake..." mkdir -p "$BUILD_DIR" cmake -S "$QT_DIR" -B "$BUILD_DIR" \ -DCMAKE_BUILD_TYPE=Debug \ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON info "Building hcie-qt..." cmake --build "$BUILD_DIR" -j"$(nproc 2>/dev/null || echo 4)" ok "Build complete: $BUILD_DIR/hcie-qt" } # ── Run ─────────────────────────────────────────────────────────────────── do_run() { BINARY="$BUILD_DIR/hcie-qt" if [ ! -f "$BINARY" ]; then err "Binary not found at $BINARY. Run './run-qt.sh build' first." exit 1 fi # Detect display server if [ -n "$DISPLAY" ] || [ -n "$WAYLAND_DISPLAY" ]; then info "Launching hcie-qt (windowed mode)..." exec "$BINARY" "$@" else info "No display detected. Launching in offscreen mode..." info "Press Ctrl+C to quit." QT_QPA_PLATFORM=offscreen exec "$BINARY" "$@" fi } # ── Clean ───────────────────────────────────────────────────────────────── do_clean() { info "Removing build directory..." rm -rf "$BUILD_DIR" ok "Clean complete." } # ── Main ────────────────────────────────────────────────────────────────── ACTION="${1:-all}" case "$ACTION" in build) do_build ;; run) do_run ;; clean) do_clean ;; all|*) do_build echo "" do_run ;; esac