#!/usr/bin/env bash # Baut in einem neuen Verzeichnis. Kein Ersetzen von /usr/bin oder laufenden Builds. set -Eeuo pipefail umask 077 revision="" jobs=4 cuda_arch=86 base_dir="$HOME/.local/opt/llama.cpp" usage() { printf 'Aufruf: %s --ref TAG_ODER_COMMIT [--jobs N] [--cuda-arch 86] [--prefix ABSOLUTER_PFAD]\n' "$0" printf 'Explizit --ref master für aktuellen Stand; aufgelöster Commit wird gespeichert.\n' } while (($#)); do case "$1" in --ref) [[ $# -ge 2 ]] || exit 2; revision="$2"; shift ;; --jobs) [[ $# -ge 2 ]] || exit 2; jobs="$2"; shift ;; --cuda-arch) [[ $# -ge 2 ]] || exit 2; cuda_arch="$2"; shift ;; --prefix) [[ $# -ge 2 ]] || exit 2; base_dir="$2"; shift ;; -h|--help) usage; exit 0 ;; *) usage >&2; exit 2 ;; esac shift done [[ "$revision" =~ ^[A-Za-z0-9][A-Za-z0-9._/-]*$ ]] || { usage >&2; exit 2; } [[ "$jobs" =~ ^[1-9][0-9]*$ && "$cuda_arch" =~ ^[1-9][0-9]*$ ]] || exit 2 [[ "$base_dir" == /* && "$base_dir" != / && "$base_dir" != "$HOME" ]] || exit 2 for dependency in git cmake ninja c++ nvidia-smi; do command -v "$dependency" >/dev/null || { printf '%s fehlt. Siehe docs/LLAMA_INSTALL.md.\n' "$dependency" >&2; exit 1; } done nvidia-smi >/dev/null nvcc_path="${CUDACXX:-/opt/cuda/bin/nvcc}" [[ -x "$nvcc_path" ]] || { printf 'CUDA nvcc fehlt: %s\n' "$nvcc_path" >&2; exit 1; } mkdir -p "$base_dir" exec 9>"$base_dir/build.lock" flock -n 9 || { printf 'Ein CUDA-Build läuft bereits.\n' >&2; exit 1; } build_dir="$(mktemp -d "$base_dir/build.XXXXXXXX")" printf 'Neuer Build unter %s (bleibt auch bei Fehler zur Diagnose erhalten).\n' "$build_dir" git init -q "$build_dir/source" git -C "$build_dir/source" remote add origin https://github.com/ggml-org/llama.cpp.git GIT_TERMINAL_PROMPT=0 timeout 300 git -C "$build_dir/source" fetch --depth 1 origin "$revision" git -C "$build_dir/source" checkout --detach FETCH_HEAD commit="$(git -C "$build_dir/source" rev-parse HEAD)" cmake -S "$build_dir/source" -B "$build_dir/build" -G Ninja \ -DCMAKE_BUILD_TYPE=Release -DGGML_CUDA=ON -DBUILD_SHARED_LIBS=OFF \ -DCMAKE_CUDA_COMPILER="$nvcc_path" -DCMAKE_CUDA_ARCHITECTURES="$cuda_arch" cmake --build "$build_dir/build" --parallel "$jobs" --target llama-server llama-cli llama-bench cp -a -- "$build_dir/build/bin" "$build_dir/bin" "$build_dir/bin/llama-server" --version "$build_dir/bin/llama-cli" --version printf 'upstream=https://github.com/ggml-org/llama.cpp.git\nref=%s\ncommit=%s\ncuda_arch=%s\nbuilt=%s\n' \ "$revision" "$commit" "$cuda_arch" "$(date --iso-8601=seconds)" >"$build_dir/BUILD-INFO.txt" if [[ ! -e "$base_dir/current" && ! -L "$base_dir/current" ]]; then ln -s -- "$build_dir" "$base_dir/current" printf 'Erster verwalteter Build ausgewählt; noch kein Dienst gestartet.\n' else printf 'Bestehender current-Build bleibt unverändert.\n' fi printf 'Neue Binary: %s/bin/llama-server\nCommit: %s\n' "$build_dir" "$commit" printf 'Zur bewussten Auswahl LLAMA_SERVER_BIN in llama.env setzen. Keine automatische Aktualisierung.\n'