#!/bin/bash
# 为 Bonsai 2 构建带 PTQ1_0 解码内核 + MTP Hadamard 修复的 llama.cpp（sm_120）
set -e
export PATH=/usr/local/cuda-13.1/bin:/usr/local/bin:/usr/bin:/bin
export LD_LIBRARY_PATH=/usr/local/cuda-13.1/lib64:${LD_LIBRARY_PATH:-}
echo "nvcc: $(command -v nvcc || echo 缺失)"
nvcc --version 2>/dev/null | tail -2

cd ~/src
if [ ! -f prism.tar.gz ]; then echo "❌ 源码包不存在"; exit 1; fi
if ! tar tzf prism.tar.gz >/dev/null 2>&1; then echo "❌ 源码包不完整（仍在下载？）"; exit 1; fi

rm -rf work && mkdir work && tar xzf prism.tar.gz -C work
SRC=$(ls -d work/llama.cpp-*/ | head -1)
echo "=== 源码目录: $SRC ==="
cd "$SRC"

echo "=== 初始化 git 基线 ==="
git init -q
git add -A >/dev/null 2>&1
git -c user.email=b@x -c user.name=b commit -qm "base: prism 9a9394a" >/dev/null

echo "=== 应用补丁 ==="
for p in \
  ~/patches/0001-qwen35-mtp-hadamard-inverse.patch \
  ~/patches/kernel/0001-*.patch \
  ~/patches/kernel/0002-*.patch \
  ~/patches/kernel/0003-*.patch \
  ~/patches/kernel/0004-*.patch \
  ~/patches/kernel/0005-*.patch \
  ~/patches/kernel/0006-*.patch \
  ~/patches/kernel/0007-*.patch ; do
  if git am "$p" >/dev/null 2>&1; then
    echo "  ✅ $(basename $p)"
  else
    echo "  ❌ 失败: $(basename $p)"
    git am --abort >/dev/null 2>&1 || true
    exit 1
  fi
done

echo "=== CMake 配置（CUDA, sm_120）==="
cmake -B build -DGGML_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES=120 \
      -DCMAKE_BUILD_TYPE=Release -DLLAMA_CURL=OFF -DLLAMA_BUILD_TESTS=OFF \
      -DLLAMA_BUILD_EXAMPLES=OFF -DLLAMA_BUILD_SERVER=ON > /tmp/cmake.log 2>&1 \
  || { echo "❌ CMake 失败，尾部日志："; tail -20 /tmp/cmake.log; exit 1; }
echo "  ✅ 配置完成"

echo "=== 编译 llama-server（可能 10 分钟以上）==="
cmake --build build --target llama-server llama-bench -j 8 > /tmp/build.log 2>&1 \
  || { echo "❌ 编译失败，尾部日志："; tail -30 /tmp/build.log; exit 1; }

echo "=== 完成 ==="
ls -la build/bin/llama-server build/bin/llama-bench
build/bin/llama-server --version 2>&1 | head -3
