#!/usr/bin/env bash # build.sh — build libmemba.so and memba-cli set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" BUILD_DIR="${SCRIPT_DIR}/build" # ── Submodule ──────────────────────────────────────────────────── if [[ ! -f "${SCRIPT_DIR}/llama.cpp/CMakeLists.txt" ]]; then echo "==> Initialising llama.cpp submodule…" git -C "${SCRIPT_DIR}" submodule update --init --recursive fi # ── GPU detection ───────────────────────────────────────────────── EXTRA_ARGS=() if command -v nvcc &>/dev/null; then echo "==> CUDA found ($(nvcc --version | grep release | awk '{print $6}')) — enabling GGML_CUDA" EXTRA_ARGS+=("-DGGML_CUDA=ON") elif [[ "$(uname)" == "Darwin" ]]; then echo "==> macOS — enabling Metal" EXTRA_ARGS+=("-DGGML_METAL=ON") else echo "==> No GPU backend detected — CPU-only build" fi # Relay any extra cmake args from the command line EXTRA_ARGS+=("$@") # ── Configure & build ───────────────────────────────────────────── mkdir -p "${BUILD_DIR}" cmake -S "${SCRIPT_DIR}" -B "${BUILD_DIR}" \ -DCMAKE_BUILD_TYPE=Release \ "${EXTRA_ARGS[@]}" cmake --build "${BUILD_DIR}" --config Release -j "$(nproc 2>/dev/null || sysctl -n hw.ncpu)" # ── Report ─────────────────────────────────────────────────────── echo "" echo "==> Build complete." echo " libmemba : ${BUILD_DIR}/libmemba.so" echo " memba-cli: ${BUILD_DIR}/memba-cli" echo "" echo "Python install (editable, uses libmemba.so from build/):" echo " pip install -e ."