Skip to content

Commit a6dcf52

Browse files
authored
Add XCFramework and Linux MUSL Builds; Sign and Notarize Apple Builds (#10)
* add Linux MUSL, XCFramework and Signed and Notarized Apple builds * fix(makefile): correct indentation for ARGS assignment in build section * fix(workflow/linux-musl): install git * fix(workflow): update conditional checks for linux-musl * fix(workflow): add g++ to linux-musl x86_64 and arm64 dependency installation * fix(workflow): add cmake to linux-musl x86_64 and arm64 dependency installation * fix(workflow/linux-musl): add OpenCL and Vulkan installation for linux-musl-gpu * fix(workflow/linux-musl): add shaderc to vulkan installation for linux-musl-gpu * fix(workflow/linux-musl): add python3 to dependency installation for linux-musl x86_64 and arm64 * fix(workflow/linux-musl): enhance vulkan installation by adding mesa-vulkan-intel, mesa-vulkan-radeon, and vulkan-tools * fix(workflow/linux-musl): add vulkan-icd-loader to linux-musl-gpu vulkan installation * fix(workflow/linux-musl): update vulkan installation to include vulkan-loader and vulkan-tools for linux-musl-gpu * fix(workflow/linux-musl): remove duplicate vulkan-loader in linux-musl-gpu installation * fix(workflow/linux-musl): enhance linux-musl-gpu vulkan installation * fix(workflow/linux-musl): update linux-musl-gpu vulkan installation to remove mesa-dri-intel and mesa-dri-amdgpu * fix(workflow/linux-musl): update linux-musl-gpu vulkan installation to include build-base and remove unnecessary packages * fix(workflow/linux-musl): enhance linux-musl-gpu vulkan installation with additional dependencies and environment setup * fix(workflow/linux-musl): update linux-musl-gpu vulkan installation to remove mesa-vulkan-drivers * fix(workflow/linux-musl): disable Vulkan support for linux-musl-gpu builds * fix(workflow/linux-musl): remove Vulkan support from linux-musl-gpu builds
1 parent f18f6d2 commit a6dcf52

File tree

3 files changed

+167
-41
lines changed

3 files changed

+167
-41
lines changed

.github/workflows/main.yml

Lines changed: 94 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,14 @@ permissions:
99
jobs:
1010
build:
1111
runs-on: ${{ matrix.os }}
12-
name: ${{ matrix.name }}${{ matrix.arch && format('-{0}', matrix.arch) || '' }} build${{ matrix.arch != 'arm64-v8a' && matrix.name != 'isim' && matrix.name != 'ios' && ' + test' || ''}}
12+
container: ${{ matrix.container && matrix.container || '' }}
13+
name: ${{ matrix.name }}${{ matrix.arch && format('-{0}', matrix.arch) || '' }} build${{ matrix.arch != 'arm64-v8a' && matrix.name != 'ios-sim' && matrix.name != 'ios' && matrix.name != 'apple-xcframework' && ' + test' || ''}}
1314
timeout-minutes: 120
1415
strategy:
1516
fail-fast: false
1617
matrix:
1718
include:
18-
- os: macos-latest
19+
- os: macos-15
1920
name: macos
2021
make: LLAMA="-DGGML_NATIVE=OFF -DGGML_METAL=ON -DGGML_ACCELERATE=ON -DGGML_BLAS=ON -DGGML_BLAS_VENDOR=Apple" WHISPER="-DWHISPER_COREML=ON -DWHISPER_COREML_ALLOW_FALLBACK=ON"
2122
- os: ubuntu-22.04
@@ -26,14 +27,32 @@ jobs:
2627
arch: x86_64
2728
name: linux-gpu
2829
make: LLAMA="-DGGML_NATIVE=OFF -DGGML_CPU=ON -DGGML_VULKAN=ON -DGGML_OPENCL=ON"
29-
- os: LinuxARM64
30+
- os: ubuntu-22.04-arm
3031
arch: arm64
3132
name: linux-cpu
3233
make: LLAMA="-DGGML_NATIVE=OFF -DGGML_CPU=ON -DGGML_CPU_ARM_ARCH=armv8.2-a"
33-
- os: LinuxARM64
34+
- os: ubuntu-22.04-arm
3435
arch: arm64
3536
name: linux-gpu
3637
make: LLAMA="-DGGML_NATIVE=OFF -DGGML_CPU=ON -DGGML_VULKAN=ON -DGGML_OPENCL=ON"
38+
- os: ubuntu-22.04
39+
arch: x86_64
40+
name: linux-musl-cpu
41+
container: alpine:latest
42+
make: LLAMA="-DGGML_NATIVE=OFF -DGGML_CPU=ON -DGGML_AVX2=ON"
43+
- os: ubuntu-22.04
44+
arch: x86_64
45+
name: linux-musl-gpu
46+
container: alpine:latest
47+
make: LLAMA="-DGGML_NATIVE=OFF -DGGML_CPU=ON -DGGML_OPENCL=ON"
48+
- os: ubuntu-22.04-arm
49+
arch: arm64
50+
name: linux-musl-cpu
51+
make: LLAMA="-DGGML_NATIVE=OFF -DGGML_CPU=ON -DGGML_CPU_ARM_ARCH=armv8.2-a"
52+
- os: ubuntu-22.04-arm
53+
arch: arm64
54+
name: linux-musl-gpu
55+
make: LLAMA="-DGGML_NATIVE=OFF -DGGML_CPU=ON -DGGML_OPENCL=ON"
3756
- os: windows-2022
3857
arch: x86_64
3958
name: windows-cpu
@@ -42,28 +61,35 @@ jobs:
4261
arch: x86_64
4362
name: windows-gpu
4463
make: LLAMA="-DGGML_NATIVE=OFF -DGGML_CPU=ON -DGGML_VULKAN=ON -DGGML_OPENCL=ON"
45-
- os: ubuntu-latest
64+
- os: ubuntu-22.04
4665
arch: x86_64
4766
name: android
4867
make: PLATFORM=android ARCH=x86_64
4968
sqlite-amalgamation-zip: https://sqlite.org/2025/sqlite-amalgamation-3490100.zip
50-
- os: ubuntu-latest
69+
- os: ubuntu-22.04
5170
arch: arm64-v8a
5271
name: android
5372
make: PLATFORM=android ARCH=arm64-v8a LLAMA="-DGGML_CPU_ARM_ARCH=armv8.2-a+dotprod"
54-
- os: macos-latest
73+
- os: macos-15
5574
name: ios
5675
make: PLATFORM=ios LLAMA="-DGGML_NATIVE=OFF -DGGML_METAL=ON -DGGML_ACCELERATE=ON -DGGML_BLAS=ON -DGGML_BLAS_VENDOR=Apple" WHISPER="-DWHISPER_COREML=ON -DWHISPER_COREML_ALLOW_FALLBACK=ON"
57-
- os: macos-latest
58-
name: isim
59-
make: PLATFORM=isim LLAMA="-DGGML_NATIVE=OFF -DGGML_METAL=ON -DGGML_ACCELERATE=ON -DGGML_BLAS=ON -DGGML_BLAS_VENDOR=Apple" WHISPER="-DWHISPER_COREML=ON -DWHISPER_COREML_ALLOW_FALLBACK=ON"
76+
- os: macos-15
77+
name: ios-sim
78+
make: PLATFORM=ios-sim LLAMA="-DGGML_NATIVE=OFF -DGGML_METAL=ON -DGGML_ACCELERATE=ON -DGGML_BLAS=ON -DGGML_BLAS_VENDOR=Apple" WHISPER="-DWHISPER_COREML=ON -DWHISPER_COREML_ALLOW_FALLBACK=ON"
79+
- os: macos-15
80+
name: apple-xcframework
81+
make: xcframework LLAMA="-DGGML_NATIVE=OFF -DGGML_METAL=ON -DGGML_ACCELERATE=ON -DGGML_BLAS=ON -DGGML_BLAS_VENDOR=Apple" WHISPER="-DWHISPER_COREML=ON -DWHISPER_COREML_ALLOW_FALLBACK=ON"
6082

6183
defaults:
6284
run:
63-
shell: bash
85+
shell: ${{ matrix.container && 'sh' || 'bash' }}
6486

6587
steps:
6688

89+
- name: linux-musl x86_64 install dependencies
90+
if: contains(matrix.name, 'linux-musl') && matrix.arch == 'x86_64'
91+
run: apk update && apk add --no-cache git gcc g++ make cmake sqlite musl-dev linux-headers python3
92+
6793
- uses: actions/[email protected]
6894
with:
6995
submodules: true
@@ -116,10 +142,29 @@ jobs:
116142
${{ matrix.name == 'windows-gpu' && 'mingw-w64-x86_64-opencl-headers' || '' }}
117143
${{ matrix.name == 'windows-gpu' && 'mingw-w64-x86_64-opencl-icd' || '' }}
118144
145+
- name: macos install dependencies
146+
if: matrix.name == 'macos'
147+
run: brew link sqlite --force
148+
149+
- name: linux-musl arm64 setup container
150+
if: contains(matrix.name, 'linux-musl') && matrix.arch == 'arm64'
151+
run: |
152+
docker run -d --name alpine \
153+
--platform linux/arm64 \
154+
-v ${{ github.workspace }}:/workspace \
155+
-w /workspace \
156+
alpine:latest \
157+
tail -f /dev/null
158+
docker exec alpine sh -c "apk update && apk add --no-cache gcc g++ make cmake sqlite musl-dev linux-headers python3"
159+
119160
- name: linux install opencl
120161
if: matrix.name == 'linux-gpu'
121162
run: sudo apt-get install -y opencl-headers ocl-icd-opencl-dev
122163

164+
- name: linux-musl install opencl
165+
if: matrix.name == 'linux-musl-gpu'
166+
run: ${{ matrix.arch == 'arm64' && 'docker exec alpine' || '' }} apk add --no-cache opencl-headers opencl-icd-loader-dev
167+
123168
- name: linux-x86_64 install vulkan
124169
if: matrix.name == 'linux-gpu' && matrix.arch == 'x86_64'
125170
run: |
@@ -190,7 +235,7 @@ jobs:
190235

191236
- name: unix build llama.cpp
192237
if: matrix.os != 'windows-2022' && steps.cache-llama.outputs.cache-hit != 'true'
193-
run: make build/llama.cpp.stamp ${{ matrix.make && matrix.make || ''}}
238+
run: ${{ contains(matrix.name, 'linux-musl') && matrix.arch == 'arm64' && 'docker exec alpine' || '' }} make build/llama.cpp.stamp ${{ matrix.make && matrix.make || ''}}
194239

195240
- name: windows build whisper.cpp
196241
if: matrix.os == 'windows-2022' && steps.cache-whisper.outputs.cache-hit != 'true'
@@ -201,7 +246,7 @@ jobs:
201246

202247
- name: unix build whisper.cpp
203248
if: matrix.os != 'windows-2022' && steps.cache-whisper.outputs.cache-hit != 'true'
204-
run: make build/whisper.cpp.stamp ${{ matrix.make && matrix.make || ''}}
249+
run: ${{ contains(matrix.name, 'linux-musl') && matrix.arch == 'arm64' && 'docker exec alpine' || '' }} make build/whisper.cpp.stamp ${{ matrix.make && matrix.make || ''}}
205250

206251
- name: windows build miniaudio
207252
if: matrix.os == 'windows-2022' && steps.cache-miniaudio.outputs.cache-hit != 'true'
@@ -210,7 +255,7 @@ jobs:
210255

211256
- name: unix build miniaudio
212257
if: matrix.os != 'windows-2022' && steps.cache-miniaudio.outputs.cache-hit != 'true'
213-
run: make build/miniaudio.stamp ${{ matrix.make && matrix.make || ''}}
258+
run: ${{ contains(matrix.name, 'linux-musl') && matrix.arch == 'arm64' && 'docker exec alpine' || '' }} make build/miniaudio.stamp ${{ matrix.make && matrix.make || ''}}
214259

215260
- name: windows build sqlite-ai
216261
if: matrix.os == 'windows-2022'
@@ -221,11 +266,36 @@ jobs:
221266

222267
- name: unix build sqlite-ai
223268
if: matrix.os != 'windows-2022'
224-
run: make extension ${{ matrix.make && matrix.make || ''}}
269+
run: ${{ contains(matrix.name, 'linux-musl') && matrix.arch == 'arm64' && 'docker exec alpine' || '' }} make extension ${{ matrix.make && matrix.make || ''}}
225270

226-
- name: macos install sqlite3 without SQLITE_OMIT_LOAD_EXTENSION
227-
if: matrix.name == 'macos'
228-
run: brew link sqlite --force
271+
- name: create keychain for codesign
272+
if: matrix.os == 'macos-15'
273+
run: |
274+
echo "${{ secrets.APPLE_CERTIFICATE }}" | base64 --decode > certificate.p12
275+
security create-keychain -p "${{ secrets.KEYCHAIN_PASSWORD }}" build.keychain
276+
security default-keychain -s build.keychain
277+
security unlock-keychain -p "${{ secrets.KEYCHAIN_PASSWORD }}" build.keychain
278+
security import certificate.p12 -k build.keychain -P "${{ secrets.CERTIFICATE_PASSWORD }}" -T /usr/bin/codesign
279+
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "${{ secrets.KEYCHAIN_PASSWORD }}" build.keychain
280+
281+
- name: codesign dylib
282+
if: matrix.os == 'macos-15' && matrix.name != 'apple-xcframework'
283+
run: codesign --sign "${{ secrets.APPLE_TEAM_ID }}" --timestamp --options runtime dist/ai.dylib
284+
285+
- name: codesign and notarize xcframework
286+
if: matrix.name == 'apple-xcframework'
287+
run: |
288+
find dist/ai.xcframework -name "*.framework" -exec echo "Signing: {}" \; -exec codesign --sign "${{ secrets.APPLE_TEAM_ID }}" --timestamp --options runtime {} \; # Sign each individual framework FIRST
289+
codesign --sign "${{ secrets.APPLE_TEAM_ID }}" --timestamp --options runtime dist/ai.xcframework # Then sign the xcframework wrapper
290+
ditto -c -k --keepParent dist/ai.xcframework dist/ai.xcframework.zip
291+
xcrun notarytool submit dist/ai.xcframework.zip --apple-id "${{ secrets.APPLE_ID }}" --password "${{ secrets.APPLE_PASSWORD }}" --team-id "${{ secrets.APPLE_TEAM_ID }}" --wait
292+
rm dist/ai.xcframework.zip
293+
294+
- name: cleanup keychain for codesign
295+
if: matrix.os == 'macos-15'
296+
run: |
297+
rm certificate.p12
298+
security delete-keychain build.keychain
229299
230300
- name: android setup test environment
231301
if: matrix.name == 'android' && matrix.arch != 'arm64-v8a'
@@ -280,7 +350,7 @@ jobs:
280350

281351
- name: unix test sqlite-ai
282352
if: contains(matrix.name, 'linux') || matrix.name == 'macos'
283-
run: make test ${{ matrix.make && matrix.make || ''}}
353+
run: ${{ contains(matrix.name, 'linux-musl') && matrix.arch == 'arm64' && 'docker exec alpine' || '' }} make test ${{ matrix.make && matrix.make || ''}}
284354

285355
- uses: actions/[email protected]
286356
if: always()
@@ -290,7 +360,7 @@ jobs:
290360
if-no-files-found: error
291361

292362
release:
293-
runs-on: ubuntu-latest
363+
runs-on: ubuntu-22.04
294364
name: release
295365
needs: build
296366
if: github.ref == 'refs/heads/main'
@@ -324,9 +394,10 @@ jobs:
324394
for folder in "artifacts"/*; do
325395
if [ -d "$folder" ]; then
326396
name=$(basename "$folder")
327-
zip -jq "${name}-${{ steps.tag.outputs.version }}.zip" "$folder"/*
328-
tar -cJf "${name}-${{ steps.tag.outputs.version }}.tar.xz" -C "$folder" .
329-
tar -czf "${name}-${{ steps.tag.outputs.version }}.tar.gz" -C "$folder" .
397+
if [[ "$name" != "ai-apple-xcframework" ]]; then
398+
tar -czf "${name}-${{ steps.tag.outputs.version }}.tar.gz" -C "$folder" .
399+
fi
400+
(cd "$folder" && zip -rq "../../${name}-${{ steps.tag.outputs.version }}.zip" .)
330401
fi
331402
done
332403
@@ -337,6 +408,5 @@ jobs:
337408
tag_name: ${{ steps.tag.outputs.version }}
338409
files: |
339410
ai-*-${{ steps.tag.outputs.version }}.zip
340-
ai-*-${{ steps.tag.outputs.version }}.tar.xz
341411
ai-*-${{ steps.tag.outputs.version }}.tar.gz
342412
make_latest: true

Makefile

Lines changed: 72 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -79,23 +79,17 @@ else ifeq ($(PLATFORM),macos)
7979
MINIAUDIO_OPTIONS += -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64"
8080
STRIP = strip -x -S $@
8181
else ifeq ($(PLATFORM),android)
82-
# Set ARCH to find Android NDK's Clang compiler, the user should set the ARCH
83-
ifeq ($(filter %,$(ARCH)),)
82+
ifndef ARCH # Set ARCH to find Android NDK's Clang compiler, the user should set the ARCH
8483
$(error "Android ARCH must be set to ARCH=x86_64 or ARCH=arm64-v8a")
8584
endif
86-
# Set ANDROID_NDK path to find android build tools
87-
# e.g. on MacOS: export ANDROID_NDK=/Users/username/Library/Android/sdk/ndk/25.2.9519653
88-
ifeq ($(filter %,$(ANDROID_NDK)),)
85+
ifndef ANDROID_NDK # Set ANDROID_NDK path to find android build tools; e.g. on MacOS: export ANDROID_NDK=/Users/username/Library/Android/sdk/ndk/25.2.9519653
8986
$(error "Android NDK must be set")
9087
endif
91-
9288
BIN = $(ANDROID_NDK)/toolchains/llvm/prebuilt/$(HOST)-x86_64/bin
9389
PATH := $(BIN):$(PATH)
94-
9590
ifneq (,$(filter $(ARCH),arm64 arm64-v8a))
9691
override ARCH := aarch64
9792
endif
98-
9993
CC = $(BIN)/$(ARCH)-linux-android26-clang
10094
CXX = $(CC)++
10195
TARGET := $(DIST_DIR)/ai.so
@@ -116,7 +110,7 @@ else ifeq ($(PLATFORM),ios)
116110
WHISPER_OPTIONS += -DGGML_OPENMP=OFF -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 -DWHISPER_COREML=ON
117111
MINIAUDIO_OPTIONS += -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 -DCMAKE_C_FLAGS="-x objective-c"
118112
STRIP = strip -x -S $@
119-
else ifeq ($(PLATFORM),isim)
113+
else ifeq ($(PLATFORM),ios-sim)
120114
TARGET := $(DIST_DIR)/ai.dylib
121115
SDK := -isysroot $(shell xcrun --sdk iphonesimulator --show-sdk-path) -miphonesimulator-version-min=14.0
122116
LLAMA_LIBS += $(BUILD_GGML)/lib/libggml-metal.a
@@ -182,7 +176,7 @@ $(DEF_FILE):
182176
ifeq ($(PLATFORM),windows)
183177
@echo "LIBRARY ai.dll" > $@
184178
@echo "EXPORTS" >> $@
185-
@echo " sqlite3_ai_init" >> $@
179+
@echo " sqlite3_ai_init" >> $@
186180
endif
187181

188182
# Make sure the build and dist directories exist
@@ -243,6 +237,67 @@ version:
243237
clean:
244238
rm -rf $(BUILD_DIR)/* $(DIST_DIR)/* *.gcda *.gcno *.gcov *.sqlite
245239

240+
.NOTPARALLEL: %.dylib
241+
%.dylib:
242+
rm -rf $(BUILD_DIR) && $(MAKE) PLATFORM=$*
243+
mv $(DIST_DIR)/ai.dylib $(DIST_DIR)/$@
244+
245+
define PLIST
246+
<?xml version=\"1.0\" encoding=\"UTF-8\"?>\
247+
<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\
248+
<plist version=\"1.0\">\
249+
<dict>\
250+
<key>CFBundleDevelopmentRegion</key>\
251+
<string>en</string>\
252+
<key>CFBundleExecutable</key>\
253+
<string>ai</string>\
254+
<key>CFBundleIdentifier</key>\
255+
<string>ai.sqlite.ai</string>\
256+
<key>CFBundleInfoDictionaryVersion</key>\
257+
<string>6.0</string>\
258+
<key>CFBundlePackageType</key>\
259+
<string>FMWK</string>\
260+
<key>CFBundleSignature</key>\
261+
<string>????</string>\
262+
<key>CFBundleVersion</key>\
263+
<string>$(shell make version)</string>\
264+
<key>CFBundleShortVersionString</key>\
265+
<string>$(shell make version)</string>\
266+
<key>MinimumOSVersion</key>\
267+
<string>11.0</string>\
268+
</dict>\
269+
</plist>
270+
endef
271+
272+
define MODULEMAP
273+
framework module ai {\
274+
umbrella header \"sqlite-ai.h\"\
275+
export *\
276+
}
277+
endef
278+
279+
LIB_NAMES = ios.dylib ios-sim.dylib macos.dylib
280+
FMWK_NAMES = ios-arm64 ios-arm64_x86_64-simulator macos-arm64_x86_64
281+
$(DIST_DIR)/%.xcframework: $(LIB_NAMES)
282+
@$(foreach i,1 2 3,\
283+
lib=$(word $(i),$(LIB_NAMES)); \
284+
fmwk=$(word $(i),$(FMWK_NAMES)); \
285+
mkdir -p $(DIST_DIR)/$$fmwk/ai.framework/Headers; \
286+
mkdir -p $(DIST_DIR)/$$fmwk/ai.framework/Modules; \
287+
cp src/sqlite-ai.h $(DIST_DIR)/$$fmwk/ai.framework/Headers; \
288+
printf "$(PLIST)" > $(DIST_DIR)/$$fmwk/ai.framework/Info.plist; \
289+
printf "$(MODULEMAP)" > $(DIST_DIR)/$$fmwk/ai.framework/Modules/module.modulemap; \
290+
mv $(DIST_DIR)/$$lib $(DIST_DIR)/$$fmwk/ai.framework/ai; \
291+
install_name_tool -id "@rpath/ai.framework/ai" $(DIST_DIR)/$$fmwk/ai.framework/ai; \
292+
)
293+
xcodebuild -create-xcframework $(foreach fmwk,$(FMWK_NAMES),-framework $(DIST_DIR)/$(fmwk)/ai.framework) -output $@
294+
rm -rf $(foreach fmwk,$(FMWK_NAMES),$(DIST_DIR)/$(fmwk))
295+
296+
xcframework: $(DIST_DIR)/ai.xcframework
297+
298+
version:
299+
@echo $(shell sed -n 's/^#define SQLITE_AI_VERSION[[:space:]]*"\([^"]*\)".*/\1/p' src/sqlite-ai.h)
300+
246301
# Help message
247302
help:
248303
@echo "SQLite AI Extension Makefile"
@@ -255,12 +310,13 @@ help:
255310
@echo " windows (default on Windows)"
256311
@echo " android (needs ARCH to be set to x86_64 or arm64-v8a and ANDROID_NDK to be set)"
257312
@echo " ios (only on macOS)"
258-
@echo " isim (only on macOS)"
313+
@echo " ios-sim (only on macOS)"
259314
@echo ""
260315
@echo "Targets:"
261-
@echo " all - Build the extension (default)"
262-
@echo " clean - Remove built files"
263-
@echo " test - Test the extension"
264-
@echo " help - Display this help message"
316+
@echo " all - Build the extension (default)"
317+
@echo " clean - Remove built files"
318+
@echo " test - Test the extension"
319+
@echo " help - Display this help message"
320+
@echo " xcframework - Build the Apple XCFramework"
265321

266-
.PHONY: all clean test extension help
322+
.PHONY: all clean test extension help version xcframework

src/sqlite-ai.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
extern "C" {
2525
#endif
2626

27-
#define SQLITE_AI_VERSION "0.6.0"
27+
#define SQLITE_AI_VERSION "0.6.1"
2828

2929
SQLITE_AI_API int sqlite3_ai_init (sqlite3 *db, char **pzErrMsg, const sqlite3_api_routines *pApi);
3030

0 commit comments

Comments
 (0)