Skip to content

fix(build): update LLAMA_LDFLAGS to include vcruntime and ucrt for Wi… #198

fix(build): update LLAMA_LDFLAGS to include vcruntime and ucrt for Wi…

fix(build): update LLAMA_LDFLAGS to include vcruntime and ucrt for Wi… #198

Workflow file for this run

name: build, test and release sqlite-ai
on:
push:
workflow_dispatch:
permissions:
contents: write
jobs:
build:
runs-on: ${{ matrix.os }}
name: ${{ matrix.name }}${{ matrix.arch && format('-{0}', matrix.arch) || '' }} build${{ matrix.arch != 'arm64-v8a' && matrix.name != 'isim' && matrix.name != 'ios' && ' + test' || ''}}
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
include:
# Linux builds
- os: ubuntu-latest
arch: x86_64
name: linux-cpu
make: LLAMA="-DGGML_NATIVE=ON"
- os: ubuntu-latest
arch: x86_64
name: linux-cpu-avx2
make: LLAMA="-DGGML_NATIVE=OFF -DGGML_AVX2=ON -DGGML_FMA=ON -DGGML_F16C=ON"
- os: ubuntu-latest
arch: x86_64
name: linux-cpu-avx512
make: LLAMA="-DGGML_NATIVE=OFF -DGGML_AVX512=ON -DGGML_AVX512_VNNI=ON"
- os: ubuntu-latest
arch: x86_64
name: linux-openblas
make: LLAMA="-DGGML_NATIVE=ON -DGGML_BLAS=ON -DGGML_BLAS_VENDOR=OpenBLAS"
- os: ubuntu-latest
arch: x86_64
name: linux-vulkan
make: LLAMA="-DGGML_NATIVE=OFF -DGGML_VULKAN=ON"
- os: ubuntu-latest
arch: x86_64
name: linux-opencl
make: LLAMA="-DGGML_NATIVE=ON -DGGML_OPENCL=ON"
# Linux ARM64 builds
- os: LinuxARM64
arch: arm64
name: linux-cpu
make: LLAMA="-DGGML_NATIVE=ON"
- os: LinuxARM64
arch: arm64
name: linux-neon
make: LLAMA="-DGGML_NATIVE=OFF -DGGML_CPU_ARM_ARCH=armv8.2-a"
- os: LinuxARM64
arch: arm64
name: linux-openblas
make: LLAMA="-DGGML_NATIVE=ON -DGGML_BLAS=ON -DGGML_BLAS_VENDOR=OpenBLAS"
- os: LinuxARM64
arch: arm64
name: linux-vulkan
make: LLAMA="-DGGML_NATIVE=OFF -DGGML_VULKAN=ON"
- os: LinuxARM64
arch: arm64
name: linux-opencl
make: LLAMA="-DGGML_NATIVE=ON -DGGML_OPENCL=ON"
# macOS builds
- os: macos-latest
name: macos
make: LLAMA="-DGGML_NATIVE=ON -DGGML_METAL=ON -DGGML_ACCELERATE=ON -DGGML_BLAS=ON -DGGML_BLAS_VENDOR=Apple" WHISPER="-DGGML_METAL=ON -DGGML_ACCELERATE=ON -DGGML_BLAS=ON -DGGML_BLAS_VENDOR=Apple -DWHISPER_COREML=ON -DWHISPER_COREML_ALLOW_FALLBACK=ON"
# Windows builds
- os: windows-latest
arch: x86_64
name: windows-cpu
make: LLAMA="-DGGML_NATIVE=ON"
- os: windows-latest
arch: x86_64
name: windows-cpu-avx2
make: LLAMA="-DGGML_NATIVE=OFF -DGGML_AVX2=ON -DGGML_FMA=ON -DGGML_F16C=ON -DGGML_BMI2=ON -DGGML_SSE42=ON"
- os: windows-latest
arch: x86_64
name: windows-cpu-avx512
make: LLAMA="-DGGML_NATIVE=OFF -DGGML_AVX512=ON -DGGML_AVX512_VNNI=ON -DGGML_AVX512_VBMI=ON -DGGML_AVX512_BF16=ON"
- os: windows-latest
arch: x86_64
name: windows-cpu-avx-vnni
make: LLAMA="-DGGML_NATIVE=OFF -DGGML_AVX_VNNI=ON -DGGML_AVX2=ON -DGGML_FMA=ON -DGGML_F16C=ON"
- os: windows-latest
arch: x86_64
name: windows-openblas
make: LLAMA="-DGGML_BLAS=ON -DGGML_BLAS_VENDOR=OpenBLAS"
- os: windows-latest
arch: x86_64
name: windows-llamafile
make: LLAMA="-DGGML_NATIVE=ON -DGGML_LLAMAFILE=ON"
- os: windows-latest
arch: x86_64
name: windows-cuda
make: LLAMA="-G \"Ninja Multi-Config\" -DGGML_NATIVE=OFF -DGGML_CPU=OFF -DGGML_CUDA=ON"
- os: windows-latest
arch: x86_64
name: windows-vulkan
make: LLAMA="-DGGML_NATIVE=OFF -DGGML_VULKAN=ON"
- os: windows-latest
arch: x86_64
name: windows-opencl
make: LLAMA="-DGGML_NATIVE=ON -DGGML_OPENCL=ON"
- os: windows-latest
arch: x86_64
name: windows-hip
make: LLAMA="-DGGML_NATIVE=OFF -DGGML_CPU=OFF -DGGML_HIP=ON -DGGML_HIP_ROCWMMA_FATTN=ON -DAMDGPU_TARGETS=\"gfx1100;gfx1101;gfx1102;gfx1030;gfx1031;gfx1032\" -DCMAKE_C_COMPILER=\"$HIP_PATH/bin/clang.exe\" -DCMAKE_CXX_COMPILER=\"$HIP_PATH/bin/clang++.exe\" -DCMAKE_CXX_FLAGS=\"-I$(pwd)/rocwmma/library/include/ -Wno-ignored-attributes -Wno-nested-anon-types\""
# Android builds
- os: ubuntu-latest
arch: arm64-v8a
name: android
make: PLATFORM=android ARCH=arm64-v8a
- os: ubuntu-latest
arch: x86_64
name: android
make: PLATFORM=android ARCH=x86_64
sqlite-amalgamation-zip: https://sqlite.org/2025/sqlite-amalgamation-3490100.zip
# iOS builds
- os: macos-latest
name: ios
make: PLATFORM=ios
- os: macos-latest
name: isim
make: PLATFORM=isim
defaults:
run:
shell: bash
steps:
- uses: actions/checkout@v4.2.2
with:
submodules: true
- uses: msys2/setup-msys2@v2.27.0
if: matrix.os == 'windows-latest'
with:
msystem: mingw64
install: >-
git
make
sqlite
mingw-w64-x86_64-cc
mingw-w64-x86_64-cmake
${{ matrix.name == 'windows-vulkan' && 'mingw-w64-x86_64-vulkan-headers' || '' }}
${{ matrix.name == 'windows-vulkan' && 'mingw-w64-x86_64-vulkan-loader' || '' }}
${{ matrix.name == 'windows-vulkan' && 'mingw-w64-x86_64-shaderc' || '' }}
${{ matrix.name == 'windows-openblas' && 'mingw-w64-x86_64-openblas' || '' }}
${{ matrix.name == 'windows-opencl' && 'mingw-w64-x86_64-opencl-headers' || '' }}
${{ matrix.name == 'windows-opencl' && 'mingw-w64-x86_64-opencl-icd' || '' }}
- name: linux install openblas
if: matrix.name == 'linux-openblas'
run: |
sudo apt-get install -y libopenblas-dev
- name: linux install opencl
if: matrix.name == 'linux-opencl'
run: |
sudo apt-get install -y opencl-headers ocl-icd-opencl-dev
- name: linux-x86_64 install vulkan
if: matrix.name == 'linux-vulkan' && matrix.arch == 'x86_64'
run: |
wget -qO - https://packages.lunarg.com/lunarg-signing-key-pub.asc | sudo apt-key add -
sudo wget -qO /etc/apt/sources.list.d/lunarg-vulkan-jammy.list https://packages.lunarg.com/vulkan/lunarg-vulkan-jammy.list
sudo apt-get update -y
sudo apt-get install -y mesa-vulkan-drivers
# Vulkan is no longer packed for Ubuntu
wget https://sdk.lunarg.com/sdk/download/latest/linux/vulkan-sdk.tar.xz?Human=true -O vulkan-sdk.tar.xz
tar -xf vulkan-sdk.tar.xz
cd $(ls -d 1.* | head -n1)
source setup-env.sh
echo "VULKAN_SDK=$VULKAN_SDK" >> $GITHUB_ENV
echo "PATH=$PATH" >> $GITHUB_ENV
echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH" >> $GITHUB_ENV
echo "VK_ADD_LAYER_PATH=$VK_ADD_LAYER_PATH" >> $GITHUB_ENV
- name: linux-arm64 install vulkan
if: matrix.name == 'linux-vulkan' && matrix.arch == 'arm64'
run: |
sudo dpkg --add-architecture arm64
# Add arch-specific repositories for non-amd64 architectures
cat << EOF | sudo tee /etc/apt/sources.list.d/arm64-ports.list
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ noble main universe
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ noble-updates main universe
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ noble-security main universe
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ noble-backports main universe
EOF
sudo apt-get update || true ;# Prevent failure due to missing URLs.
sudo apt-get install -y --no-install-recommends \
build-essential \
glslc \
crossbuild-essential-arm64 \
libvulkan-dev:arm64
- name: windows setup vulkan environment
if: matrix.name == 'windows-vulkan'
run: |
# MSYS2 Vulkan packages are already installed, just set up environment
echo "VULKAN_SDK=C:/msys64/mingw64" >> $GITHUB_ENV
- name: windows install cuda
if: matrix.name == 'windows-cuda'
uses: ./modules/llama.cpp/.github/actions/windows-setup-cuda
with:
cuda_version: '12.4'
- name: windows install ninja for cuda
if: matrix.name == 'windows-cuda'
run: choco install ninja
shell: pwsh
- name: windows build ggml-cuda
if: matrix.name == 'windows-cuda'
shell: cmd
run: |
call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64
make build/llama.cpp.stamp ${{ matrix.make && matrix.make || ''}}
- name: windows install hip toolkit
if: matrix.name == 'windows-hip'
run: |
git clone https://github.com/rocm/rocwmma --branch rocm-6.2.4 --depth 1
$ErrorActionPreference = "Stop"
write-host "Downloading AMD HIP SDK Installer"
Invoke-WebRequest -Uri "https://download.amd.com/developer/eula/rocm-hub/AMD-Software-PRO-Edition-24.Q3-WinSvr2022-For-HIP.exe" -OutFile "${env:RUNNER_TEMP}\rocm-install.exe"
write-host "Installing AMD HIP SDK"
Start-Process "${env:RUNNER_TEMP}\rocm-install.exe" -ArgumentList '-install' -NoNewWindow -Wait
write-host "Completed AMD HIP SDK installation"
& 'C:\Program Files\AMD\ROCm\*\bin\clang.exe' --version
$HIP_PWSH = "$(Resolve-Path 'C:\Program Files\AMD\ROCm\*\bin\clang.exe' | split-path | split-path)"
"HIP_PATH=$($HIP_PWSH.Replace('\', '/'))" | Out-File -FilePath $env:GITHUB_ENV -Append
"CMAKE_PREFIX_PATH=$($HIP_PWSH.Replace('\', '/'))" | Out-File -FilePath $env:GITHUB_ENV -Append
"HIP_PLATFORM=amd" | Out-File -FilePath $env:GITHUB_ENV -Append
# Ensure hip-config.cmake can find hipconfig
"PATH=$env:PATH;$($HIP_PWSH.Replace('\', '/'))/bin" | Out-File -FilePath $env:GITHUB_ENV -Append
shell: pwsh
- name: windows build sqlite-ai
if: matrix.os == 'windows-latest'
run: |
if [ "${{ matrix.name }}" = "windows-hip" ]; then
export PATH="$HIP_PATH/bin:$PATH"
fi
make extension ${{ matrix.make && matrix.make || ''}}
shell: msys2 {0}
env:
HIP_PLATFORM: amd
- name: build sqlite-ai
if: matrix.os != 'windows-latest'
run: make extension ${{ matrix.make && matrix.make || ''}}
- name: macos install sqlite3 without SQLITE_OMIT_LOAD_EXTENSION
if: matrix.name == 'macos'
run: brew link sqlite --force
- name: android setup test environment
if: matrix.name == 'android' && matrix.arch != 'arm64-v8a'
run: |
echo "::group::enable kvm group perms"
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm
echo "::endgroup::"
echo "::group::download and build sqlite3 without SQLITE_OMIT_LOAD_EXTENSION"
curl -O ${{ matrix.sqlite-amalgamation-zip }}
unzip sqlite-amalgamation-*.zip
export ${{ matrix.make }}
$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/${{ matrix.arch }}-linux-android26-clang sqlite-amalgamation-*/shell.c sqlite-amalgamation-*/sqlite3.c -o sqlite3 -ldl
# remove unused folders to save up space
rm -rf sqlite-amalgamation-*.zip sqlite-amalgamation-*
echo "::endgroup::"
echo "::group::prepare the test script"
make test PLATFORM=$PLATFORM ARCH=$ARCH || echo "It should fail. Running remaining commands in the emulator"
cat > commands.sh << EOF
mv -f /data/local/tmp/sqlite3 /system/xbin
cd /data/local/tmp
$(make test PLATFORM=$PLATFORM ARCH=$ARCH -n)
EOF
# remove big unused folders to avoid emulator errors
rm -rf build modules
echo "::endgroup::"
- name: android test sqlite-ai
if: matrix.name == 'android' && matrix.arch != 'arm64-v8a'
uses: reactivecircus/android-emulator-runner@v2.34.0
with:
api-level: 26
arch: ${{ matrix.arch }}
script: |
adb root
adb remount
adb push ${{ github.workspace }}/. /data/local/tmp/
adb shell "sh /data/local/tmp/commands.sh"
- name: windows test sqlite-ai
if: startsWith(matrix.name, 'windows-')
run: make test ${{ matrix.make && matrix.make || ''}}
shell: msys2 {0}
- name: test sqlite-ai
if: startsWith(matrix.name, 'linux-') || matrix.name == 'macos'
run: make test
- uses: actions/upload-artifact@v4.6.2
if: always()
with:
name: ai-${{ matrix.name }}${{ matrix.arch && format('-{0}', matrix.arch) || '' }}
path: dist/ai.*
if-no-files-found: error
release:
runs-on: ubuntu-latest
name: release
needs: build
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4.2.2
- uses: actions/download-artifact@v4.2.1
with:
path: artifacts
- name: release tag version from sqlite-ai.h
id: tag
run: |
VERSION=$(make version)
if [[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
LATEST=$(curl -s -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" https://api.github.com/repos/${{ github.repository }}/releases/latest | jq -r '.name')
if [[ "$VERSION" != "$LATEST" || "$GITHUB_EVENT_NAME" == "workflow_dispatch" ]]; then
echo "version=$VERSION" >> $GITHUB_OUTPUT
else
echo "::warning file=src/sqlite-ai.h::To release a new version, please update the SQLITE_AI_VERSION in src/sqlite-ai.h to be different than the latest $LATEST"
fi
exit 0
fi
echo "❌ SQLITE_AI_VERSION not found in sqlite-ai.h"
exit 1
- name: zip artifacts
run: |
for folder in "artifacts"/*; do
if [ -d "$folder" ]; then
name=$(basename "$folder")
zip -jq "${name}-${{ steps.tag.outputs.version }}.zip" "$folder"/*
tar -cJf "${name}-${{ steps.tag.outputs.version }}.tar.xz" -C "$folder" .
tar -czf "${name}-${{ steps.tag.outputs.version }}.tar.gz" -C "$folder" .
fi
done
- uses: softprops/action-gh-release@v2.2.1
if: steps.tag.outputs.version != ''
with:
generate_release_notes: true
tag_name: ${{ steps.tag.outputs.version }}
files: |
ai-*-${{ steps.tag.outputs.version }}.zip
ai-*-${{ steps.tag.outputs.version }}.tar.xz
ai-*-${{ steps.tag.outputs.version }}.tar.gz
make_latest: true