Funk-lab/ansible/roles/lm_studio/files/install-lmstudio-compat.sh

57 lines
2.1 KiB
Bash

#!/usr/bin/env bash
# Install LM Studio on AlmaLinux 9.
#
# AlmaLinux 9 ships GCC 11 → libstdc++ provides up to GLIBCXX_3.4.29.
# LM Studio bundles watcher.node (compiled with GCC 12) which requires
# _ZNSt18condition_variable4waitERSt11unique_lockISt5mutexE@GLIBCXX_3.4.30.
# That symbol exists in the system libstdc++ under GLIBCXX_3.4.11.
#
# Fix: ELF-patch watcher.node to rewrite the VERNEED entry from
# GLIBCXX_3.4.30 → GLIBCXX_3.4.11 (same symbol, correct version tag).
# Both vna_hash and the version string are updated in-place.
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# Ansible copy task places files in /tmp
if [ -f "/tmp/patch-glibcxx-compat.py" ]; then
PATCHER="/tmp/patch-glibcxx-compat.py"
else
PATCHER="${SCRIPT_DIR}/patch-glibcxx-compat.py"
fi
# --- Fetch installer metadata ---
echo "[lmstudio-install] Fetching installer metadata..."
INSTALL_SH=$(curl -fsSL https://lmstudio.ai/install.sh)
VERSION=$(echo "$INSTALL_SH" | grep '^APP_VERSION=' | cut -d'"' -f2)
ARTIFACT_URL_BASE=$(echo "$INSTALL_SH" | grep '^ARTIFACT_DOWNLOAD_URL=' | cut -d'"' -f2)
ARTIFACT="${VERSION}-linux-x64.full.tar.gz"
URL="https://${ARTIFACT_URL_BASE}/${ARTIFACT}"
TMPDIR=$(mktemp -d)
trap 'rm -rf "$TMPDIR"' EXIT
echo "[lmstudio-install] Downloading ${ARTIFACT}..."
curl -fsSL "$URL" -o "$TMPDIR/bundle.tar.gz"
echo "[lmstudio-install] Extracting bundle..."
tar xf "$TMPDIR/bundle.tar.gz" -C "$TMPDIR"
# Patch watcher.node before bootstrap so the daemon never sees GLIBCXX_3.4.30
echo "[lmstudio-install] Patching watcher.node (GLIBCXX_3.4.30 → GLIBCXX_3.4.11)..."
find "$TMPDIR" -name 'watcher.node' | while read -r node; do
python3 "$PATCHER" "$node"
done
echo "[lmstudio-install] Running bootstrap..."
LMS_BOOTSTRAP_INSTALL_SH=1 "$TMPDIR/llmster" bootstrap
# Also patch the installed copy in ~/.lmstudio after bootstrap
echo "[lmstudio-install] Patching installed watcher.node copies..."
find "${HOME}/.lmstudio" -name 'watcher.node' 2>/dev/null | while read -r node; do
python3 "$PATCHER" "$node"
done
echo "[lmstudio-install] Installation complete."