Buckets:
| # Check API/ABI compatibility between the previous release tag and current HEAD. | |
| # | |
| # Finds the most recent vX.Y.Z tag, checks it out in a temporary git worktree, | |
| # builds both versions with shared libs enabled, and uses check-apiabi-compat.sh | |
| # to compare the results. | |
| # | |
| # Exit codes: | |
| # 0: compatible, or check was skipped | |
| # 1: backwards-incompatible changes found, or build failed | |
| # | |
| # Options: | |
| # --tag <version>: compare against this tag instead of the latest release | |
| # | |
| # Environment: | |
| # SKIP_APIABI_CHECK: set to 1 or true to skip | |
| # APIABI_COMPARE_TAG: equivalent to --tag (used by CI) | |
| # APIABI_REPORT_DIR: preserve reports and dumps in this directory, even if the comparison fails | |
| set -euo pipefail | |
| SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" | |
| REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" | |
| LIBS=(libllama libmtmd) | |
| usage() { | |
| echo "Usage: $0 [--tag <version>]" >&2 | |
| echo " --tag <version> Compare against this release tag (default: latest)" >&2 | |
| } | |
| COMPARE_TAG="${APIABI_COMPARE_TAG:-}" | |
| while [[ "$#" -gt 0 ]]; do | |
| case "$1" in | |
| --tag) | |
| if [[ -z "${2:-}" ]]; then usage; exit 1; fi | |
| COMPARE_TAG="$2" | |
| shift 2 | |
| ;; | |
| --tag=*) | |
| COMPARE_TAG="${1#*=}" | |
| shift | |
| ;; | |
| -h | --help) | |
| usage; exit 0 | |
| ;; | |
| *) | |
| usage; exit 1 | |
| ;; | |
| esac | |
| done | |
| if [[ "${SKIP_APIABI_CHECK:-}" == "1" || "${SKIP_APIABI_CHECK:-}" == "true" ]]; then | |
| echo "SKIP_APIABI_CHECK is set - skipping API/ABI compatibility check" | |
| exit 0 | |
| fi | |
| if ! command -v abi-compliance-checker >/dev/null 2>&1 || ! command -v abidw >/dev/null 2>&1; then | |
| echo "Warning: abi-compliance-checker or abigail-tools not installed - skipping API/ABI check" | |
| exit 0 | |
| fi | |
| if [[ -n "${COMPARE_TAG}" ]]; then | |
| PREV_TAG="${COMPARE_TAG}" | |
| if ! git -C "$REPO_ROOT" rev-parse --verify "${PREV_TAG}^{}" >/dev/null 2>&1; then | |
| echo "Error: tag '${PREV_TAG}' not found in repository." >&2 | |
| exit 1 | |
| fi | |
| else | |
| PREV_TAG=$(git -C "$REPO_ROOT" tag --sort=-v:refname | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$' | head -n 1 || true) | |
| if [[ -z "${PREV_TAG}" ]]; then | |
| echo "Warning: no previous release tag found - skipping API/ABI check" | |
| exit 0 | |
| fi | |
| fi | |
| OLD_VERSION="${PREV_TAG#v}" | |
| OLD_MAJOR="${OLD_VERSION%%.*}" | |
| OLD_MINOR="${OLD_VERSION#*.}"; OLD_MINOR="${OLD_MINOR%%.*}" | |
| NEW_MAJOR=$(grep "set(LLAMA_VERSION_MAJOR" "$REPO_ROOT/CMakeLists.txt" | sed 's/.*MAJOR \([0-9]*\).*/\1/') | |
| NEW_MINOR=$(grep "set(LLAMA_VERSION_MINOR" "$REPO_ROOT/CMakeLists.txt" | sed 's/.*MINOR \([0-9]*\).*/\1/') | |
| if [[ "$NEW_MAJOR" -gt "$OLD_MAJOR" ]]; then | |
| echo "Major version increment ($OLD_MAJOR -> $NEW_MAJOR): API/ABI breaking changes are expected, skipping compatibility check." | |
| exit 0 | |
| fi | |
| CHECK_FLAGS=() | |
| if [[ "$NEW_MINOR" -eq "$OLD_MINOR" ]]; then | |
| echo "Patch version bump detected: checking for any API/ABI changes (a minor bump is required if any are found)..." | |
| CHECK_FLAGS+=(--strict) | |
| else | |
| echo "Minor version bump detected: checking for backwards-incompatible API/ABI changes..." | |
| fi | |
| echo "Checking API/ABI compatibility against ${PREV_TAG}..." | |
| WORKTREE_DIR=$(mktemp -d) | |
| BUILD_OLD=$(mktemp -d) | |
| BUILD_NEW=$(mktemp -d) | |
| cleanup() { | |
| git -C "$REPO_ROOT" worktree remove --force "$WORKTREE_DIR" 2>/dev/null || true | |
| rm -rf "$WORKTREE_DIR" "$BUILD_OLD" "$BUILD_NEW" | |
| } | |
| trap cleanup EXIT | |
| git -C "$REPO_ROOT" worktree add "$WORKTREE_DIR" "$PREV_TAG" | |
| cmake -S "$WORKTREE_DIR" -B "$BUILD_OLD" -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo | |
| cmake --build "$BUILD_OLD" --parallel "$(nproc)" | |
| cmake -S "$REPO_ROOT" -B "$BUILD_NEW" -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo | |
| cmake --build "$BUILD_NEW" --parallel "$(nproc)" | |
| (cd "$WORKTREE_DIR" && "$SCRIPT_DIR/check-apiabi-compat.sh" --include-path ggml/include --generate "$BUILD_OLD" "${LIBS[@]}") | |
| (cd "$REPO_ROOT" && "$SCRIPT_DIR/check-apiabi-compat.sh" --include-path ggml/include --generate "$BUILD_NEW" "${LIBS[@]}") | |
| CHECK_RESULT=0 | |
| (cd "$REPO_ROOT" && "$SCRIPT_DIR/check-apiabi-compat.sh" "${CHECK_FLAGS[@]}" --check "$BUILD_OLD" "$BUILD_NEW") || CHECK_RESULT=$? | |
| if [[ -n "${APIABI_REPORT_DIR:-}" ]]; then | |
| mkdir -p "$APIABI_REPORT_DIR/old" "$APIABI_REPORT_DIR/new" | |
| cp -R "$BUILD_OLD/apiabi/." "$APIABI_REPORT_DIR/old/" | |
| cp -R "$BUILD_NEW/apiabi/." "$APIABI_REPORT_DIR/new/" | |
| echo "API/ABI reports saved to $APIABI_REPORT_DIR" | |
| fi | |
| exit "$CHECK_RESULT" | |
Xet Storage Details
- Size:
- 4.47 kB
- Xet hash:
- ec8d907a8d43a4bfa595cba8fc11be6c5da84bffab9a0989f9962c79b112fa66
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.