Felipe97/llama-cpp-compiled
01.2k
1#!/bin/bash2# Check API/ABI compatibility between the previous release tag and current HEAD.3#4# Finds the most recent vX.Y.Z tag, checks it out in a temporary git worktree,5# builds both versions with shared libs enabled, and uses check-apiabi-compat.sh6# to compare the results.7#8# Exit codes:9# 0: compatible, or check was skipped10# 1: backwards-incompatible changes found, or build failed11#12# Options:13# --tag <version>: compare against this tag instead of the latest release14#15# Environment:16# SKIP_APIABI_CHECK: set to 1 or true to skip17# APIABI_COMPARE_TAG: equivalent to --tag (used by CI)18 19set -euo pipefail20 21SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"22REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"23 24usage() {25 echo "Usage: $0 [--tag <version>]" >&226 echo " --tag <version> Compare against this release tag (default: latest)" >&227}28 29COMPARE_TAG="${APIABI_COMPARE_TAG:-}"30while [[ "$#" -gt 0 ]]; do31 case "$1" in32 --tag)33 if [[ -z "${2:-}" ]]; then usage; exit 1; fi34 COMPARE_TAG="$2"35 shift 236 ;;37 --tag=*)38 COMPARE_TAG="${1#*=}"39 shift40 ;;41 -h | --help)42 usage; exit 043 ;;44 *)45 usage; exit 146 ;;47 esac48done49 50if [[ "${SKIP_APIABI_CHECK:-}" == "1" || "${SKIP_APIABI_CHECK:-}" == "true" ]]; then51 echo "SKIP_APIABI_CHECK is set - skipping API/ABI compatibility check"52 exit 053fi54 55if ! command -v abi-compliance-checker >/dev/null 2>&1 || ! command -v abidw >/dev/null 2>&1; then56 echo "Warning: abi-compliance-checker or abigail-tools not installed - skipping API/ABI check"57 exit 058fi59 60discover_libs() {61 local build_dir="$1"62 local libs=()63 for dir in "$build_dir/src" "$build_dir/bin"; do64 [[ -d "$dir" ]] || continue65 for f in "$dir"/lib*.so; do66 [[ -f "$f" ]] && libs+=("$(basename "$f" .so)")67 done68 done69 echo "${libs[@]}"70}71 72if [[ -n "${COMPARE_TAG}" ]]; then73 PREV_TAG="${COMPARE_TAG}"74 if ! git -C "$REPO_ROOT" rev-parse --verify "${PREV_TAG}^{}" >/dev/null 2>&1; then75 echo "Error: tag '${PREV_TAG}' not found in repository." >&276 exit 177 fi78else79 PREV_TAG=$(git -C "$REPO_ROOT" tag --sort=-v:refname | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$' | head -n 1 || true)80 if [[ -z "${PREV_TAG}" ]]; then81 echo "Warning: no previous release tag found - skipping API/ABI check"82 exit 083 fi84fi85OLD_VERSION="${PREV_TAG#v}"86OLD_MAJOR="${OLD_VERSION%%.*}"87OLD_MINOR="${OLD_VERSION#*.}"; OLD_MINOR="${OLD_MINOR%%.*}"88 89NEW_MAJOR=$(grep "set(LLAMA_VERSION_MAJOR" "$REPO_ROOT/CMakeLists.txt" | sed 's/.*MAJOR \([0-9]*\).*/\1/')90NEW_MINOR=$(grep "set(LLAMA_VERSION_MINOR" "$REPO_ROOT/CMakeLists.txt" | sed 's/.*MINOR \([0-9]*\).*/\1/')91 92if [[ "$NEW_MAJOR" -gt "$OLD_MAJOR" ]]; then93 echo "Major version increment ($OLD_MAJOR -> $NEW_MAJOR): API/ABI breaking changes are expected, skipping compatibility check."94 exit 095fi96 97CHECK_FLAGS=()98if [[ "$NEW_MINOR" -eq "$OLD_MINOR" ]]; then99 echo "Patch version bump detected: checking for any API/ABI changes (a minor bump is required if any are found)..."100 CHECK_FLAGS+=(--strict)101else102 echo "Minor version bump detected: checking for backwards-incompatible API/ABI changes..."103fi104 105echo "Checking API/ABI compatibility against ${PREV_TAG}..."106 107WORKTREE_DIR=$(mktemp -d)108BUILD_OLD=$(mktemp -d)109BUILD_NEW=$(mktemp -d)110 111cleanup() {112 git -C "$REPO_ROOT" worktree remove --force "$WORKTREE_DIR" 2>/dev/null || true113 rm -rf "$WORKTREE_DIR" "$BUILD_OLD" "$BUILD_NEW"114}115trap cleanup EXIT116 117git -C "$REPO_ROOT" worktree add "$WORKTREE_DIR" "$PREV_TAG"118 119cmake -S "$WORKTREE_DIR" -B "$BUILD_OLD" -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo120cmake --build "$BUILD_OLD" --parallel "$(nproc)"121OLD_LIBS=($(discover_libs "$BUILD_OLD"))122echo "Libraries found in old build: ${OLD_LIBS[*]}"123 124cmake -S "$REPO_ROOT" -B "$BUILD_NEW" -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo125cmake --build "$BUILD_NEW" --parallel "$(nproc)"126NEW_LIBS=($(discover_libs "$BUILD_NEW"))127echo "Libraries found in new build: ${NEW_LIBS[*]}"128 129(cd "$WORKTREE_DIR" && "$SCRIPT_DIR/check-apiabi-compat.sh" --include-path ggml/include --generate "$BUILD_OLD" "${OLD_LIBS[@]}")130(cd "$REPO_ROOT" && "$SCRIPT_DIR/check-apiabi-compat.sh" --include-path ggml/include --generate "$BUILD_NEW" "${NEW_LIBS[@]}")131(cd "$REPO_ROOT" && "$SCRIPT_DIR/check-apiabi-compat.sh" "${CHECK_FLAGS[@]}" --check "$BUILD_OLD" "$BUILD_NEW")132 