#!/usr/bin/env bash
set -u
set -o pipefail

LOG_FILE="${LOG_FILE:-/home/adminek/log.txt}"
SRC_DIR="/home/adminek/llama.cpp"
BUILD_DIR="$SRC_DIR/build"
ROCM_ROOT="/opt/rocm"
GPU_ARCH="gfx906"

exec 3>&1
log(){ echo "[$(date '+%F %T')] $*" | tee -a "$LOG_FILE" >&3; }
run(){ log "RUN: $*"; bash -lc "$*" >>"$LOG_FILE" 2>&1; return $?; }
section(){ log ""; log "=== $* ==="; }

: > "$LOG_FILE"
log "Start budowy llama.cpp z HIP/ROCm"
log "Log: $LOG_FILE"

section "Etap 1: weryfikacja narzędzi"
run "which hipcc hipconfig amdclang++ clang++ cmake git g++ gcc || true"
run "hipcc --version || true"
run "hipconfig --full || true"
run "g++ --version || true"
run "ls -l /usr/lib/gcc/x86_64-linux-gnu/11/libstdc++.so /usr/lib/x86_64-linux-gnu/libstdc++.so.6 2>/dev/null || true"

section "Etap 2: przygotowanie katalogu build"
run "rm -rf '$BUILD_DIR'"
run "mkdir -p '$BUILD_DIR'"

section "Etap 3: konfiguracja CMake"
run "cd '$SRC_DIR' && env \
ROCM_PATH='$ROCM_ROOT' \
HIP_PATH='$ROCM_ROOT' \
HIP_ROOT_DIR='$ROCM_ROOT' \
HIP_CLANG_PATH='$ROCM_ROOT/lib/llvm/bin' \
HIPCXX='$ROCM_ROOT/bin/amdclang++' \
CC='/usr/bin/gcc-11' \
CXX='/usr/bin/g++-11' \
CMAKE_PREFIX_PATH='$ROCM_ROOT' \
LDFLAGS='-L/usr/lib/gcc/x86_64-linux-gnu/11 -L/usr/lib/x86_64-linux-gnu' \
cmake -S '$SRC_DIR' -B '$BUILD_DIR' \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_PREFIX_PATH='$ROCM_ROOT' \
-DCMAKE_C_COMPILER='/usr/bin/gcc-11' \
-DCMAKE_CXX_COMPILER='/usr/bin/g++-11' \
-DCMAKE_HIP_COMPILER='$ROCM_ROOT/bin/amdclang++' \
-DCMAKE_HIP_FLAGS='--gcc-toolchain=/usr -L/usr/lib/gcc/x86_64-linux-gnu/11 -L/usr/lib/x86_64-linux-gnu' \
-DCMAKE_EXE_LINKER_FLAGS='-L/usr/lib/gcc/x86_64-linux-gnu/11 -L/usr/lib/x86_64-linux-gnu' \
-DROCM_ROOT='$ROCM_ROOT' \
-DHIP_ROOT='$ROCM_ROOT' \
-DHIP_PATH='$ROCM_ROOT' \
-DGGML_HIP=ON \
-DGGML_HIP_BLAS=ON \
-DAMDGPU_TARGETS='$GPU_ARCH'"

section "Etap 4: budowanie"
run "cmake --build '$BUILD_DIR' -j\$(nproc)"

section "Etap 5: wynik"
run "find '$BUILD_DIR' -maxdepth 3 -type f | sort | tail -n 100 || true"
run "test -f '$BUILD_DIR/bin/llama-cli' && echo llama-cli OK || true"
run "test -f '$BUILD_DIR/bin/llama-server' && echo llama-server OK || true"
run "test -f '$BUILD_DIR/bin/llama-bench' && echo llama-bench OK || true"

log "Jeśli build zakończył się sukcesem, binarki są w build/bin."
log "W razie problemów załącz log.txt."
log "Koniec."
