From 87cd26ae7342603ba63c66dfd7501cfca43334a7 Mon Sep 17 00:00:00 2001 From: Gioele Cantoni Date: Tue, 8 Jul 2025 15:28:30 +0200 Subject: [PATCH 01/42] Update .gitignore, add main.yml workflow, and create Makefile for SQLite AI extension. Add needed SQLITE_EXTENSION_INIT3 in utils.c. --- .github/workflows/main.yml | 165 ++++++++++++++++++++++++++++++++++++ .gitignore | 9 ++ Makefile | 167 +++++++++++++++++++++++++++++++++++++ 3 files changed, 341 insertions(+) create mode 100644 .github/workflows/main.yml create mode 100644 Makefile diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..d0a130c --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,165 @@ +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: 20 + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu-latest + arch: x86_64 + name: linux + - os: LinuxARM64 + arch: arm64 + name: linux + - os: macos-latest + name: macos + - os: windows-latest + arch: x86_64 + name: windows + - 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 + - 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 + + - name: build sqlite-ai + run: make extension ${{ matrix.make && matrix.make || ''}} + + - name: windows install sqlite3 + if: matrix.os == 'windows-latest' + run: choco install sqlite -y + + - 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 + 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: test sqlite-ai + if: matrix.name == 'linux' || matrix.name == 'windows' || 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 \ No newline at end of file diff --git a/.gitignore b/.gitignore index 4dfeb11..ad851e8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,11 @@ .DS_Store /modules/libs +*.xcworkspacedata +*.xcuserstate +*.xcbkptlist +*.plist +/build +/dist +*.sqlite +*.a +.vscode \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..a916d26 --- /dev/null +++ b/Makefile @@ -0,0 +1,167 @@ +# Makefile for SQLite AI Extension +# Supports compilation for Linux, macOS, Windows, Android and iOS + +# customize sqlite3 executable with +# make test SQLITE3=/opt/homebrew/Cellar/sqlite/3.49.1/bin/sqlite3 +SQLITE3 ?= sqlite3 + +# Set default platform if not specified +ifeq ($(OS),Windows_NT) + PLATFORM := windows + HOST := windows + CPUS := $(shell powershell -Command "[Environment]::ProcessorCount") +else + HOST = $(shell uname -s | tr '[:upper:]' '[:lower:]') + ifeq ($(HOST),darwin) + PLATFORM := macos + CPUS := $(shell sysctl -n hw.ncpu) + else + PLATFORM := $(HOST) + CPUS := $(shell nproc) + endif +endif + +# Speed up builds by using all available CPU cores +MAKEFLAGS += -j$(CPUS) + +# Compiler and flags +CC = gcc +CXX = g++ +CFLAGS = -Wall -Wextra -Wno-unused-parameter -I$(SRC_DIR) -I$(LLAMA_DIR)/ggml/include -I$(LLAMA_DIR)/include +LDFLAGS = -L./$(BUILD_DIR)/lib/common -L./$(BUILD_DIR)/lib/ggml/src -L./$(BUILD_DIR)/lib/ggml/src/ggml-blas -L./$(BUILD_DIR)/lib/src -lcommon -lggml -lggml-blas -lggml-base -lggml-cpu -lllama + +# Directories +SRC_DIR = src +DIST_DIR = dist +VPATH = $(SRC_DIR) +BUILD_DIR = build +LLAMA_DIR = modules/llama.cpp + +# Files +SRC_FILES = $(wildcard $(SRC_DIR)/*.c) +OBJ_FILES = $(patsubst %.c, $(BUILD_DIR)/%.o, $(notdir $(SRC_FILES))) +LIBS = $(BUILD_DIR)/lib/common/libcommon.a \ + $(BUILD_DIR)/lib/ggml/src/libggml.a \ + $(BUILD_DIR)/lib/ggml/src/ggml-blas/libggml-blas.a \ + $(BUILD_DIR)/lib/ggml/src/libggml-base.a \ + $(BUILD_DIR)/lib/ggml/src/libggml-cpu.a \ + $(BUILD_DIR)/lib/src/libllama.a + +# Platform-specific settings +ifeq ($(PLATFORM),windows) + TARGET := $(DIST_DIR)/ai.dll + LDFLAGS += -shared + # Create .def file for Windows + DEF_FILE := $(BUILD_DIR)/ai.def +else ifeq ($(PLATFORM),macos) + TARGET := $(DIST_DIR)/ai.dylib + LIBS += $(BUILD_DIR)/lib/ggml/src/ggml-metal/libggml-metal.a + LDFLAGS += -L./$(BUILD_DIR)/lib/ggml/src/ggml-metal -lggml-metal -framework Metal -framework Foundation -framework CoreFoundation -framework QuartzCore -framework Accelerate -dynamiclib -undefined dynamic_lookup + #LDFLAGS += -arch x86_64 -arch arm64 -L./$(BUILD_DIR)/lib/ggml/src/ggml-metal -lggml-metal + #CFLAGS += -arch x86_64 -arch arm64 +else ifeq ($(PLATFORM),android) + # Set ARCH to find Android NDK's Clang compiler, the user should set the ARCH + ifeq ($(filter %,$(ARCH)),) + $(error "Android ARCH must be set to ARCH=x86_64 or ARCH=arm64-v8a") + endif + # 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 + ifeq ($(filter %,$(ANDROID_NDK)),) + $(error "Android NDK must be set") + endif + + BIN = $(ANDROID_NDK)/toolchains/llvm/prebuilt/$(HOST)-x86_64/bin + PATH := $(BIN):$(PATH) + + ifneq (,$(filter $(ARCH),arm64 arm64-v8a)) + override ARCH := aarch64 + endif + + CC = $(BIN)/$(ARCH)-linux-android26-clang + TARGET := $(DIST_DIR)/ai.so + LDFLAGS += -shared +else ifeq ($(PLATFORM),ios) + TARGET := $(DIST_DIR)/ai.dylib + SDK := -isysroot $(shell xcrun --sdk iphoneos --show-sdk-path) -miphoneos-version-min=11.0 + LDFLAGS += -dynamiclib $(SDK) + CFLAGS += -arch arm64 $(SDK) +else ifeq ($(PLATFORM),isim) + TARGET := $(DIST_DIR)/ai.dylib + SDK := -isysroot $(shell xcrun --sdk iphonesimulator --show-sdk-path) -miphonesimulator-version-min=11.0 + LDFLAGS += -arch x86_64 -arch arm64 -dynamiclib $(SDK) + CFLAGS += -arch x86_64 -arch arm64 $(SDK) +else # linux + TARGET := $(DIST_DIR)/ai.so + LDFLAGS += -shared +endif + +# Windows .def file generation +$(DEF_FILE): +ifeq ($(PLATFORM),windows) + @echo "LIBRARY ai.dll" > $@ + @echo "EXPORTS" >> $@ + @echo " sqlite3_ai_init" >> $@ +endif + +# Make sure the build and dist directories exist +$(shell mkdir -p $(BUILD_DIR) $(DIST_DIR)) + +# Default target +extension: $(TARGET) +all: $(TARGET) + +# Loadable library +$(TARGET): $(OBJ_FILES) $(DEF_FILE) $(LIBS) + $(CXX) $(OBJ_FILES) $(DEF_FILE) -o $@ $(LDFLAGS) +ifeq ($(PLATFORM),windows) + # Generate import library for Windows + dlltool -D $@ -d $(DEF_FILE) -l $(DIST_DIR)/ai.lib +endif + +# Object files +$(BUILD_DIR)/%.o: %.c + $(CC) $(CFLAGS) -O3 -fPIC -c $< -o $@ + +test: $(TARGET) + $(SQLITE3) ":memory:" -cmd ".bail on" ".load ./$<" "SELECT ai_version();" + +# Build all libraries at once using one CMake call +build/libs.stamp: + @echo "Building llama.cpp libraries with jobs: $(JOBS)..." + #-DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" + cd $(BUILD_DIR) && \ + cmake -B lib -DBUILD_SHARED_LIBS=OFF ../$(LLAMA_DIR) && \ + cmake --build lib --config Release -- -j$(JOBS) + touch $@ + +$(LIBS): build/libs.stamp + +# Tools +version: + @echo $(shell sed -n 's/^#define SQLITE_AI_VERSION[[:space:]]*"\([^"]*\)".*/\1/p' src/sqlite-ai.h) + +# Clean up generated files +clean: + rm -rf $(BUILD_DIR)/* $(DIST_DIR)/* *.gcda *.gcno *.gcov *.sqlite + +# Help message +help: + @echo "SQLite AI Extension Makefile" + @echo "Usage:" + @echo " make [PLATFORM=platform] [ARCH=arch] [ANDROID_NDK=\$$ANDROID_HOME/ndk/26.1.10909125] [target]" + @echo "" + @echo "Platforms:" + @echo " linux (default on Linux)" + @echo " macos (default on macOS)" + @echo " windows (default on Windows)" + @echo " android (needs ARCH to be set to x86_64 or arm64-v8a and ANDROID_NDK to be set)" + @echo " ios (only on macOS)" + @echo " isim (only on macOS)" + @echo "" + @echo "Targets:" + @echo " all - Build the extension (default)" + @echo " clean - Remove built files" + @echo " test - Test the extension" + @echo " help - Display this help message" + +.PHONY: all clean test extension help From 51ab3ba6565ce55a98045988403b883321483232 Mon Sep 17 00:00:00 2001 From: Gioele Cantoni Date: Tue, 8 Jul 2025 15:30:46 +0200 Subject: [PATCH 02/42] Enable submodule checkout in GitHub Actions workflow --- .github/workflows/main.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d0a130c..2552938 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -49,6 +49,8 @@ jobs: steps: - uses: actions/checkout@v4.2.2 + with: + submodules: true - name: build sqlite-ai run: make extension ${{ matrix.make && matrix.make || ''}} From 0e86213158bdbdbb34c1e5f845d6d3b9c207749e Mon Sep 17 00:00:00 2001 From: Gioele Cantoni Date: Tue, 8 Jul 2025 15:55:43 +0200 Subject: [PATCH 03/42] Update Makefile to use available CPU cores for building libraries --- Makefile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Makefile b/Makefile index a916d26..fe09b62 100644 --- a/Makefile +++ b/Makefile @@ -127,11 +127,10 @@ test: $(TARGET) # Build all libraries at once using one CMake call build/libs.stamp: - @echo "Building llama.cpp libraries with jobs: $(JOBS)..." #-DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" cd $(BUILD_DIR) && \ cmake -B lib -DBUILD_SHARED_LIBS=OFF ../$(LLAMA_DIR) && \ - cmake --build lib --config Release -- -j$(JOBS) + cmake --build lib --config Release -- -j$(CPUS) touch $@ $(LIBS): build/libs.stamp From 6fa5eb3b299b362294c4f9e0cf31b17b652e1179 Mon Sep 17 00:00:00 2001 From: Gioele Cantoni Date: Tue, 8 Jul 2025 16:09:05 +0200 Subject: [PATCH 04/42] Update Makefile for macOS fat library support --- Makefile | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index fe09b62..ab85038 100644 --- a/Makefile +++ b/Makefile @@ -56,9 +56,9 @@ ifeq ($(PLATFORM),windows) else ifeq ($(PLATFORM),macos) TARGET := $(DIST_DIR)/ai.dylib LIBS += $(BUILD_DIR)/lib/ggml/src/ggml-metal/libggml-metal.a - LDFLAGS += -L./$(BUILD_DIR)/lib/ggml/src/ggml-metal -lggml-metal -framework Metal -framework Foundation -framework CoreFoundation -framework QuartzCore -framework Accelerate -dynamiclib -undefined dynamic_lookup - #LDFLAGS += -arch x86_64 -arch arm64 -L./$(BUILD_DIR)/lib/ggml/src/ggml-metal -lggml-metal - #CFLAGS += -arch x86_64 -arch arm64 + LDFLAGS += -arch x86_64 -arch arm64 -L./$(BUILD_DIR)/lib/ggml/src/ggml-metal -lggml-metal -framework Metal -framework Foundation -framework CoreFoundation -framework QuartzCore -framework Accelerate -dynamiclib -undefined dynamic_lookup + CFLAGS += -arch x86_64 -arch arm64 + LLAMA_OPTIONS = -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" else ifeq ($(PLATFORM),android) # Set ARCH to find Android NDK's Clang compiler, the user should set the ARCH ifeq ($(filter %,$(ARCH)),) @@ -127,9 +127,8 @@ test: $(TARGET) # Build all libraries at once using one CMake call build/libs.stamp: - #-DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" cd $(BUILD_DIR) && \ - cmake -B lib -DBUILD_SHARED_LIBS=OFF ../$(LLAMA_DIR) && \ + cmake -B lib -DBUILD_SHARED_LIBS=OFF $(LLAMA_OPTIONS) ../$(LLAMA_DIR) && \ cmake --build lib --config Release -- -j$(CPUS) touch $@ From 837c482131b1748795b5015f59231658b5f4ef92 Mon Sep 17 00:00:00 2001 From: Gioele Cantoni Date: Tue, 8 Jul 2025 16:20:15 +0200 Subject: [PATCH 05/42] Update Makefile for improved macOS, iOS and iSIM support --- Makefile | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index ab85038..7dfa693 100644 --- a/Makefile +++ b/Makefile @@ -29,6 +29,7 @@ CC = gcc CXX = g++ CFLAGS = -Wall -Wextra -Wno-unused-parameter -I$(SRC_DIR) -I$(LLAMA_DIR)/ggml/include -I$(LLAMA_DIR)/include LDFLAGS = -L./$(BUILD_DIR)/lib/common -L./$(BUILD_DIR)/lib/ggml/src -L./$(BUILD_DIR)/lib/ggml/src/ggml-blas -L./$(BUILD_DIR)/lib/src -lcommon -lggml -lggml-blas -lggml-base -lggml-cpu -lllama +LLAMA_OPTIONS = -DLLAMA_CURL=OFF # Directories SRC_DIR = src @@ -58,7 +59,7 @@ else ifeq ($(PLATFORM),macos) LIBS += $(BUILD_DIR)/lib/ggml/src/ggml-metal/libggml-metal.a LDFLAGS += -arch x86_64 -arch arm64 -L./$(BUILD_DIR)/lib/ggml/src/ggml-metal -lggml-metal -framework Metal -framework Foundation -framework CoreFoundation -framework QuartzCore -framework Accelerate -dynamiclib -undefined dynamic_lookup CFLAGS += -arch x86_64 -arch arm64 - LLAMA_OPTIONS = -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" + LLAMA_OPTIONS += -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" else ifeq ($(PLATFORM),android) # Set ARCH to find Android NDK's Clang compiler, the user should set the ARCH ifeq ($(filter %,$(ARCH)),) @@ -85,11 +86,13 @@ else ifeq ($(PLATFORM),ios) SDK := -isysroot $(shell xcrun --sdk iphoneos --show-sdk-path) -miphoneos-version-min=11.0 LDFLAGS += -dynamiclib $(SDK) CFLAGS += -arch arm64 $(SDK) + LLAMA_OPTIONS += -DCMAKE_SYSTEM_NAME=iOS else ifeq ($(PLATFORM),isim) TARGET := $(DIST_DIR)/ai.dylib SDK := -isysroot $(shell xcrun --sdk iphonesimulator --show-sdk-path) -miphonesimulator-version-min=11.0 LDFLAGS += -arch x86_64 -arch arm64 -dynamiclib $(SDK) CFLAGS += -arch x86_64 -arch arm64 $(SDK) + LLAMA_OPTIONS += -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" else # linux TARGET := $(DIST_DIR)/ai.so LDFLAGS += -shared @@ -127,9 +130,8 @@ test: $(TARGET) # Build all libraries at once using one CMake call build/libs.stamp: - cd $(BUILD_DIR) && \ - cmake -B lib -DBUILD_SHARED_LIBS=OFF $(LLAMA_OPTIONS) ../$(LLAMA_DIR) && \ - cmake --build lib --config Release -- -j$(CPUS) + cmake -B $(BUILD_DIR)/lib -DBUILD_SHARED_LIBS=OFF $(LLAMA_OPTIONS) $(LLAMA_DIR) + cmake --build $(BUILD_DIR)/lib --config Release -- -j$(CPUS) touch $@ $(LIBS): build/libs.stamp From cf78a12bba5bf344cccaf529527f038e1490ff8d Mon Sep 17 00:00:00 2001 From: Gioele Cantoni Date: Tue, 8 Jul 2025 17:23:32 +0200 Subject: [PATCH 06/42] Enable BLAS support for Linux platform in Makefile --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 7dfa693..a9e7ff7 100644 --- a/Makefile +++ b/Makefile @@ -96,6 +96,7 @@ else ifeq ($(PLATFORM),isim) else # linux TARGET := $(DIST_DIR)/ai.so LDFLAGS += -shared + LLAMA_OPTIONS += -DGGML_USE_BLAS=ON endif # Windows .def file generation From 2e4be01055aed7a1d14a9d7cdae7153d219835d1 Mon Sep 17 00:00:00 2001 From: Gioele Cantoni Date: Tue, 8 Jul 2025 17:35:38 +0200 Subject: [PATCH 07/42] Update Makefile to remove unnecessary ggml-blas references and ensure proper linking only for macOS --- Makefile | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index a9e7ff7..c8c43eb 100644 --- a/Makefile +++ b/Makefile @@ -28,7 +28,7 @@ MAKEFLAGS += -j$(CPUS) CC = gcc CXX = g++ CFLAGS = -Wall -Wextra -Wno-unused-parameter -I$(SRC_DIR) -I$(LLAMA_DIR)/ggml/include -I$(LLAMA_DIR)/include -LDFLAGS = -L./$(BUILD_DIR)/lib/common -L./$(BUILD_DIR)/lib/ggml/src -L./$(BUILD_DIR)/lib/ggml/src/ggml-blas -L./$(BUILD_DIR)/lib/src -lcommon -lggml -lggml-blas -lggml-base -lggml-cpu -lllama +LDFLAGS = -L./$(BUILD_DIR)/lib/common -L./$(BUILD_DIR)/lib/ggml/src -L./$(BUILD_DIR)/lib/src -lcommon -lggml -lggml-base -lggml-cpu -lllama LLAMA_OPTIONS = -DLLAMA_CURL=OFF # Directories @@ -43,7 +43,6 @@ SRC_FILES = $(wildcard $(SRC_DIR)/*.c) OBJ_FILES = $(patsubst %.c, $(BUILD_DIR)/%.o, $(notdir $(SRC_FILES))) LIBS = $(BUILD_DIR)/lib/common/libcommon.a \ $(BUILD_DIR)/lib/ggml/src/libggml.a \ - $(BUILD_DIR)/lib/ggml/src/ggml-blas/libggml-blas.a \ $(BUILD_DIR)/lib/ggml/src/libggml-base.a \ $(BUILD_DIR)/lib/ggml/src/libggml-cpu.a \ $(BUILD_DIR)/lib/src/libllama.a @@ -56,8 +55,8 @@ ifeq ($(PLATFORM),windows) DEF_FILE := $(BUILD_DIR)/ai.def else ifeq ($(PLATFORM),macos) TARGET := $(DIST_DIR)/ai.dylib - LIBS += $(BUILD_DIR)/lib/ggml/src/ggml-metal/libggml-metal.a - LDFLAGS += -arch x86_64 -arch arm64 -L./$(BUILD_DIR)/lib/ggml/src/ggml-metal -lggml-metal -framework Metal -framework Foundation -framework CoreFoundation -framework QuartzCore -framework Accelerate -dynamiclib -undefined dynamic_lookup + LIBS += $(BUILD_DIR)/lib/ggml/src/ggml-metal/libggml-metal.a $(BUILD_DIR)/lib/ggml/src/ggml-blas/libggml-blas.a + LDFLAGS += -arch x86_64 -arch arm64 -L./$(BUILD_DIR)/lib/ggml/src/ggml-metal -lggml-metal -L./$(BUILD_DIR)/lib/ggml/src/ggml-blas -lggml-blas -framework Metal -framework Foundation -framework CoreFoundation -framework QuartzCore -framework Accelerate -dynamiclib -undefined dynamic_lookup CFLAGS += -arch x86_64 -arch arm64 LLAMA_OPTIONS += -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" else ifeq ($(PLATFORM),android) @@ -96,7 +95,6 @@ else ifeq ($(PLATFORM),isim) else # linux TARGET := $(DIST_DIR)/ai.so LDFLAGS += -shared - LLAMA_OPTIONS += -DGGML_USE_BLAS=ON endif # Windows .def file generation From 1413190ade03033b384d8d23a1a6752c470715a9 Mon Sep 17 00:00:00 2001 From: Gioele Cantoni Date: Tue, 8 Jul 2025 18:12:47 +0200 Subject: [PATCH 08/42] Update Makefile to enhance library linking and deployment targets for macOS, iOS, iSIM and Linux --- Makefile | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/Makefile b/Makefile index c8c43eb..f0571c6 100644 --- a/Makefile +++ b/Makefile @@ -28,8 +28,8 @@ MAKEFLAGS += -j$(CPUS) CC = gcc CXX = g++ CFLAGS = -Wall -Wextra -Wno-unused-parameter -I$(SRC_DIR) -I$(LLAMA_DIR)/ggml/include -I$(LLAMA_DIR)/include -LDFLAGS = -L./$(BUILD_DIR)/lib/common -L./$(BUILD_DIR)/lib/ggml/src -L./$(BUILD_DIR)/lib/src -lcommon -lggml -lggml-base -lggml-cpu -lllama -LLAMA_OPTIONS = -DLLAMA_CURL=OFF +LDFLAGS = -L./$(BUILD_DIR)/lib/common -L./$(BUILD_DIR)/lib/ggml/src -L./$(BUILD_DIR)/lib/ggml/src/ggml-blas -L./$(BUILD_DIR)/lib/src -lcommon -lggml -lggml-blas -lggml-base -lggml-cpu -lllama +LLAMA_OPTIONS = -DLLAMA_CURL=OFF -DLLAMA_BUILD_EXAMPLES=OFF -DLLAMA_BUILD_TESTS=OFF -DLLAMA_BUILD_TOOLS=OFF -DLLAMA_BUILD_SERVER=OFF # Directories SRC_DIR = src @@ -43,6 +43,7 @@ SRC_FILES = $(wildcard $(SRC_DIR)/*.c) OBJ_FILES = $(patsubst %.c, $(BUILD_DIR)/%.o, $(notdir $(SRC_FILES))) LIBS = $(BUILD_DIR)/lib/common/libcommon.a \ $(BUILD_DIR)/lib/ggml/src/libggml.a \ + $(BUILD_DIR)/lib/ggml/src/ggml-blas/libggml-blas.a \ $(BUILD_DIR)/lib/ggml/src/libggml-base.a \ $(BUILD_DIR)/lib/ggml/src/libggml-cpu.a \ $(BUILD_DIR)/lib/src/libllama.a @@ -55,8 +56,8 @@ ifeq ($(PLATFORM),windows) DEF_FILE := $(BUILD_DIR)/ai.def else ifeq ($(PLATFORM),macos) TARGET := $(DIST_DIR)/ai.dylib - LIBS += $(BUILD_DIR)/lib/ggml/src/ggml-metal/libggml-metal.a $(BUILD_DIR)/lib/ggml/src/ggml-blas/libggml-blas.a - LDFLAGS += -arch x86_64 -arch arm64 -L./$(BUILD_DIR)/lib/ggml/src/ggml-metal -lggml-metal -L./$(BUILD_DIR)/lib/ggml/src/ggml-blas -lggml-blas -framework Metal -framework Foundation -framework CoreFoundation -framework QuartzCore -framework Accelerate -dynamiclib -undefined dynamic_lookup + LIBS += $(BUILD_DIR)/lib/ggml/src/ggml-metal/libggml-metal.a + LDFLAGS += -arch x86_64 -arch arm64 -L./$(BUILD_DIR)/lib/ggml/src/ggml-metal -lggml-metal -framework Metal -framework Foundation -framework CoreFoundation -framework QuartzCore -framework Accelerate -dynamiclib -undefined dynamic_lookup CFLAGS += -arch x86_64 -arch arm64 LLAMA_OPTIONS += -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" else ifeq ($(PLATFORM),android) @@ -82,19 +83,20 @@ else ifeq ($(PLATFORM),android) LDFLAGS += -shared else ifeq ($(PLATFORM),ios) TARGET := $(DIST_DIR)/ai.dylib - SDK := -isysroot $(shell xcrun --sdk iphoneos --show-sdk-path) -miphoneos-version-min=11.0 - LDFLAGS += -dynamiclib $(SDK) + SDK := -isysroot $(shell xcrun --sdk iphoneos --show-sdk-path) -miphoneos-version-min=14.0 + LDFLAGS += -framework Accelerate -framework Metal -dynamiclib $(SDK) CFLAGS += -arch arm64 $(SDK) - LLAMA_OPTIONS += -DCMAKE_SYSTEM_NAME=iOS + LLAMA_OPTIONS += -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 else ifeq ($(PLATFORM),isim) TARGET := $(DIST_DIR)/ai.dylib - SDK := -isysroot $(shell xcrun --sdk iphonesimulator --show-sdk-path) -miphonesimulator-version-min=11.0 - LDFLAGS += -arch x86_64 -arch arm64 -dynamiclib $(SDK) + SDK := -isysroot $(shell xcrun --sdk iphonesimulator --show-sdk-path) -miphonesimulator-version-min=14.0 + LDFLAGS += -arch x86_64 -arch arm64 -framework Accelerate -framework Metal -dynamiclib $(SDK) CFLAGS += -arch x86_64 -arch arm64 $(SDK) - LLAMA_OPTIONS += -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" + LLAMA_OPTIONS += -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" else # linux TARGET := $(DIST_DIR)/ai.so LDFLAGS += -shared + LLAMA_OPTIONS += -DCMAKE_POSITION_INDEPENDENT_CODE=ON endif # Windows .def file generation From 0bf7e25670a4b5536492644dd3f6fe56e79f4233 Mon Sep 17 00:00:00 2001 From: Gioele Cantoni Date: Tue, 8 Jul 2025 19:16:05 +0200 Subject: [PATCH 09/42] Update Makefile to improve library linking for LLAMA and WHISPER, and enhance platform-specific options for macOS, iOS, Android, Linux and iSIM --- Makefile | 46 +++++++++++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/Makefile b/Makefile index f0571c6..d0e95dc 100644 --- a/Makefile +++ b/Makefile @@ -28,8 +28,9 @@ MAKEFLAGS += -j$(CPUS) CC = gcc CXX = g++ CFLAGS = -Wall -Wextra -Wno-unused-parameter -I$(SRC_DIR) -I$(LLAMA_DIR)/ggml/include -I$(LLAMA_DIR)/include -LDFLAGS = -L./$(BUILD_DIR)/lib/common -L./$(BUILD_DIR)/lib/ggml/src -L./$(BUILD_DIR)/lib/ggml/src/ggml-blas -L./$(BUILD_DIR)/lib/src -lcommon -lggml -lggml-blas -lggml-base -lggml-cpu -lllama +LDFLAGS = -L./$(BUILD_LLAMA)/common -L./$(BUILD_LLAMA)/ggml/src -L./$(BUILD_LLAMA)/src -L./$(BUILD_WHISPER)/src -lcommon -lggml -lggml-base -lggml-cpu -lllama -lwhisper LLAMA_OPTIONS = -DLLAMA_CURL=OFF -DLLAMA_BUILD_EXAMPLES=OFF -DLLAMA_BUILD_TESTS=OFF -DLLAMA_BUILD_TOOLS=OFF -DLLAMA_BUILD_SERVER=OFF +WHISPER_OPTIONS = -DWHISPER_BUILD_EXAMPLES=OFF -DWHISPER_BUILD_TESTS=OFF -DWHISPER_BUILD_SERVER=OFF # Directories SRC_DIR = src @@ -37,16 +38,15 @@ DIST_DIR = dist VPATH = $(SRC_DIR) BUILD_DIR = build LLAMA_DIR = modules/llama.cpp +WHISPER_DIR = modules/whisper.cpp +BUILD_LLAMA = $(BUILD_DIR)/llama.cpp +BUILD_WHISPER = $(BUILD_DIR)/whisper.cpp # Files SRC_FILES = $(wildcard $(SRC_DIR)/*.c) OBJ_FILES = $(patsubst %.c, $(BUILD_DIR)/%.o, $(notdir $(SRC_FILES))) -LIBS = $(BUILD_DIR)/lib/common/libcommon.a \ - $(BUILD_DIR)/lib/ggml/src/libggml.a \ - $(BUILD_DIR)/lib/ggml/src/ggml-blas/libggml-blas.a \ - $(BUILD_DIR)/lib/ggml/src/libggml-base.a \ - $(BUILD_DIR)/lib/ggml/src/libggml-cpu.a \ - $(BUILD_DIR)/lib/src/libllama.a +LLAMA_LIBS = $(BUILD_LLAMA)/common/libcommon.a $(BUILD_LLAMA)/ggml/src/libggml.a $(BUILD_LLAMA)/ggml/src/libggml-base.a $(BUILD_LLAMA)/ggml/src/libggml-cpu.a $(BUILD_LLAMA)/src/libllama.a +WHISPER_LIBS = $(BUILD_WHISPER)/src/libwhisper.a # Platform-specific settings ifeq ($(PLATFORM),windows) @@ -56,10 +56,11 @@ ifeq ($(PLATFORM),windows) DEF_FILE := $(BUILD_DIR)/ai.def else ifeq ($(PLATFORM),macos) TARGET := $(DIST_DIR)/ai.dylib - LIBS += $(BUILD_DIR)/lib/ggml/src/ggml-metal/libggml-metal.a - LDFLAGS += -arch x86_64 -arch arm64 -L./$(BUILD_DIR)/lib/ggml/src/ggml-metal -lggml-metal -framework Metal -framework Foundation -framework CoreFoundation -framework QuartzCore -framework Accelerate -dynamiclib -undefined dynamic_lookup + LLAMA_LIBS += $(BUILD_LLAMA)/ggml/src/ggml-metal/libggml-metal.a $(BUILD_LLAMA)/ggml/src/ggml-blas/libggml-blas.a + LDFLAGS += -arch x86_64 -arch arm64 -L./$(BUILD_LLAMA)/ggml/src/ggml-metal -lggml-metal -L./$(BUILD_LLAMA)/ggml/src/ggml-blas -lggml-blas -framework Metal -framework Foundation -framework CoreFoundation -framework QuartzCore -framework Accelerate -dynamiclib -undefined dynamic_lookup CFLAGS += -arch x86_64 -arch arm64 LLAMA_OPTIONS += -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" + WHISPER_OPTIONS += -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" else ifeq ($(PLATFORM),android) # Set ARCH to find Android NDK's Clang compiler, the user should set the ARCH ifeq ($(filter %,$(ARCH)),) @@ -84,19 +85,24 @@ else ifeq ($(PLATFORM),android) else ifeq ($(PLATFORM),ios) TARGET := $(DIST_DIR)/ai.dylib SDK := -isysroot $(shell xcrun --sdk iphoneos --show-sdk-path) -miphoneos-version-min=14.0 - LDFLAGS += -framework Accelerate -framework Metal -dynamiclib $(SDK) + LLAMA_LIBS += $(BUILD_LLAMA)/ggml/src/ggml-metal/libggml-metal.a $(BUILD_LLAMA)/ggml/src/ggml-blas/libggml-blas.a + LDFLAGS += -L./$(BUILD_LLAMA)/ggml/src/ggml-metal -lggml-metal -L./$(BUILD_LLAMA)/ggml/src/ggml-blas -lggml-blas -framework Accelerate -framework Metal -framework Foundation -dynamiclib $(SDK) CFLAGS += -arch arm64 $(SDK) LLAMA_OPTIONS += -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 + WHISPER_OPTIONS += -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 else ifeq ($(PLATFORM),isim) TARGET := $(DIST_DIR)/ai.dylib SDK := -isysroot $(shell xcrun --sdk iphonesimulator --show-sdk-path) -miphonesimulator-version-min=14.0 - LDFLAGS += -arch x86_64 -arch arm64 -framework Accelerate -framework Metal -dynamiclib $(SDK) + LLAMA_LIBS += $(BUILD_LLAMA)/ggml/src/ggml-metal/libggml-metal.a $(BUILD_LLAMA)/ggml/src/ggml-blas/libggml-blas.a + LDFLAGS += -arch x86_64 -arch arm64 -L./$(BUILD_LLAMA)/ggml/src/ggml-metal -lggml-metal -L./$(BUILD_LLAMA)/ggml/src/ggml-blas -lggml-blas -framework Accelerate -framework Metal -framework Foundation -dynamiclib $(SDK) CFLAGS += -arch x86_64 -arch arm64 $(SDK) - LLAMA_OPTIONS += -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" + LLAMA_OPTIONS += -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" + WHISPER_OPTIONS += -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" else # linux TARGET := $(DIST_DIR)/ai.so LDFLAGS += -shared LLAMA_OPTIONS += -DCMAKE_POSITION_INDEPENDENT_CODE=ON + WHISPER_OPTIONS += -DCMAKE_POSITION_INDEPENDENT_CODE=ON endif # Windows .def file generation @@ -115,7 +121,7 @@ extension: $(TARGET) all: $(TARGET) # Loadable library -$(TARGET): $(OBJ_FILES) $(DEF_FILE) $(LIBS) +$(TARGET): $(OBJ_FILES) $(DEF_FILE) $(LLAMA_LIBS) $(WHISPER_LIBS) $(CXX) $(OBJ_FILES) $(DEF_FILE) -o $@ $(LDFLAGS) ifeq ($(PLATFORM),windows) # Generate import library for Windows @@ -130,12 +136,18 @@ test: $(TARGET) $(SQLITE3) ":memory:" -cmd ".bail on" ".load ./$<" "SELECT ai_version();" # Build all libraries at once using one CMake call -build/libs.stamp: - cmake -B $(BUILD_DIR)/lib -DBUILD_SHARED_LIBS=OFF $(LLAMA_OPTIONS) $(LLAMA_DIR) - cmake --build $(BUILD_DIR)/lib --config Release -- -j$(CPUS) +build/llama.cpp.stamp: + cmake -B $(BUILD_LLAMA) -DBUILD_SHARED_LIBS=OFF $(LLAMA_OPTIONS) $(LLAMA_DIR) + cmake --build $(BUILD_LLAMA) --config Release -- -j$(CPUS) touch $@ -$(LIBS): build/libs.stamp +build/whisper.cpp.stamp: + cmake -B $(BUILD_WHISPER) -DBUILD_SHARED_LIBS=OFF $(WHISPER_OPTIONS) $(WHISPER_DIR) + cmake --build $(BUILD_WHISPER) --config Release -- -j$(CPUS) + touch $@ + +$(LLAMA_LIBS): build/llama.cpp.stamp +$(WHISPER_LIBS): build/whisper.cpp.stamp # Tools version: From 346c7c1f66683c7bf40d46ea710c5c01ff29731a Mon Sep 17 00:00:00 2001 From: Gioele Cantoni Date: Tue, 8 Jul 2025 19:21:07 +0200 Subject: [PATCH 10/42] Fix Makefile build submodules on Windows --- Makefile | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index d0e95dc..6dbccc4 100644 --- a/Makefile +++ b/Makefile @@ -135,15 +135,18 @@ $(BUILD_DIR)/%.o: %.c test: $(TARGET) $(SQLITE3) ":memory:" -cmd ".bail on" ".load ./$<" "SELECT ai_version();" -# Build all libraries at once using one CMake call +# Build submodules +ifneq ($(PLATFORM),windows) +BUILD_OPTIONS = -- -j$(CPUS) +endif build/llama.cpp.stamp: cmake -B $(BUILD_LLAMA) -DBUILD_SHARED_LIBS=OFF $(LLAMA_OPTIONS) $(LLAMA_DIR) - cmake --build $(BUILD_LLAMA) --config Release -- -j$(CPUS) + cmake --build $(BUILD_LLAMA) --config Release $(BUILD_OPTIONS) touch $@ build/whisper.cpp.stamp: cmake -B $(BUILD_WHISPER) -DBUILD_SHARED_LIBS=OFF $(WHISPER_OPTIONS) $(WHISPER_DIR) - cmake --build $(BUILD_WHISPER) --config Release -- -j$(CPUS) + cmake --build $(BUILD_WHISPER) --config Release $(BUILD_OPTIONS) touch $@ $(LLAMA_LIBS): build/llama.cpp.stamp From 6b729075570d42a5edd18f9be6d300c093e38ad2 Mon Sep 17 00:00:00 2001 From: Gioele Cantoni Date: Tue, 8 Jul 2025 19:23:16 +0200 Subject: [PATCH 11/42] Update Makefile to enable position-independent code for LLAMA and WHISPER on Android platform --- Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Makefile b/Makefile index 6dbccc4..219234a 100644 --- a/Makefile +++ b/Makefile @@ -82,6 +82,8 @@ else ifeq ($(PLATFORM),android) CC = $(BIN)/$(ARCH)-linux-android26-clang TARGET := $(DIST_DIR)/ai.so LDFLAGS += -shared + LLAMA_OPTIONS += -DCMAKE_POSITION_INDEPENDENT_CODE=ON + WHISPER_OPTIONS += -DCMAKE_POSITION_INDEPENDENT_CODE=ON else ifeq ($(PLATFORM),ios) TARGET := $(DIST_DIR)/ai.dylib SDK := -isysroot $(shell xcrun --sdk iphoneos --show-sdk-path) -miphoneos-version-min=14.0 From 0439ecf315d4b2da2fd25949f3a57eb628dfbc53 Mon Sep 17 00:00:00 2001 From: Gioele Cantoni Date: Tue, 8 Jul 2025 19:24:20 +0200 Subject: [PATCH 12/42] Fix test command in Makefile to load the correct AI module from the dist directory --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 219234a..43fbb38 100644 --- a/Makefile +++ b/Makefile @@ -135,7 +135,7 @@ $(BUILD_DIR)/%.o: %.c $(CC) $(CFLAGS) -O3 -fPIC -c $< -o $@ test: $(TARGET) - $(SQLITE3) ":memory:" -cmd ".bail on" ".load ./$<" "SELECT ai_version();" + $(SQLITE3) ":memory:" -cmd ".bail on" ".load ./dist/ai" "SELECT ai_version();" # Build submodules ifneq ($(PLATFORM),windows) From 2c5eb69b1c9cd46bd29a096bcbefdc7a55009d4c Mon Sep 17 00:00:00 2001 From: Gioele Cantoni Date: Tue, 8 Jul 2025 19:39:31 +0200 Subject: [PATCH 13/42] Update Makefile for Android platform to include toolchain and architecture-specific flags --- Makefile | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 43fbb38..3170ee9 100644 --- a/Makefile +++ b/Makefile @@ -80,10 +80,12 @@ else ifeq ($(PLATFORM),android) endif CC = $(BIN)/$(ARCH)-linux-android26-clang + CXX = $(CC)++ TARGET := $(DIST_DIR)/ai.so LDFLAGS += -shared - LLAMA_OPTIONS += -DCMAKE_POSITION_INDEPENDENT_CODE=ON - WHISPER_OPTIONS += -DCMAKE_POSITION_INDEPENDENT_CODE=ON + LLAMA_OPTIONS += -DCMAKE_TOOLCHAIN_FILE=$(ANDROID_NDK)/build/cmake/android.toolchain.cmake -DANDROID_ABI=$(if $(filter aarch64,$(ARCH)),arm64-v8a,$(ARCH)) -DANDROID_PLATFORM=android-26 -DCMAKE_C_FLAGS="-march=armv8.7a" -DCMAKE_CXX_FLAGS="-march=armv8.7a" -DGGML_OPENMP=OFF -DGGML_LLAMAFILE=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON + WHISPER_OPTIONS += -DCMAKE_TOOLCHAIN_FILE=$(ANDROID_NDK)/build/cmake/android.toolchain.cmake -DANDROID_ABI=$(if $(filter aarch64,$(ARCH)),arm64-v8a,$(ARCH)) -DANDROID_PLATFORM=android-26 -DCMAKE_C_FLAGS="-march=armv8.7a" -DCMAKE_CXX_FLAGS="-march=armv8.7a" -DGGML_OPENMP=OFF -DGGML_LLAMAFILE=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON + else ifeq ($(PLATFORM),ios) TARGET := $(DIST_DIR)/ai.dylib SDK := -isysroot $(shell xcrun --sdk iphoneos --show-sdk-path) -miphoneos-version-min=14.0 From b8fa193c8b6937c765b8cc64c18ae0e3135af3da Mon Sep 17 00:00:00 2001 From: Gioele Cantoni Date: Tue, 8 Jul 2025 19:45:15 +0200 Subject: [PATCH 14/42] Update Makefile for Android platform to adjust architecture-specific flags --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 3170ee9..a18cf5a 100644 --- a/Makefile +++ b/Makefile @@ -83,8 +83,8 @@ else ifeq ($(PLATFORM),android) CXX = $(CC)++ TARGET := $(DIST_DIR)/ai.so LDFLAGS += -shared - LLAMA_OPTIONS += -DCMAKE_TOOLCHAIN_FILE=$(ANDROID_NDK)/build/cmake/android.toolchain.cmake -DANDROID_ABI=$(if $(filter aarch64,$(ARCH)),arm64-v8a,$(ARCH)) -DANDROID_PLATFORM=android-26 -DCMAKE_C_FLAGS="-march=armv8.7a" -DCMAKE_CXX_FLAGS="-march=armv8.7a" -DGGML_OPENMP=OFF -DGGML_LLAMAFILE=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON - WHISPER_OPTIONS += -DCMAKE_TOOLCHAIN_FILE=$(ANDROID_NDK)/build/cmake/android.toolchain.cmake -DANDROID_ABI=$(if $(filter aarch64,$(ARCH)),arm64-v8a,$(ARCH)) -DANDROID_PLATFORM=android-26 -DCMAKE_C_FLAGS="-march=armv8.7a" -DCMAKE_CXX_FLAGS="-march=armv8.7a" -DGGML_OPENMP=OFF -DGGML_LLAMAFILE=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON + LLAMA_OPTIONS += -DCMAKE_TOOLCHAIN_FILE=$(ANDROID_NDK)/build/cmake/android.toolchain.cmake -DANDROID_ABI=$(if $(filter aarch64,$(ARCH)),arm64-v8a,$(ARCH)) -DANDROID_PLATFORM=android-26 -DCMAKE_C_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,$(ARCH))" -DCMAKE_CXX_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,$(ARCH))" -DGGML_OPENMP=OFF -DGGML_LLAMAFILE=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON + WHISPER_OPTIONS += -DCMAKE_TOOLCHAIN_FILE=$(ANDROID_NDK)/build/cmake/android.toolchain.cmake -DANDROID_ABI=$(if $(filter aarch64,$(ARCH)),arm64-v8a,$(ARCH)) -DANDROID_PLATFORM=android-26 -DCMAKE_C_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,$(ARCH))" -DCMAKE_CXX_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,$(ARCH))" -DGGML_OPENMP=OFF -DGGML_LLAMAFILE=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON else ifeq ($(PLATFORM),ios) TARGET := $(DIST_DIR)/ai.dylib From f0e0c59c7418732268a45674520181b22b06339d Mon Sep 17 00:00:00 2001 From: Gioele Cantoni Date: Tue, 8 Jul 2025 19:50:19 +0200 Subject: [PATCH 15/42] Update Makefile and GitHub Actions workflow for Windows compatibility --- .github/workflows/main.yml | 8 ++++++++ Makefile | 7 ++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 2552938..7c5b2ae 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -52,6 +52,14 @@ jobs: with: submodules: true + - uses: msys2/setup-msys2@v2.27.0 + if: matrix.os == 'windows-latest' + with: + msystem: mingw64 + install: >- + mingw-w64-x86_64-cc + make + - name: build sqlite-ai run: make extension ${{ matrix.make && matrix.make || ''}} diff --git a/Makefile b/Makefile index a18cf5a..3c6e76d 100644 --- a/Makefile +++ b/Makefile @@ -140,17 +140,14 @@ test: $(TARGET) $(SQLITE3) ":memory:" -cmd ".bail on" ".load ./dist/ai" "SELECT ai_version();" # Build submodules -ifneq ($(PLATFORM),windows) -BUILD_OPTIONS = -- -j$(CPUS) -endif build/llama.cpp.stamp: cmake -B $(BUILD_LLAMA) -DBUILD_SHARED_LIBS=OFF $(LLAMA_OPTIONS) $(LLAMA_DIR) - cmake --build $(BUILD_LLAMA) --config Release $(BUILD_OPTIONS) + cmake --build $(BUILD_LLAMA) --config Release -- -j$(CPUS) touch $@ build/whisper.cpp.stamp: cmake -B $(BUILD_WHISPER) -DBUILD_SHARED_LIBS=OFF $(WHISPER_OPTIONS) $(WHISPER_DIR) - cmake --build $(BUILD_WHISPER) --config Release $(BUILD_OPTIONS) + cmake --build $(BUILD_WHISPER) --config Release -- -j$(CPUS) touch $@ $(LLAMA_LIBS): build/llama.cpp.stamp From ebdbacb6a941bdd41a056e237f1ee81a59a2d9df Mon Sep 17 00:00:00 2001 From: Gioele Cantoni Date: Tue, 8 Jul 2025 19:52:51 +0200 Subject: [PATCH 16/42] Update Makefile for Android platform to adjust architecture-specific flags for x86-64 --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 3c6e76d..faa6b41 100644 --- a/Makefile +++ b/Makefile @@ -83,8 +83,8 @@ else ifeq ($(PLATFORM),android) CXX = $(CC)++ TARGET := $(DIST_DIR)/ai.so LDFLAGS += -shared - LLAMA_OPTIONS += -DCMAKE_TOOLCHAIN_FILE=$(ANDROID_NDK)/build/cmake/android.toolchain.cmake -DANDROID_ABI=$(if $(filter aarch64,$(ARCH)),arm64-v8a,$(ARCH)) -DANDROID_PLATFORM=android-26 -DCMAKE_C_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,$(ARCH))" -DCMAKE_CXX_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,$(ARCH))" -DGGML_OPENMP=OFF -DGGML_LLAMAFILE=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON - WHISPER_OPTIONS += -DCMAKE_TOOLCHAIN_FILE=$(ANDROID_NDK)/build/cmake/android.toolchain.cmake -DANDROID_ABI=$(if $(filter aarch64,$(ARCH)),arm64-v8a,$(ARCH)) -DANDROID_PLATFORM=android-26 -DCMAKE_C_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,$(ARCH))" -DCMAKE_CXX_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,$(ARCH))" -DGGML_OPENMP=OFF -DGGML_LLAMAFILE=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON + LLAMA_OPTIONS += -DCMAKE_TOOLCHAIN_FILE=$(ANDROID_NDK)/build/cmake/android.toolchain.cmake -DANDROID_ABI=$(if $(filter aarch64,$(ARCH)),arm64-v8a,$(ARCH)) -DANDROID_PLATFORM=android-26 -DCMAKE_C_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,x86-64)" -DCMAKE_CXX_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,x86-64)" -DGGML_OPENMP=OFF -DGGML_LLAMAFILE=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON + WHISPER_OPTIONS += -DCMAKE_TOOLCHAIN_FILE=$(ANDROID_NDK)/build/cmake/android.toolchain.cmake -DANDROID_ABI=$(if $(filter aarch64,$(ARCH)),arm64-v8a,$(ARCH)) -DANDROID_PLATFORM=android-26 -DCMAKE_C_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,x86-64)" -DCMAKE_CXX_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,x86-64)" -DGGML_OPENMP=OFF -DGGML_LLAMAFILE=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON else ifeq ($(PLATFORM),ios) TARGET := $(DIST_DIR)/ai.dylib From 4ada3fbd7fe8bf0a0d49d9d64153be07cbec57bc Mon Sep 17 00:00:00 2001 From: Gioele Cantoni Date: Tue, 8 Jul 2025 19:54:44 +0200 Subject: [PATCH 17/42] Add separate build step for Windows in GitHub Actions workflow --- .github/workflows/main.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 7c5b2ae..afac6a6 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -60,7 +60,13 @@ jobs: mingw-w64-x86_64-cc make + - name: windows build sqlite-ai + if: matrix.name == 'windows' + run: make extension ${{ matrix.make && matrix.make || ''}} + shell: msys2 {0} + - name: build sqlite-ai + if: matrix.name != 'windows' run: make extension ${{ matrix.make && matrix.make || ''}} - name: windows install sqlite3 From 9d4bcd6a95a3bc432307773d11bebf4119c1ac2d Mon Sep 17 00:00:00 2001 From: Gioele Cantoni Date: Tue, 8 Jul 2025 19:58:47 +0200 Subject: [PATCH 18/42] Add CMake installation for Windows build in GitHub Actions workflow --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index afac6a6..3e8b935 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -58,6 +58,7 @@ jobs: msystem: mingw64 install: >- mingw-w64-x86_64-cc + mingw-w64-x86_64-cmake make - name: windows build sqlite-ai From 6dbfe2f300131c3a1991036a521f076917dce326 Mon Sep 17 00:00:00 2001 From: Gioele Cantoni Date: Tue, 8 Jul 2025 20:03:32 +0200 Subject: [PATCH 19/42] Update Makefile to enable Vulkan and OpenMP for Linux builds --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index faa6b41..76fd2da 100644 --- a/Makefile +++ b/Makefile @@ -105,8 +105,8 @@ else ifeq ($(PLATFORM),isim) else # linux TARGET := $(DIST_DIR)/ai.so LDFLAGS += -shared - LLAMA_OPTIONS += -DCMAKE_POSITION_INDEPENDENT_CODE=ON - WHISPER_OPTIONS += -DCMAKE_POSITION_INDEPENDENT_CODE=ON + LLAMA_OPTIONS += -DGGML_VULKAN=ON -DGGML_OPENMP=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON + WHISPER_OPTIONS += -DGGML_VULKAN=ON -DGGML_OPENMP=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON endif # Windows .def file generation From e45515b109323d56f2fbfa089a9a66007682e2c8 Mon Sep 17 00:00:00 2001 From: Gioele Cantoni Date: Tue, 8 Jul 2025 20:05:09 +0200 Subject: [PATCH 20/42] Remove Vulkan option from Linux build in Makefile --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 76fd2da..b068434 100644 --- a/Makefile +++ b/Makefile @@ -105,8 +105,8 @@ else ifeq ($(PLATFORM),isim) else # linux TARGET := $(DIST_DIR)/ai.so LDFLAGS += -shared - LLAMA_OPTIONS += -DGGML_VULKAN=ON -DGGML_OPENMP=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON - WHISPER_OPTIONS += -DGGML_VULKAN=ON -DGGML_OPENMP=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON + LLAMA_OPTIONS += -DGGML_OPENMP=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON + WHISPER_OPTIONS += -DGGML_OPENMP=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON endif # Windows .def file generation From 24f4d0159e0ce050c983be78b46a321e54fcd6b4 Mon Sep 17 00:00:00 2001 From: Gioele Cantoni Date: Tue, 8 Jul 2025 20:08:54 +0200 Subject: [PATCH 21/42] Remove OpenSSL folder cleanup from Android build process --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3e8b935..17048f9 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -94,7 +94,7 @@ jobs: 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-* + rm -rf sqlite-amalgamation-*.zip sqlite-amalgamation-* openssl echo "::endgroup::" echo "::group::prepare the test script" From 68c1bef343a3a912a9d10a2da9ed4818b52a0f06 Mon Sep 17 00:00:00 2001 From: Gioele Cantoni Date: Tue, 8 Jul 2025 20:31:20 +0200 Subject: [PATCH 22/42] Enable CoreML support in macOS and iOS builds in Makefile --- Makefile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index b068434..1a99cde 100644 --- a/Makefile +++ b/Makefile @@ -57,10 +57,10 @@ ifeq ($(PLATFORM),windows) else ifeq ($(PLATFORM),macos) TARGET := $(DIST_DIR)/ai.dylib LLAMA_LIBS += $(BUILD_LLAMA)/ggml/src/ggml-metal/libggml-metal.a $(BUILD_LLAMA)/ggml/src/ggml-blas/libggml-blas.a - LDFLAGS += -arch x86_64 -arch arm64 -L./$(BUILD_LLAMA)/ggml/src/ggml-metal -lggml-metal -L./$(BUILD_LLAMA)/ggml/src/ggml-blas -lggml-blas -framework Metal -framework Foundation -framework CoreFoundation -framework QuartzCore -framework Accelerate -dynamiclib -undefined dynamic_lookup + LDFLAGS += -arch x86_64 -arch arm64 -L./$(BUILD_LLAMA)/ggml/src/ggml-metal -lggml-metal -L./$(BUILD_LLAMA)/ggml/src/ggml-blas -lggml-blas -framework Metal -framework Foundation -framework CoreFoundation -framework QuartzCore -framework Accelerate -framework CoreML -dynamiclib -undefined dynamic_lookup CFLAGS += -arch x86_64 -arch arm64 LLAMA_OPTIONS += -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" - WHISPER_OPTIONS += -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" + WHISPER_OPTIONS += -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" -DWHISPER_COREML=ON else ifeq ($(PLATFORM),android) # Set ARCH to find Android NDK's Clang compiler, the user should set the ARCH ifeq ($(filter %,$(ARCH)),) @@ -90,18 +90,18 @@ else ifeq ($(PLATFORM),ios) TARGET := $(DIST_DIR)/ai.dylib SDK := -isysroot $(shell xcrun --sdk iphoneos --show-sdk-path) -miphoneos-version-min=14.0 LLAMA_LIBS += $(BUILD_LLAMA)/ggml/src/ggml-metal/libggml-metal.a $(BUILD_LLAMA)/ggml/src/ggml-blas/libggml-blas.a - LDFLAGS += -L./$(BUILD_LLAMA)/ggml/src/ggml-metal -lggml-metal -L./$(BUILD_LLAMA)/ggml/src/ggml-blas -lggml-blas -framework Accelerate -framework Metal -framework Foundation -dynamiclib $(SDK) + LDFLAGS += -L./$(BUILD_LLAMA)/ggml/src/ggml-metal -lggml-metal -L./$(BUILD_LLAMA)/ggml/src/ggml-blas -lggml-blas -framework Accelerate -framework Metal -framework Foundation -framework CoreML -dynamiclib $(SDK) CFLAGS += -arch arm64 $(SDK) LLAMA_OPTIONS += -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 - WHISPER_OPTIONS += -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 + WHISPER_OPTIONS += -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 -DWHISPER_COREML=ON else ifeq ($(PLATFORM),isim) TARGET := $(DIST_DIR)/ai.dylib SDK := -isysroot $(shell xcrun --sdk iphonesimulator --show-sdk-path) -miphonesimulator-version-min=14.0 LLAMA_LIBS += $(BUILD_LLAMA)/ggml/src/ggml-metal/libggml-metal.a $(BUILD_LLAMA)/ggml/src/ggml-blas/libggml-blas.a - LDFLAGS += -arch x86_64 -arch arm64 -L./$(BUILD_LLAMA)/ggml/src/ggml-metal -lggml-metal -L./$(BUILD_LLAMA)/ggml/src/ggml-blas -lggml-blas -framework Accelerate -framework Metal -framework Foundation -dynamiclib $(SDK) + LDFLAGS += -arch x86_64 -arch arm64 -L./$(BUILD_LLAMA)/ggml/src/ggml-metal -lggml-metal -L./$(BUILD_LLAMA)/ggml/src/ggml-blas -lggml-blas -framework Accelerate -framework Metal -framework Foundation -framework CoreML -dynamiclib $(SDK) CFLAGS += -arch x86_64 -arch arm64 $(SDK) LLAMA_OPTIONS += -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" - WHISPER_OPTIONS += -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" + WHISPER_OPTIONS += -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" -DWHISPER_COREML=ON else # linux TARGET := $(DIST_DIR)/ai.so LDFLAGS += -shared From add42b23033ed9e194116862ba5a2db2df3f9cef Mon Sep 17 00:00:00 2001 From: Gioele Cantoni Date: Wed, 9 Jul 2025 01:17:16 +0200 Subject: [PATCH 23/42] Cleanup unused folders in Android test process to save space and avoid emulator errors --- .github/workflows/main.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 17048f9..7be0ce6 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -94,7 +94,7 @@ jobs: 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-* openssl + rm -rf sqlite-amalgamation-*.zip sqlite-amalgamation-* echo "::endgroup::" echo "::group::prepare the test script" @@ -104,6 +104,8 @@ jobs: 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 From a6adb8455e8455eb3af4d025e43e04e431c41835 Mon Sep 17 00:00:00 2001 From: Gioele Cantoni Date: Wed, 9 Jul 2025 01:22:34 +0200 Subject: [PATCH 24/42] Update Makefile to enable static linking for Android builds and add debug symbol stripping to reduce target size --- Makefile | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 1a99cde..5702a62 100644 --- a/Makefile +++ b/Makefile @@ -82,10 +82,9 @@ else ifeq ($(PLATFORM),android) CC = $(BIN)/$(ARCH)-linux-android26-clang CXX = $(CC)++ TARGET := $(DIST_DIR)/ai.so - LDFLAGS += -shared + LDFLAGS += -static-libstdc++ -shared LLAMA_OPTIONS += -DCMAKE_TOOLCHAIN_FILE=$(ANDROID_NDK)/build/cmake/android.toolchain.cmake -DANDROID_ABI=$(if $(filter aarch64,$(ARCH)),arm64-v8a,$(ARCH)) -DANDROID_PLATFORM=android-26 -DCMAKE_C_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,x86-64)" -DCMAKE_CXX_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,x86-64)" -DGGML_OPENMP=OFF -DGGML_LLAMAFILE=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON WHISPER_OPTIONS += -DCMAKE_TOOLCHAIN_FILE=$(ANDROID_NDK)/build/cmake/android.toolchain.cmake -DANDROID_ABI=$(if $(filter aarch64,$(ARCH)),arm64-v8a,$(ARCH)) -DANDROID_PLATFORM=android-26 -DCMAKE_C_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,x86-64)" -DCMAKE_CXX_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,x86-64)" -DGGML_OPENMP=OFF -DGGML_LLAMAFILE=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON - else ifeq ($(PLATFORM),ios) TARGET := $(DIST_DIR)/ai.dylib SDK := -isysroot $(shell xcrun --sdk iphoneos --show-sdk-path) -miphoneos-version-min=14.0 @@ -131,6 +130,10 @@ ifeq ($(PLATFORM),windows) # Generate import library for Windows dlltool -D $@ -d $(DEF_FILE) -l $(DIST_DIR)/ai.lib endif +ifeq ($(PLATFORM),android) + # Android strip debug symbols + $(BIN)/llvm-strip --strip-unneeded $@ +endif # Object files $(BUILD_DIR)/%.o: %.c From ac171859480c16fbf8d6305225c768d79bc945d2 Mon Sep 17 00:00:00 2001 From: Gioele Cantoni Date: Wed, 9 Jul 2025 01:52:09 +0200 Subject: [PATCH 25/42] Add stripping of debug symbols for platform-specific builds in Makefile --- Makefile | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 5702a62..369c3b0 100644 --- a/Makefile +++ b/Makefile @@ -54,6 +54,7 @@ ifeq ($(PLATFORM),windows) LDFLAGS += -shared # Create .def file for Windows DEF_FILE := $(BUILD_DIR)/ai.def + STRIP = strip --strip-unneeded $@ else ifeq ($(PLATFORM),macos) TARGET := $(DIST_DIR)/ai.dylib LLAMA_LIBS += $(BUILD_LLAMA)/ggml/src/ggml-metal/libggml-metal.a $(BUILD_LLAMA)/ggml/src/ggml-blas/libggml-blas.a @@ -61,6 +62,7 @@ else ifeq ($(PLATFORM),macos) CFLAGS += -arch x86_64 -arch arm64 LLAMA_OPTIONS += -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" WHISPER_OPTIONS += -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" -DWHISPER_COREML=ON + STRIP = strip -x -S $@ else ifeq ($(PLATFORM),android) # Set ARCH to find Android NDK's Clang compiler, the user should set the ARCH ifeq ($(filter %,$(ARCH)),) @@ -85,6 +87,7 @@ else ifeq ($(PLATFORM),android) LDFLAGS += -static-libstdc++ -shared LLAMA_OPTIONS += -DCMAKE_TOOLCHAIN_FILE=$(ANDROID_NDK)/build/cmake/android.toolchain.cmake -DANDROID_ABI=$(if $(filter aarch64,$(ARCH)),arm64-v8a,$(ARCH)) -DANDROID_PLATFORM=android-26 -DCMAKE_C_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,x86-64)" -DCMAKE_CXX_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,x86-64)" -DGGML_OPENMP=OFF -DGGML_LLAMAFILE=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON WHISPER_OPTIONS += -DCMAKE_TOOLCHAIN_FILE=$(ANDROID_NDK)/build/cmake/android.toolchain.cmake -DANDROID_ABI=$(if $(filter aarch64,$(ARCH)),arm64-v8a,$(ARCH)) -DANDROID_PLATFORM=android-26 -DCMAKE_C_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,x86-64)" -DCMAKE_CXX_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,x86-64)" -DGGML_OPENMP=OFF -DGGML_LLAMAFILE=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON + STRIP = $(BIN)/llvm-strip --strip-unneeded $@ else ifeq ($(PLATFORM),ios) TARGET := $(DIST_DIR)/ai.dylib SDK := -isysroot $(shell xcrun --sdk iphoneos --show-sdk-path) -miphoneos-version-min=14.0 @@ -93,6 +96,7 @@ else ifeq ($(PLATFORM),ios) CFLAGS += -arch arm64 $(SDK) LLAMA_OPTIONS += -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 WHISPER_OPTIONS += -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 -DWHISPER_COREML=ON + STRIP = strip -x -S $@ else ifeq ($(PLATFORM),isim) TARGET := $(DIST_DIR)/ai.dylib SDK := -isysroot $(shell xcrun --sdk iphonesimulator --show-sdk-path) -miphonesimulator-version-min=14.0 @@ -106,6 +110,7 @@ else # linux LDFLAGS += -shared LLAMA_OPTIONS += -DGGML_OPENMP=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON WHISPER_OPTIONS += -DGGML_OPENMP=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON + STRIP = strip --strip-unneeded $@ endif # Windows .def file generation @@ -130,10 +135,8 @@ ifeq ($(PLATFORM),windows) # Generate import library for Windows dlltool -D $@ -d $(DEF_FILE) -l $(DIST_DIR)/ai.lib endif -ifeq ($(PLATFORM),android) - # Android strip debug symbols - $(BIN)/llvm-strip --strip-unneeded $@ -endif + # Strip debug symbols + $(STRIP) # Object files $(BUILD_DIR)/%.o: %.c From 2948628b5ab04b670d10592742ace58d7ef3d155 Mon Sep 17 00:00:00 2001 From: Gioele Cantoni Date: Wed, 9 Jul 2025 14:15:56 +0200 Subject: [PATCH 26/42] Update GitHub Actions workflow to include Vulkan installation for Linux builds and adjust Makefile for LLAMA and WHISPER user defined options --- .github/workflows/main.yml | 14 ++++++++++++-- Makefile | 4 ++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 7be0ce6..da1bd10 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -17,10 +17,12 @@ jobs: include: - os: ubuntu-latest arch: x86_64 - name: linux + name: linux-vulkan + make: LLAMA="-DGGML_BACKEND_DL=ON -DGGML_NATIVE=OFF -DGGML_CPU_ALL_VARIANTS=ON -DGGML_VULKAN=ON" - os: LinuxARM64 arch: arm64 - name: linux + name: linux-vulkan + make: LLAMA="-DGGML_BACKEND_DL=ON -DGGML_NATIVE=OFF -DGGML_CPU_ALL_VARIANTS=ON -DGGML_VULKAN=ON" - os: macos-latest name: macos - os: windows-latest @@ -61,6 +63,14 @@ jobs: mingw-w64-x86_64-cmake make + - name: linux install vulkan + if: matrix.name == 'linux-vulkan' + 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 build-essential mesa-vulkan-drivers vulkan-sdk libcurl4-openssl-dev + - name: windows build sqlite-ai if: matrix.name == 'windows' run: make extension ${{ matrix.make && matrix.make || ''}} diff --git a/Makefile b/Makefile index 369c3b0..aaffe09 100644 --- a/Makefile +++ b/Makefile @@ -29,8 +29,8 @@ CC = gcc CXX = g++ CFLAGS = -Wall -Wextra -Wno-unused-parameter -I$(SRC_DIR) -I$(LLAMA_DIR)/ggml/include -I$(LLAMA_DIR)/include LDFLAGS = -L./$(BUILD_LLAMA)/common -L./$(BUILD_LLAMA)/ggml/src -L./$(BUILD_LLAMA)/src -L./$(BUILD_WHISPER)/src -lcommon -lggml -lggml-base -lggml-cpu -lllama -lwhisper -LLAMA_OPTIONS = -DLLAMA_CURL=OFF -DLLAMA_BUILD_EXAMPLES=OFF -DLLAMA_BUILD_TESTS=OFF -DLLAMA_BUILD_TOOLS=OFF -DLLAMA_BUILD_SERVER=OFF -WHISPER_OPTIONS = -DWHISPER_BUILD_EXAMPLES=OFF -DWHISPER_BUILD_TESTS=OFF -DWHISPER_BUILD_SERVER=OFF +LLAMA_OPTIONS = $(LLAMA) -DLLAMA_CURL=OFF -DLLAMA_BUILD_EXAMPLES=OFF -DLLAMA_BUILD_TESTS=OFF -DLLAMA_BUILD_TOOLS=OFF -DLLAMA_BUILD_SERVER=OFF +WHISPER_OPTIONS = $(WHISPER) -DWHISPER_BUILD_EXAMPLES=OFF -DWHISPER_BUILD_TESTS=OFF -DWHISPER_BUILD_SERVER=OFF # Directories SRC_DIR = src From 673344416745fc303ce5b3ff3ccb2c6059404d9c Mon Sep 17 00:00:00 2001 From: Daniele Briggi <=> Date: Mon, 14 Jul 2025 14:49:50 +0200 Subject: [PATCH 27/42] feat(linux): safe resource free up - Linux x86_64 build setup --- .github/workflows/main.yml | 19 +++++++++++++++++-- Makefile | 30 ++++++++++++++++-------------- 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index da1bd10..0f157bb 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -22,7 +22,7 @@ jobs: - os: LinuxARM64 arch: arm64 name: linux-vulkan - make: LLAMA="-DGGML_BACKEND_DL=ON -DGGML_NATIVE=OFF -DGGML_CPU_ALL_VARIANTS=ON -DGGML_VULKAN=ON" + make: LLAMA="-DGGML_BACKEND_DL=ON -DGGML_NATIVE=OFF -DGGML_VULKAN=ON" - os: macos-latest name: macos - os: windows-latest @@ -63,13 +63,28 @@ jobs: mingw-w64-x86_64-cmake make + - name: linux install dependencies + if: matrix.name == 'linux-vulkan' + run: | + sudo apt-get update -y + sudo apt-get install -y build-essential wget git cmake ccache sqlite3 libcurl4-openssl-dev + - name: linux install vulkan if: matrix.name == 'linux-vulkan' 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 build-essential mesa-vulkan-drivers vulkan-sdk libcurl4-openssl-dev + 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: windows build sqlite-ai if: matrix.name == 'windows' diff --git a/Makefile b/Makefile index aaffe09..da7694e 100644 --- a/Makefile +++ b/Makefile @@ -28,7 +28,7 @@ MAKEFLAGS += -j$(CPUS) CC = gcc CXX = g++ CFLAGS = -Wall -Wextra -Wno-unused-parameter -I$(SRC_DIR) -I$(LLAMA_DIR)/ggml/include -I$(LLAMA_DIR)/include -LDFLAGS = -L./$(BUILD_LLAMA)/common -L./$(BUILD_LLAMA)/ggml/src -L./$(BUILD_LLAMA)/src -L./$(BUILD_WHISPER)/src -lcommon -lggml -lggml-base -lggml-cpu -lllama -lwhisper +LDFLAGS = -L./$(BUILD_LLAMA)/common -L./$(BUILD_LLAMA)/ggml/src -L./$(BUILD_LLAMA)/src -L./$(BUILD_WHISPER)/src -lcommon -lggml -lggml-cpu -lggml-base -lllama -lwhisper LLAMA_OPTIONS = $(LLAMA) -DLLAMA_CURL=OFF -DLLAMA_BUILD_EXAMPLES=OFF -DLLAMA_BUILD_TESTS=OFF -DLLAMA_BUILD_TOOLS=OFF -DLLAMA_BUILD_SERVER=OFF WHISPER_OPTIONS = $(WHISPER) -DWHISPER_BUILD_EXAMPLES=OFF -DWHISPER_BUILD_TESTS=OFF -DWHISPER_BUILD_SERVER=OFF @@ -60,8 +60,8 @@ else ifeq ($(PLATFORM),macos) LLAMA_LIBS += $(BUILD_LLAMA)/ggml/src/ggml-metal/libggml-metal.a $(BUILD_LLAMA)/ggml/src/ggml-blas/libggml-blas.a LDFLAGS += -arch x86_64 -arch arm64 -L./$(BUILD_LLAMA)/ggml/src/ggml-metal -lggml-metal -L./$(BUILD_LLAMA)/ggml/src/ggml-blas -lggml-blas -framework Metal -framework Foundation -framework CoreFoundation -framework QuartzCore -framework Accelerate -framework CoreML -dynamiclib -undefined dynamic_lookup CFLAGS += -arch x86_64 -arch arm64 - LLAMA_OPTIONS += -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" - WHISPER_OPTIONS += -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" -DWHISPER_COREML=ON + LLAMA_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" + WHISPER_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" -DWHISPER_COREML=ON STRIP = strip -x -S $@ else ifeq ($(PLATFORM),android) # Set ARCH to find Android NDK's Clang compiler, the user should set the ARCH @@ -85,8 +85,8 @@ else ifeq ($(PLATFORM),android) CXX = $(CC)++ TARGET := $(DIST_DIR)/ai.so LDFLAGS += -static-libstdc++ -shared - LLAMA_OPTIONS += -DCMAKE_TOOLCHAIN_FILE=$(ANDROID_NDK)/build/cmake/android.toolchain.cmake -DANDROID_ABI=$(if $(filter aarch64,$(ARCH)),arm64-v8a,$(ARCH)) -DANDROID_PLATFORM=android-26 -DCMAKE_C_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,x86-64)" -DCMAKE_CXX_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,x86-64)" -DGGML_OPENMP=OFF -DGGML_LLAMAFILE=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON - WHISPER_OPTIONS += -DCMAKE_TOOLCHAIN_FILE=$(ANDROID_NDK)/build/cmake/android.toolchain.cmake -DANDROID_ABI=$(if $(filter aarch64,$(ARCH)),arm64-v8a,$(ARCH)) -DANDROID_PLATFORM=android-26 -DCMAKE_C_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,x86-64)" -DCMAKE_CXX_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,x86-64)" -DGGML_OPENMP=OFF -DGGML_LLAMAFILE=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON + LLAMA_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_TOOLCHAIN_FILE=$(ANDROID_NDK)/build/cmake/android.toolchain.cmake -DANDROID_ABI=$(if $(filter aarch64,$(ARCH)),arm64-v8a,$(ARCH)) -DANDROID_PLATFORM=android-26 -DCMAKE_C_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,x86-64)" -DCMAKE_CXX_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,x86-64)" -DGGML_OPENMP=OFF -DGGML_LLAMAFILE=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON + WHISPER_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_TOOLCHAIN_FILE=$(ANDROID_NDK)/build/cmake/android.toolchain.cmake -DANDROID_ABI=$(if $(filter aarch64,$(ARCH)),arm64-v8a,$(ARCH)) -DANDROID_PLATFORM=android-26 -DCMAKE_C_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,x86-64)" -DCMAKE_CXX_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,x86-64)" -DGGML_OPENMP=OFF -DGGML_LLAMAFILE=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON STRIP = $(BIN)/llvm-strip --strip-unneeded $@ else ifeq ($(PLATFORM),ios) TARGET := $(DIST_DIR)/ai.dylib @@ -94,8 +94,8 @@ else ifeq ($(PLATFORM),ios) LLAMA_LIBS += $(BUILD_LLAMA)/ggml/src/ggml-metal/libggml-metal.a $(BUILD_LLAMA)/ggml/src/ggml-blas/libggml-blas.a LDFLAGS += -L./$(BUILD_LLAMA)/ggml/src/ggml-metal -lggml-metal -L./$(BUILD_LLAMA)/ggml/src/ggml-blas -lggml-blas -framework Accelerate -framework Metal -framework Foundation -framework CoreML -dynamiclib $(SDK) CFLAGS += -arch arm64 $(SDK) - LLAMA_OPTIONS += -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 - WHISPER_OPTIONS += -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 -DWHISPER_COREML=ON + LLAMA_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 + WHISPER_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 -DWHISPER_COREML=ON STRIP = strip -x -S $@ else ifeq ($(PLATFORM),isim) TARGET := $(DIST_DIR)/ai.dylib @@ -103,13 +103,15 @@ else ifeq ($(PLATFORM),isim) LLAMA_LIBS += $(BUILD_LLAMA)/ggml/src/ggml-metal/libggml-metal.a $(BUILD_LLAMA)/ggml/src/ggml-blas/libggml-blas.a LDFLAGS += -arch x86_64 -arch arm64 -L./$(BUILD_LLAMA)/ggml/src/ggml-metal -lggml-metal -L./$(BUILD_LLAMA)/ggml/src/ggml-blas -lggml-blas -framework Accelerate -framework Metal -framework Foundation -framework CoreML -dynamiclib $(SDK) CFLAGS += -arch x86_64 -arch arm64 $(SDK) - LLAMA_OPTIONS += -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" - WHISPER_OPTIONS += -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" -DWHISPER_COREML=ON + LLAMA_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" + WHISPER_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" -DWHISPER_COREML=ON else # linux TARGET := $(DIST_DIR)/ai.so - LDFLAGS += -shared - LLAMA_OPTIONS += -DGGML_OPENMP=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON - WHISPER_OPTIONS += -DGGML_OPENMP=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON + # using -DGGML_CPU_ALL_VARIANTS=ON + LDFLAGS := $(filter-out -lggml-cpu,$(LDFLAGS)) + LDFLAGS += -shared -L./$(BUILD_LLAMA)/bin -Wl,-rpath,./$(BUILD_LLAMA)/bin -Wl,-rpath,./$(BUILD_LLAMA)/common -Wl,-rpath,./$(BUILD_LLAMA)/ggml/src -Wl,-rpath,./$(BUILD_LLAMA)/src -Wl,-rpath,./$(BUILD_WHISPER)/src + LLAMA_OPTIONS += -DBUILD_SHARED_LIBS=ON -DGGML_OPENMP=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON + WHISPER_OPTIONS += -DBUILD_SHARED_LIBS=ON -DGGML_OPENMP=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON STRIP = strip --strip-unneeded $@ endif @@ -147,12 +149,12 @@ test: $(TARGET) # Build submodules build/llama.cpp.stamp: - cmake -B $(BUILD_LLAMA) -DBUILD_SHARED_LIBS=OFF $(LLAMA_OPTIONS) $(LLAMA_DIR) + cmake -B $(BUILD_LLAMA) $(LLAMA_OPTIONS) $(LLAMA_DIR) cmake --build $(BUILD_LLAMA) --config Release -- -j$(CPUS) touch $@ build/whisper.cpp.stamp: - cmake -B $(BUILD_WHISPER) -DBUILD_SHARED_LIBS=OFF $(WHISPER_OPTIONS) $(WHISPER_DIR) + cmake -B $(BUILD_WHISPER) $(WHISPER_OPTIONS) $(WHISPER_DIR) cmake --build $(BUILD_WHISPER) --config Release -- -j$(CPUS) touch $@ From 048463a5787d63868ee6c8b41fdbd76897a5a867 Mon Sep 17 00:00:00 2001 From: Daniele Briggi <=> Date: Tue, 15 Jul 2025 10:51:35 +0200 Subject: [PATCH 28/42] fix(windows): missing git --- .github/workflows/main.yml | 18 ++++++++++-------- Makefile | 2 +- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 0f157bb..392f818 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -19,10 +19,6 @@ jobs: arch: x86_64 name: linux-vulkan make: LLAMA="-DGGML_BACKEND_DL=ON -DGGML_NATIVE=OFF -DGGML_CPU_ALL_VARIANTS=ON -DGGML_VULKAN=ON" - - os: LinuxARM64 - arch: arm64 - name: linux-vulkan - make: LLAMA="-DGGML_BACKEND_DL=ON -DGGML_NATIVE=OFF -DGGML_VULKAN=ON" - os: macos-latest name: macos - os: windows-latest @@ -86,6 +82,12 @@ jobs: echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH" >> $GITHUB_ENV echo "VK_ADD_LAYER_PATH=$VK_ADD_LAYER_PATH" >> $GITHUB_ENV + - name: windows install dependencies + if: matrix.os == 'windows-latest' + run: | + pacman -S --noconfirm git + shell: msys2 {0} + - name: windows build sqlite-ai if: matrix.name == 'windows' run: make extension ${{ matrix.make && matrix.make || ''}} @@ -95,14 +97,14 @@ jobs: if: matrix.name != 'windows' run: make extension ${{ matrix.make && matrix.make || ''}} - - name: windows install sqlite3 - if: matrix.os == 'windows-latest' - run: choco install sqlite -y - - name: macos install sqlite3 without SQLITE_OMIT_LOAD_EXTENSION if: matrix.name == 'macos' run: brew link sqlite --force + - name: windows install sqlite3 + if: matrix.os == 'windows-latest' + run: choco install -y --no-progress sqlite + - name: android setup test environment if: matrix.name == 'android' && matrix.arch != 'arm64-v8a' run: | diff --git a/Makefile b/Makefile index da7694e..35745aa 100644 --- a/Makefile +++ b/Makefile @@ -51,7 +51,7 @@ WHISPER_LIBS = $(BUILD_WHISPER)/src/libwhisper.a # Platform-specific settings ifeq ($(PLATFORM),windows) TARGET := $(DIST_DIR)/ai.dll - LDFLAGS += -shared + LDFLAGS = -L./$(BUILD_LLAMA)/common -L./$(BUILD_LLAMA)/ggml/src -L./$(BUILD_LLAMA)/src -L./$(BUILD_WHISPER)/src -l:libllama.a -l:libwhisper.a -l:libcommon.a -l:ggml.a -l:ggml-cpu.a -l:ggml-base.a -fopenmp -static-libgcc -static-libstdc++ -shared # Create .def file for Windows DEF_FILE := $(BUILD_DIR)/ai.def STRIP = strip --strip-unneeded $@ From b32c57347ca0d588fa80cd439b22b687333af096 Mon Sep 17 00:00:00 2001 From: Daniele Briggi <=> Date: Tue, 15 Jul 2025 12:52:14 +0200 Subject: [PATCH 29/42] fix(windows): missing codecvt link --- .github/workflows/main.yml | 13 ++++++++----- Makefile | 9 ++++++++- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 392f818..ffc545b 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -57,6 +57,7 @@ jobs: install: >- mingw-w64-x86_64-cc mingw-w64-x86_64-cmake + mingw-w64-x86_64-toolchain make - name: linux install dependencies @@ -85,7 +86,7 @@ jobs: - name: windows install dependencies if: matrix.os == 'windows-latest' run: | - pacman -S --noconfirm git + pacman -S --noconfirm git sqlite3 shell: msys2 {0} - name: windows build sqlite-ai @@ -101,9 +102,6 @@ jobs: if: matrix.name == 'macos' run: brew link sqlite --force - - name: windows install sqlite3 - if: matrix.os == 'windows-latest' - run: choco install -y --no-progress sqlite - name: android setup test environment if: matrix.name == 'android' && matrix.arch != 'arm64-v8a' @@ -147,8 +145,13 @@ jobs: adb push ${{ github.workspace }}/. /data/local/tmp/ adb shell "sh /data/local/tmp/commands.sh" + - name: windows test sqlite-ai + if: matrix.name == 'windows' + run: make test + shell: msys2 {0} + - name: test sqlite-ai - if: matrix.name == 'linux' || matrix.name == 'windows' || matrix.name == 'macos' + if: matrix.name == 'linux' || matrix.name == 'macos' run: make test - uses: actions/upload-artifact@v4.6.2 diff --git a/Makefile b/Makefile index 35745aa..80afb1a 100644 --- a/Makefile +++ b/Makefile @@ -28,6 +28,7 @@ MAKEFLAGS += -j$(CPUS) CC = gcc CXX = g++ CFLAGS = -Wall -Wextra -Wno-unused-parameter -I$(SRC_DIR) -I$(LLAMA_DIR)/ggml/include -I$(LLAMA_DIR)/include +CXXFLAGS = LDFLAGS = -L./$(BUILD_LLAMA)/common -L./$(BUILD_LLAMA)/ggml/src -L./$(BUILD_LLAMA)/src -L./$(BUILD_WHISPER)/src -lcommon -lggml -lggml-cpu -lggml-base -lllama -lwhisper LLAMA_OPTIONS = $(LLAMA) -DLLAMA_CURL=OFF -DLLAMA_BUILD_EXAMPLES=OFF -DLLAMA_BUILD_TESTS=OFF -DLLAMA_BUILD_TOOLS=OFF -DLLAMA_BUILD_SERVER=OFF WHISPER_OPTIONS = $(WHISPER) -DWHISPER_BUILD_EXAMPLES=OFF -DWHISPER_BUILD_TESTS=OFF -DWHISPER_BUILD_SERVER=OFF @@ -55,6 +56,12 @@ ifeq ($(PLATFORM),windows) # Create .def file for Windows DEF_FILE := $(BUILD_DIR)/ai.def STRIP = strip --strip-unneeded $@ + # Windows-specific C++ flags to work around MinGW codecvt issues + # CXXFLAGS += -D_GLIBCXX_USE_CXX11_ABI=1 -DGGML_USE_UNICODE=0 -DLLAMA_DISABLE_UNICODE=1 + CXXFLAGS += -std=c++17 -Wall -Wextra -Wno-unused-parameter -I$(SRC_DIR) -I$(LLAMA_DIR)/ggml/include -I$(LLAMA_DIR)/include + # Windows-specific flags to work around MinGW codecvt issues +# LLAMA_OPTIONS += -DCMAKE_CXX_STANDARD=17 -DCMAKE_CXX_FLAGS="-D_GLIBCXX_USE_CXX11_ABI=1 -DGGML_USE_UNICODE=0 -DLLAMA_DISABLE_UNICODE=1" +# WHISPER_OPTIONS += -DCMAKE_CXX_STANDARD=17 -DCMAKE_CXX_FLAGS="-D_GLIBCXX_USE_CXX11_ABI=1 -DGGML_USE_UNICODE=0" else ifeq ($(PLATFORM),macos) TARGET := $(DIST_DIR)/ai.dylib LLAMA_LIBS += $(BUILD_LLAMA)/ggml/src/ggml-metal/libggml-metal.a $(BUILD_LLAMA)/ggml/src/ggml-blas/libggml-blas.a @@ -132,7 +139,7 @@ all: $(TARGET) # Loadable library $(TARGET): $(OBJ_FILES) $(DEF_FILE) $(LLAMA_LIBS) $(WHISPER_LIBS) - $(CXX) $(OBJ_FILES) $(DEF_FILE) -o $@ $(LDFLAGS) + $(CXX) $(CXXFLAGS) $(OBJ_FILES) $(DEF_FILE) -o $@ $(LDFLAGS) ifeq ($(PLATFORM),windows) # Generate import library for Windows dlltool -D $@ -d $(DEF_FILE) -l $(DIST_DIR)/ai.lib From b5fdbe43714712c89c14da1bb8c64aa2bf5f6d7d Mon Sep 17 00:00:00 2001 From: Daniele Briggi <=> Date: Tue, 15 Jul 2025 15:00:38 +0200 Subject: [PATCH 30/42] chore(windows): detecting fix for make test --- .github/workflows/main.yml | 1 - Makefile | 9 +-------- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ffc545b..63c7da2 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -57,7 +57,6 @@ jobs: install: >- mingw-w64-x86_64-cc mingw-w64-x86_64-cmake - mingw-w64-x86_64-toolchain make - name: linux install dependencies diff --git a/Makefile b/Makefile index 80afb1a..35745aa 100644 --- a/Makefile +++ b/Makefile @@ -28,7 +28,6 @@ MAKEFLAGS += -j$(CPUS) CC = gcc CXX = g++ CFLAGS = -Wall -Wextra -Wno-unused-parameter -I$(SRC_DIR) -I$(LLAMA_DIR)/ggml/include -I$(LLAMA_DIR)/include -CXXFLAGS = LDFLAGS = -L./$(BUILD_LLAMA)/common -L./$(BUILD_LLAMA)/ggml/src -L./$(BUILD_LLAMA)/src -L./$(BUILD_WHISPER)/src -lcommon -lggml -lggml-cpu -lggml-base -lllama -lwhisper LLAMA_OPTIONS = $(LLAMA) -DLLAMA_CURL=OFF -DLLAMA_BUILD_EXAMPLES=OFF -DLLAMA_BUILD_TESTS=OFF -DLLAMA_BUILD_TOOLS=OFF -DLLAMA_BUILD_SERVER=OFF WHISPER_OPTIONS = $(WHISPER) -DWHISPER_BUILD_EXAMPLES=OFF -DWHISPER_BUILD_TESTS=OFF -DWHISPER_BUILD_SERVER=OFF @@ -56,12 +55,6 @@ ifeq ($(PLATFORM),windows) # Create .def file for Windows DEF_FILE := $(BUILD_DIR)/ai.def STRIP = strip --strip-unneeded $@ - # Windows-specific C++ flags to work around MinGW codecvt issues - # CXXFLAGS += -D_GLIBCXX_USE_CXX11_ABI=1 -DGGML_USE_UNICODE=0 -DLLAMA_DISABLE_UNICODE=1 - CXXFLAGS += -std=c++17 -Wall -Wextra -Wno-unused-parameter -I$(SRC_DIR) -I$(LLAMA_DIR)/ggml/include -I$(LLAMA_DIR)/include - # Windows-specific flags to work around MinGW codecvt issues -# LLAMA_OPTIONS += -DCMAKE_CXX_STANDARD=17 -DCMAKE_CXX_FLAGS="-D_GLIBCXX_USE_CXX11_ABI=1 -DGGML_USE_UNICODE=0 -DLLAMA_DISABLE_UNICODE=1" -# WHISPER_OPTIONS += -DCMAKE_CXX_STANDARD=17 -DCMAKE_CXX_FLAGS="-D_GLIBCXX_USE_CXX11_ABI=1 -DGGML_USE_UNICODE=0" else ifeq ($(PLATFORM),macos) TARGET := $(DIST_DIR)/ai.dylib LLAMA_LIBS += $(BUILD_LLAMA)/ggml/src/ggml-metal/libggml-metal.a $(BUILD_LLAMA)/ggml/src/ggml-blas/libggml-blas.a @@ -139,7 +132,7 @@ all: $(TARGET) # Loadable library $(TARGET): $(OBJ_FILES) $(DEF_FILE) $(LLAMA_LIBS) $(WHISPER_LIBS) - $(CXX) $(CXXFLAGS) $(OBJ_FILES) $(DEF_FILE) -o $@ $(LDFLAGS) + $(CXX) $(OBJ_FILES) $(DEF_FILE) -o $@ $(LDFLAGS) ifeq ($(PLATFORM),windows) # Generate import library for Windows dlltool -D $@ -d $(DEF_FILE) -l $(DIST_DIR)/ai.lib From fd2db0eda8ef8f1ec3c5a173d2c1180369cc88f5 Mon Sep 17 00:00:00 2001 From: Daniele Briggi <=> Date: Tue, 15 Jul 2025 15:11:30 +0200 Subject: [PATCH 31/42] chore(worflow): readability --- .github/workflows/main.yml | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 63c7da2..e1af51f 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -15,29 +15,29 @@ jobs: fail-fast: false matrix: include: - - os: ubuntu-latest + - name: linux-vulkan + os: ubuntu-latest arch: x86_64 - name: linux-vulkan make: LLAMA="-DGGML_BACKEND_DL=ON -DGGML_NATIVE=OFF -DGGML_CPU_ALL_VARIANTS=ON -DGGML_VULKAN=ON" - - os: macos-latest - name: macos - - os: windows-latest + - name: macos + os: macos-latest + - name: windows + os: windows-latest arch: x86_64 - name: windows - - os: ubuntu-latest + - name: android + os: ubuntu-latest arch: arm64-v8a - name: android make: PLATFORM=android ARCH=arm64-v8a - - os: ubuntu-latest + - name: android + 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 - - os: macos-latest - name: ios + - name: ios + os: macos-latest make: PLATFORM=ios - - os: macos-latest - name: isim + - name: isim + os: macos-latest make: PLATFORM=isim defaults: From d1f03d69ebac19cfd91e1e706f36810278a429fa Mon Sep 17 00:00:00 2001 From: Daniele Briggi <=> Date: Tue, 15 Jul 2025 16:43:58 +0200 Subject: [PATCH 32/42] feat(miniaudio): build along the other modules --- Makefile | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 35745aa..829c0cf 100644 --- a/Makefile +++ b/Makefile @@ -27,11 +27,16 @@ MAKEFLAGS += -j$(CPUS) # Compiler and flags CC = gcc CXX = g++ -CFLAGS = -Wall -Wextra -Wno-unused-parameter -I$(SRC_DIR) -I$(LLAMA_DIR)/ggml/include -I$(LLAMA_DIR)/include -LDFLAGS = -L./$(BUILD_LLAMA)/common -L./$(BUILD_LLAMA)/ggml/src -L./$(BUILD_LLAMA)/src -L./$(BUILD_WHISPER)/src -lcommon -lggml -lggml-cpu -lggml-base -lllama -lwhisper +CFLAGS = -Wall -Wextra -Wno-unused-parameter -I$(SRC_DIR) -I$(LLAMA_DIR)/ggml/include -I$(LLAMA_DIR)/include -I$(MINIAUDIO_DIR) +LDFLAGS = $(LLAMA_LDFLAGS) $(WHISPER_LDFLAGS) $(MINIAUDIO_LDFLAGS) LLAMA_OPTIONS = $(LLAMA) -DLLAMA_CURL=OFF -DLLAMA_BUILD_EXAMPLES=OFF -DLLAMA_BUILD_TESTS=OFF -DLLAMA_BUILD_TOOLS=OFF -DLLAMA_BUILD_SERVER=OFF WHISPER_OPTIONS = $(WHISPER) -DWHISPER_BUILD_EXAMPLES=OFF -DWHISPER_BUILD_TESTS=OFF -DWHISPER_BUILD_SERVER=OFF +# Module-specific linking flags +LLAMA_LDFLAGS = -L./$(BUILD_LLAMA)/common -L./$(BUILD_LLAMA)/ggml/src -L./$(BUILD_LLAMA)/src -lcommon -lggml -lggml-cpu -lggml-base -lllama +WHISPER_LDFLAGS = -L./$(BUILD_WHISPER)/src -lwhisper +MINIAUDIO_LDFLAGS = -L./$(BUILD_MINIAUDIO) -lminiaudio + # Directories SRC_DIR = src DIST_DIR = dist @@ -39,19 +44,22 @@ VPATH = $(SRC_DIR) BUILD_DIR = build LLAMA_DIR = modules/llama.cpp WHISPER_DIR = modules/whisper.cpp +MINIAUDIO_DIR = modules/miniaudio BUILD_LLAMA = $(BUILD_DIR)/llama.cpp BUILD_WHISPER = $(BUILD_DIR)/whisper.cpp +BUILD_MINIAUDIO = $(BUILD_DIR)/miniaudio # Files SRC_FILES = $(wildcard $(SRC_DIR)/*.c) OBJ_FILES = $(patsubst %.c, $(BUILD_DIR)/%.o, $(notdir $(SRC_FILES))) LLAMA_LIBS = $(BUILD_LLAMA)/common/libcommon.a $(BUILD_LLAMA)/ggml/src/libggml.a $(BUILD_LLAMA)/ggml/src/libggml-base.a $(BUILD_LLAMA)/ggml/src/libggml-cpu.a $(BUILD_LLAMA)/src/libllama.a WHISPER_LIBS = $(BUILD_WHISPER)/src/libwhisper.a +MINIAUDIO_LIBS = $(BUILD_MINIAUDIO)/libminiaudio.a # Platform-specific settings ifeq ($(PLATFORM),windows) TARGET := $(DIST_DIR)/ai.dll - LDFLAGS = -L./$(BUILD_LLAMA)/common -L./$(BUILD_LLAMA)/ggml/src -L./$(BUILD_LLAMA)/src -L./$(BUILD_WHISPER)/src -l:libllama.a -l:libwhisper.a -l:libcommon.a -l:ggml.a -l:ggml-cpu.a -l:ggml-base.a -fopenmp -static-libgcc -static-libstdc++ -shared + LDFLAGS = -L./$(BUILD_LLAMA)/common -L./$(BUILD_LLAMA)/ggml/src -L./$(BUILD_LLAMA)/src -L./$(BUILD_WHISPER)/src -L./$(BUILD_MINIAUDIO) -l:libllama.a -l:libwhisper.a -l:libminiaudio.a -l:libcommon.a -l:ggml.a -l:ggml-cpu.a -l:ggml-base.a -fopenmp -static-libgcc -static-libstdc++ -shared # Create .def file for Windows DEF_FILE := $(BUILD_DIR)/ai.def STRIP = strip --strip-unneeded $@ @@ -110,6 +118,8 @@ else # linux # using -DGGML_CPU_ALL_VARIANTS=ON LDFLAGS := $(filter-out -lggml-cpu,$(LDFLAGS)) LDFLAGS += -shared -L./$(BUILD_LLAMA)/bin -Wl,-rpath,./$(BUILD_LLAMA)/bin -Wl,-rpath,./$(BUILD_LLAMA)/common -Wl,-rpath,./$(BUILD_LLAMA)/ggml/src -Wl,-rpath,./$(BUILD_LLAMA)/src -Wl,-rpath,./$(BUILD_WHISPER)/src + # Add miniaudio Linux-specific flags (as per miniaudio docs) + MINIAUDIO_LDFLAGS += -lpthread -lm LLAMA_OPTIONS += -DBUILD_SHARED_LIBS=ON -DGGML_OPENMP=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON WHISPER_OPTIONS += -DBUILD_SHARED_LIBS=ON -DGGML_OPENMP=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON STRIP = strip --strip-unneeded $@ @@ -131,7 +141,7 @@ extension: $(TARGET) all: $(TARGET) # Loadable library -$(TARGET): $(OBJ_FILES) $(DEF_FILE) $(LLAMA_LIBS) $(WHISPER_LIBS) +$(TARGET): $(OBJ_FILES) $(DEF_FILE) $(LLAMA_LIBS) $(WHISPER_LIBS) $(MINIAUDIO_LIBS) $(CXX) $(OBJ_FILES) $(DEF_FILE) -o $@ $(LDFLAGS) ifeq ($(PLATFORM),windows) # Generate import library for Windows @@ -158,8 +168,14 @@ build/whisper.cpp.stamp: cmake --build $(BUILD_WHISPER) --config Release -- -j$(CPUS) touch $@ +build/miniaudio.stamp: + cmake -B $(BUILD_MINIAUDIO) -DMINIAUDIO_BUILD_EXAMPLES=OFF -DMINIAUDIO_BUILD_TESTS=OFF $(MINIAUDIO_DIR) + cmake --build $(BUILD_MINIAUDIO) --config Release -- -j$(CPUS) + touch $@ + $(LLAMA_LIBS): build/llama.cpp.stamp $(WHISPER_LIBS): build/whisper.cpp.stamp +$(MINIAUDIO_LIBS): build/miniaudio.stamp # Tools version: From 3b909a6803149c3865f7bfca61e6b29e399aee15 Mon Sep 17 00:00:00 2001 From: Daniele Briggi <=> Date: Tue, 15 Jul 2025 16:59:45 +0200 Subject: [PATCH 33/42] chore(workflow): remove dependency --- .github/workflows/main.yml | 2 +- Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e1af51f..063c07e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -63,7 +63,7 @@ jobs: if: matrix.name == 'linux-vulkan' run: | sudo apt-get update -y - sudo apt-get install -y build-essential wget git cmake ccache sqlite3 libcurl4-openssl-dev + sudo apt-get install -y build-essential wget git cmake sqlite3 libcurl4-openssl-dev - name: linux install vulkan if: matrix.name == 'linux-vulkan' diff --git a/Makefile b/Makefile index 829c0cf..bfc81ca 100644 --- a/Makefile +++ b/Makefile @@ -27,7 +27,7 @@ MAKEFLAGS += -j$(CPUS) # Compiler and flags CC = gcc CXX = g++ -CFLAGS = -Wall -Wextra -Wno-unused-parameter -I$(SRC_DIR) -I$(LLAMA_DIR)/ggml/include -I$(LLAMA_DIR)/include -I$(MINIAUDIO_DIR) +CFLAGS = -Wall -Wextra -Wno-unused-parameter -I$(SRC_DIR) -I$(LLAMA_DIR)/ggml/include -I$(LLAMA_DIR)/include -I$(WHISPER_DIR)/include -I$(MINIAUDIO_DIR) LDFLAGS = $(LLAMA_LDFLAGS) $(WHISPER_LDFLAGS) $(MINIAUDIO_LDFLAGS) LLAMA_OPTIONS = $(LLAMA) -DLLAMA_CURL=OFF -DLLAMA_BUILD_EXAMPLES=OFF -DLLAMA_BUILD_TESTS=OFF -DLLAMA_BUILD_TOOLS=OFF -DLLAMA_BUILD_SERVER=OFF WHISPER_OPTIONS = $(WHISPER) -DWHISPER_BUILD_EXAMPLES=OFF -DWHISPER_BUILD_TESTS=OFF -DWHISPER_BUILD_SERVER=OFF From 7c0a5834163148a468d15160317cde41d52d0f56 Mon Sep 17 00:00:00 2001 From: Daniele Briggi <=> Date: Wed, 16 Jul 2025 16:08:42 +0200 Subject: [PATCH 34/42] fix(makefile): compile extension before modules - add suggested flags for miniaudio --- Makefile | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index bfc81ca..c1cba57 100644 --- a/Makefile +++ b/Makefile @@ -97,11 +97,15 @@ else ifeq ($(PLATFORM),android) WHISPER_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_TOOLCHAIN_FILE=$(ANDROID_NDK)/build/cmake/android.toolchain.cmake -DANDROID_ABI=$(if $(filter aarch64,$(ARCH)),arm64-v8a,$(ARCH)) -DANDROID_PLATFORM=android-26 -DCMAKE_C_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,x86-64)" -DCMAKE_CXX_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,x86-64)" -DGGML_OPENMP=OFF -DGGML_LLAMAFILE=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON STRIP = $(BIN)/llvm-strip --strip-unneeded $@ else ifeq ($(PLATFORM),ios) + CC = clang + CXX = clang++ TARGET := $(DIST_DIR)/ai.dylib SDK := -isysroot $(shell xcrun --sdk iphoneos --show-sdk-path) -miphoneos-version-min=14.0 LLAMA_LIBS += $(BUILD_LLAMA)/ggml/src/ggml-metal/libggml-metal.a $(BUILD_LLAMA)/ggml/src/ggml-blas/libggml-blas.a - LDFLAGS += -L./$(BUILD_LLAMA)/ggml/src/ggml-metal -lggml-metal -L./$(BUILD_LLAMA)/ggml/src/ggml-blas -lggml-blas -framework Accelerate -framework Metal -framework Foundation -framework CoreML -dynamiclib $(SDK) - CFLAGS += -arch arm64 $(SDK) + # miniaudio requires -ldl for dlopen() and compile as Objective-C on iOS + # https://github.com/mackron/miniaudio/blob/master/README.md#building + LDFLAGS += -L./$(BUILD_LLAMA)/ggml/src/ggml-metal -lggml-metal -L./$(BUILD_LLAMA)/ggml/src/ggml-blas -lggml-blas -framework Accelerate -framework Metal -framework Foundation -framework CoreML -dynamiclib -ldl $(SDK) + CFLAGS += -arch arm64 -x objective-c $(SDK) LLAMA_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 WHISPER_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 -DWHISPER_COREML=ON STRIP = strip -x -S $@ @@ -140,8 +144,11 @@ $(shell mkdir -p $(BUILD_DIR) $(DIST_DIR)) extension: $(TARGET) all: $(TARGET) +# Ensure object files are built first +compile: $(OBJ_FILES) + # Loadable library -$(TARGET): $(OBJ_FILES) $(DEF_FILE) $(LLAMA_LIBS) $(WHISPER_LIBS) $(MINIAUDIO_LIBS) +$(TARGET): compile $(DEF_FILE) $(LLAMA_LIBS) $(WHISPER_LIBS) $(MINIAUDIO_LIBS) $(CXX) $(OBJ_FILES) $(DEF_FILE) -o $@ $(LDFLAGS) ifeq ($(PLATFORM),windows) # Generate import library for Windows @@ -157,18 +164,18 @@ $(BUILD_DIR)/%.o: %.c test: $(TARGET) $(SQLITE3) ":memory:" -cmd ".bail on" ".load ./dist/ai" "SELECT ai_version();" -# Build submodules -build/llama.cpp.stamp: +# Build submodules (only after successful compilation) +build/llama.cpp.stamp: compile cmake -B $(BUILD_LLAMA) $(LLAMA_OPTIONS) $(LLAMA_DIR) cmake --build $(BUILD_LLAMA) --config Release -- -j$(CPUS) touch $@ -build/whisper.cpp.stamp: +build/whisper.cpp.stamp: compile cmake -B $(BUILD_WHISPER) $(WHISPER_OPTIONS) $(WHISPER_DIR) cmake --build $(BUILD_WHISPER) --config Release -- -j$(CPUS) touch $@ -build/miniaudio.stamp: +build/miniaudio.stamp: compile cmake -B $(BUILD_MINIAUDIO) -DMINIAUDIO_BUILD_EXAMPLES=OFF -DMINIAUDIO_BUILD_TESTS=OFF $(MINIAUDIO_DIR) cmake --build $(BUILD_MINIAUDIO) --config Release -- -j$(CPUS) touch $@ @@ -205,4 +212,4 @@ help: @echo " test - Test the extension" @echo " help - Display this help message" -.PHONY: all clean test extension help +.PHONY: all clean test extension help compile From 837e54a7299249843e10771f788da419e96130d3 Mon Sep 17 00:00:00 2001 From: Daniele Briggi <=> Date: Wed, 16 Jul 2025 16:18:18 +0200 Subject: [PATCH 35/42] fix(makefile); missing ios framworks --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index c1cba57..c744bfc 100644 --- a/Makefile +++ b/Makefile @@ -104,7 +104,7 @@ else ifeq ($(PLATFORM),ios) LLAMA_LIBS += $(BUILD_LLAMA)/ggml/src/ggml-metal/libggml-metal.a $(BUILD_LLAMA)/ggml/src/ggml-blas/libggml-blas.a # miniaudio requires -ldl for dlopen() and compile as Objective-C on iOS # https://github.com/mackron/miniaudio/blob/master/README.md#building - LDFLAGS += -L./$(BUILD_LLAMA)/ggml/src/ggml-metal -lggml-metal -L./$(BUILD_LLAMA)/ggml/src/ggml-blas -lggml-blas -framework Accelerate -framework Metal -framework Foundation -framework CoreML -dynamiclib -ldl $(SDK) + LDFLAGS += -L./$(BUILD_LLAMA)/ggml/src/ggml-metal -lggml-metal -L./$(BUILD_LLAMA)/ggml/src/ggml-blas -lggml-blas -framework Accelerate -framework Metal -framework Foundation -framework CoreML -framework AVFoundation -framework AudioToolbox -framework Security -dynamiclib -ldl $(SDK) CFLAGS += -arch arm64 -x objective-c $(SDK) LLAMA_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 WHISPER_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 -DWHISPER_COREML=ON From f8b3b00f20fbe5be09c4f9aad6e5372c377b4717 Mon Sep 17 00:00:00 2001 From: Daniele Briggi <=> Date: Wed, 16 Jul 2025 17:06:33 +0200 Subject: [PATCH 36/42] fix(makefile): build before submodules but not trigger rebuild --- Makefile | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index c744bfc..4c086af 100644 --- a/Makefile +++ b/Makefile @@ -31,6 +31,7 @@ CFLAGS = -Wall -Wextra -Wno-unused-parameter -I$(SRC_DIR) -I$(LLAMA_DIR)/ggml/in LDFLAGS = $(LLAMA_LDFLAGS) $(WHISPER_LDFLAGS) $(MINIAUDIO_LDFLAGS) LLAMA_OPTIONS = $(LLAMA) -DLLAMA_CURL=OFF -DLLAMA_BUILD_EXAMPLES=OFF -DLLAMA_BUILD_TESTS=OFF -DLLAMA_BUILD_TOOLS=OFF -DLLAMA_BUILD_SERVER=OFF WHISPER_OPTIONS = $(WHISPER) -DWHISPER_BUILD_EXAMPLES=OFF -DWHISPER_BUILD_TESTS=OFF -DWHISPER_BUILD_SERVER=OFF +MINIAUDIO_OPTIONS = -DMINIAUDIO_BUILD_EXAMPLES=OFF -DMINIAUDIO_BUILD_TESTS=OFF # Module-specific linking flags LLAMA_LDFLAGS = -L./$(BUILD_LLAMA)/common -L./$(BUILD_LLAMA)/ggml/src -L./$(BUILD_LLAMA)/src -lcommon -lggml -lggml-cpu -lggml-base -lllama @@ -70,6 +71,7 @@ else ifeq ($(PLATFORM),macos) CFLAGS += -arch x86_64 -arch arm64 LLAMA_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" WHISPER_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" -DWHISPER_COREML=ON + MINIAUDIO_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" STRIP = strip -x -S $@ else ifeq ($(PLATFORM),android) # Set ARCH to find Android NDK's Clang compiler, the user should set the ARCH @@ -98,7 +100,7 @@ else ifeq ($(PLATFORM),android) STRIP = $(BIN)/llvm-strip --strip-unneeded $@ else ifeq ($(PLATFORM),ios) CC = clang - CXX = clang++ + CXX = $(CC)++ TARGET := $(DIST_DIR)/ai.dylib SDK := -isysroot $(shell xcrun --sdk iphoneos --show-sdk-path) -miphoneos-version-min=14.0 LLAMA_LIBS += $(BUILD_LLAMA)/ggml/src/ggml-metal/libggml-metal.a $(BUILD_LLAMA)/ggml/src/ggml-blas/libggml-blas.a @@ -148,7 +150,7 @@ all: $(TARGET) compile: $(OBJ_FILES) # Loadable library -$(TARGET): compile $(DEF_FILE) $(LLAMA_LIBS) $(WHISPER_LIBS) $(MINIAUDIO_LIBS) +$(TARGET): $(DEF_FILE) $(LLAMA_LIBS) $(WHISPER_LIBS) $(MINIAUDIO_LIBS) $(CXX) $(OBJ_FILES) $(DEF_FILE) -o $@ $(LDFLAGS) ifeq ($(PLATFORM),windows) # Generate import library for Windows @@ -164,19 +166,19 @@ $(BUILD_DIR)/%.o: %.c test: $(TARGET) $(SQLITE3) ":memory:" -cmd ".bail on" ".load ./dist/ai" "SELECT ai_version();" -# Build submodules (only after successful compilation) -build/llama.cpp.stamp: compile +# Build submodules (only after successful compilation of the extension) +build/llama.cpp.stamp: | compile cmake -B $(BUILD_LLAMA) $(LLAMA_OPTIONS) $(LLAMA_DIR) cmake --build $(BUILD_LLAMA) --config Release -- -j$(CPUS) touch $@ -build/whisper.cpp.stamp: compile +build/whisper.cpp.stamp: | compile cmake -B $(BUILD_WHISPER) $(WHISPER_OPTIONS) $(WHISPER_DIR) cmake --build $(BUILD_WHISPER) --config Release -- -j$(CPUS) touch $@ -build/miniaudio.stamp: compile - cmake -B $(BUILD_MINIAUDIO) -DMINIAUDIO_BUILD_EXAMPLES=OFF -DMINIAUDIO_BUILD_TESTS=OFF $(MINIAUDIO_DIR) +build/miniaudio.stamp: | compile + cmake -B $(BUILD_MINIAUDIO) $(MINIAUDIO_OPTIONS) $(MINIAUDIO_DIR) cmake --build $(BUILD_MINIAUDIO) --config Release -- -j$(CPUS) touch $@ From 13c389ac228b9246342c894a27f259dd832ab4f1 Mon Sep 17 00:00:00 2001 From: Daniele Briggi <=> Date: Thu, 17 Jul 2025 10:56:02 +0200 Subject: [PATCH 37/42] fix(makefile): variables declaration before usage --- .github/workflows/main.yml | 56 ++++++++++--------- Makefile | 107 +++++++++++++++++++------------------ 2 files changed, 87 insertions(+), 76 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 063c07e..1686670 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -15,30 +15,30 @@ jobs: fail-fast: false matrix: include: - - name: linux-vulkan - os: ubuntu-latest - arch: x86_64 - make: LLAMA="-DGGML_BACKEND_DL=ON -DGGML_NATIVE=OFF -DGGML_CPU_ALL_VARIANTS=ON -DGGML_VULKAN=ON" + # - name: linux-vulkan + # os: ubuntu-latest + # arch: x86_64 + # make: LLAMA="-DGGML_BACKEND_DL=ON -DGGML_NATIVE=OFF -DGGML_CPU_ALL_VARIANTS=ON -DGGML_VULKAN=ON" - name: macos os: macos-latest - - name: windows - os: windows-latest - arch: x86_64 - - name: android - os: ubuntu-latest - arch: arm64-v8a - make: PLATFORM=android ARCH=arm64-v8a - - name: android - os: ubuntu-latest - arch: x86_64 - make: PLATFORM=android ARCH=x86_64 - sqlite-amalgamation-zip: https://sqlite.org/2025/sqlite-amalgamation-3490100.zip - - name: ios - os: macos-latest - make: PLATFORM=ios - - name: isim - os: macos-latest - make: PLATFORM=isim + # - name: windows + # os: windows-latest + # arch: x86_64 + # - name: android + # os: ubuntu-latest + # arch: arm64-v8a + # make: PLATFORM=android ARCH=arm64-v8a + # - name: android + # os: ubuntu-latest + # arch: x86_64 + # make: PLATFORM=android ARCH=x86_64 + # sqlite-amalgamation-zip: https://sqlite.org/2025/sqlite-amalgamation-3490100.zip + # - name: ios + # os: macos-latest + # make: PLATFORM=ios + # - name: isim + # os: macos-latest + # make: PLATFORM=isim defaults: run: @@ -92,7 +92,7 @@ jobs: if: matrix.name == 'windows' run: make extension ${{ matrix.make && matrix.make || ''}} shell: msys2 {0} - + - name: build sqlite-ai if: matrix.name != 'windows' run: make extension ${{ matrix.make && matrix.make || ''}} @@ -101,7 +101,6 @@ jobs: if: matrix.name == 'macos' run: brew link sqlite --force - - name: android setup test environment if: matrix.name == 'android' && matrix.arch != 'arm64-v8a' run: | @@ -149,6 +148,15 @@ jobs: run: make test shell: msys2 {0} + - name: check whisper CoreML linking (macOS) + if: matrix.name == 'macos' + run: | + echo "Checking if whisper CoreML symbols are present..." + nm -D dist/ai.dylib | grep -i coreml || echo "CoreML symbols not found in binary" + otool -L dist/ai.dylib | grep CoreML || echo "CoreML framework not linked" + nm build/whisper.cpp/src/libwhisper.a | grep coreml + nm build/whisper.cpp/src/libwhisper.coreml.a | grep coreml + - name: test sqlite-ai if: matrix.name == 'linux' || matrix.name == 'macos' run: make test diff --git a/Makefile b/Makefile index 4c086af..59cc62b 100644 --- a/Makefile +++ b/Makefile @@ -24,20 +24,6 @@ endif # Speed up builds by using all available CPU cores MAKEFLAGS += -j$(CPUS) -# Compiler and flags -CC = gcc -CXX = g++ -CFLAGS = -Wall -Wextra -Wno-unused-parameter -I$(SRC_DIR) -I$(LLAMA_DIR)/ggml/include -I$(LLAMA_DIR)/include -I$(WHISPER_DIR)/include -I$(MINIAUDIO_DIR) -LDFLAGS = $(LLAMA_LDFLAGS) $(WHISPER_LDFLAGS) $(MINIAUDIO_LDFLAGS) -LLAMA_OPTIONS = $(LLAMA) -DLLAMA_CURL=OFF -DLLAMA_BUILD_EXAMPLES=OFF -DLLAMA_BUILD_TESTS=OFF -DLLAMA_BUILD_TOOLS=OFF -DLLAMA_BUILD_SERVER=OFF -WHISPER_OPTIONS = $(WHISPER) -DWHISPER_BUILD_EXAMPLES=OFF -DWHISPER_BUILD_TESTS=OFF -DWHISPER_BUILD_SERVER=OFF -MINIAUDIO_OPTIONS = -DMINIAUDIO_BUILD_EXAMPLES=OFF -DMINIAUDIO_BUILD_TESTS=OFF - -# Module-specific linking flags -LLAMA_LDFLAGS = -L./$(BUILD_LLAMA)/common -L./$(BUILD_LLAMA)/ggml/src -L./$(BUILD_LLAMA)/src -lcommon -lggml -lggml-cpu -lggml-base -lllama -WHISPER_LDFLAGS = -L./$(BUILD_WHISPER)/src -lwhisper -MINIAUDIO_LDFLAGS = -L./$(BUILD_MINIAUDIO) -lminiaudio - # Directories SRC_DIR = src DIST_DIR = dist @@ -50,6 +36,21 @@ BUILD_LLAMA = $(BUILD_DIR)/llama.cpp BUILD_WHISPER = $(BUILD_DIR)/whisper.cpp BUILD_MINIAUDIO = $(BUILD_DIR)/miniaudio +# Compiler and flags +CC = gcc +CXX = g++ +CFLAGS = -Wall -Wextra -Wno-unused-parameter -I$(SRC_DIR) -I$(LLAMA_DIR)/ggml/include -I$(LLAMA_DIR)/include -I$(WHISPER_DIR)/include -I$(MINIAUDIO_DIR) +LLAMA_OPTIONS = -DLLAMA_CURL=OFF -DLLAMA_BUILD_EXAMPLES=OFF -DLLAMA_BUILD_TESTS=OFF -DLLAMA_BUILD_TOOLS=OFF -DLLAMA_BUILD_SERVER=OFF +WHISPER_OPTIONS = -DWHISPER_BUILD_EXAMPLES=OFF -DWHISPER_BUILD_TESTS=OFF -DWHISPER_BUILD_SERVER=OFF +MINIAUDIO_OPTIONS = -DMINIAUDIO_BUILD_EXAMPLES=OFF -DMINIAUDIO_BUILD_TESTS=OFF + +# Module-specific linking flags +LLAMA_LDFLAGS = -L./$(BUILD_LLAMA)/common -L./$(BUILD_LLAMA)/ggml/src -L./$(BUILD_LLAMA)/src -lcommon -lggml -lggml-cpu -lggml-base -lllama +WHISPER_LDFLAGS = -L./$(BUILD_WHISPER)/src -lwhisper +MINIAUDIO_LDFLAGS = -L./$(BUILD_MINIAUDIO) -lminiaudio + +LDFLAGS = $(LLAMA_LDFLAGS) $(WHISPER_LDFLAGS) $(MINIAUDIO_LDFLAGS) + # Files SRC_FILES = $(wildcard $(SRC_DIR)/*.c) OBJ_FILES = $(patsubst %.c, $(BUILD_DIR)/%.o, $(notdir $(SRC_FILES))) @@ -67,12 +68,14 @@ ifeq ($(PLATFORM),windows) else ifeq ($(PLATFORM),macos) TARGET := $(DIST_DIR)/ai.dylib LLAMA_LIBS += $(BUILD_LLAMA)/ggml/src/ggml-metal/libggml-metal.a $(BUILD_LLAMA)/ggml/src/ggml-blas/libggml-blas.a - LDFLAGS += -arch x86_64 -arch arm64 -L./$(BUILD_LLAMA)/ggml/src/ggml-metal -lggml-metal -L./$(BUILD_LLAMA)/ggml/src/ggml-blas -lggml-blas -framework Metal -framework Foundation -framework CoreFoundation -framework QuartzCore -framework Accelerate -framework CoreML -dynamiclib -undefined dynamic_lookup + WHISPER_LIBS += $(BUILD_WHISPER)/src/libwhisper.coreml.a + LDFLAGS += -arch x86_64 -arch arm64 -L./$(BUILD_LLAMA)/ggml/src/ggml-metal -lggml-metal -L./$(BUILD_LLAMA)/ggml/src/ggml-blas -lggml-blas -Wl,-force_load,$(BUILD_WHISPER)/src/libwhisper.coreml.a -framework Metal -framework Foundation -framework CoreFoundation -framework QuartzCore -framework Accelerate -framework CoreML -dynamiclib -undefined dynamic_lookup CFLAGS += -arch x86_64 -arch arm64 LLAMA_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" WHISPER_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" -DWHISPER_COREML=ON MINIAUDIO_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" - STRIP = strip -x -S $@ + STRIP = true + # STRIP = strip -x -S $@ # Disabled for debugging symbol issues else ifeq ($(PLATFORM),android) # Set ARCH to find Android NDK's Clang compiler, the user should set the ARCH ifeq ($(filter %,$(ARCH)),) @@ -134,9 +137,9 @@ endif # Windows .def file generation $(DEF_FILE): ifeq ($(PLATFORM),windows) - @echo "LIBRARY ai.dll" > $@ - @echo "EXPORTS" >> $@ - @echo " sqlite3_ai_init" >> $@ + @echo "LIBRARY ai.dll" > $@ + @echo "EXPORTS" >> $@ + @echo " sqlite3_ai_init" >> $@ endif # Make sure the build and dist directories exist @@ -151,36 +154,36 @@ compile: $(OBJ_FILES) # Loadable library $(TARGET): $(DEF_FILE) $(LLAMA_LIBS) $(WHISPER_LIBS) $(MINIAUDIO_LIBS) - $(CXX) $(OBJ_FILES) $(DEF_FILE) -o $@ $(LDFLAGS) + $(CXX) $(OBJ_FILES) $(DEF_FILE) -o $@ $(LDFLAGS) ifeq ($(PLATFORM),windows) # Generate import library for Windows - dlltool -D $@ -d $(DEF_FILE) -l $(DIST_DIR)/ai.lib + dlltool -D $@ -d $(DEF_FILE) -l $(DIST_DIR)/ai.lib endif # Strip debug symbols - $(STRIP) + $(STRIP) # Object files $(BUILD_DIR)/%.o: %.c - $(CC) $(CFLAGS) -O3 -fPIC -c $< -o $@ + $(CC) $(CFLAGS) -O3 -fPIC -c $< -o $@ test: $(TARGET) - $(SQLITE3) ":memory:" -cmd ".bail on" ".load ./dist/ai" "SELECT ai_version();" + $(SQLITE3) ":memory:" -cmd ".bail on" ".load ./dist/ai" "SELECT ai_version();" # Build submodules (only after successful compilation of the extension) build/llama.cpp.stamp: | compile - cmake -B $(BUILD_LLAMA) $(LLAMA_OPTIONS) $(LLAMA_DIR) - cmake --build $(BUILD_LLAMA) --config Release -- -j$(CPUS) - touch $@ + cmake -B $(BUILD_LLAMA) $(LLAMA_OPTIONS) $(LLAMA_DIR) + cmake --build $(BUILD_LLAMA) --config Release -- -j$(CPUS) + touch $@ build/whisper.cpp.stamp: | compile - cmake -B $(BUILD_WHISPER) $(WHISPER_OPTIONS) $(WHISPER_DIR) - cmake --build $(BUILD_WHISPER) --config Release -- -j$(CPUS) - touch $@ + cmake -B $(BUILD_WHISPER) $(WHISPER_OPTIONS) $(WHISPER_DIR) + cmake --build $(BUILD_WHISPER) --config Release -- -j$(CPUS) + touch $@ build/miniaudio.stamp: | compile - cmake -B $(BUILD_MINIAUDIO) $(MINIAUDIO_OPTIONS) $(MINIAUDIO_DIR) - cmake --build $(BUILD_MINIAUDIO) --config Release -- -j$(CPUS) - touch $@ + cmake -B $(BUILD_MINIAUDIO) $(MINIAUDIO_OPTIONS) $(MINIAUDIO_DIR) + cmake --build $(BUILD_MINIAUDIO) --config Release -- -j$(CPUS) + touch $@ $(LLAMA_LIBS): build/llama.cpp.stamp $(WHISPER_LIBS): build/whisper.cpp.stamp @@ -188,30 +191,30 @@ $(MINIAUDIO_LIBS): build/miniaudio.stamp # Tools version: - @echo $(shell sed -n 's/^#define SQLITE_AI_VERSION[[:space:]]*"\([^"]*\)".*/\1/p' src/sqlite-ai.h) + @echo $(shell sed -n 's/^#define SQLITE_AI_VERSION[[:space:]]*"\([^"]*\)".*/\1/p' src/sqlite-ai.h) # Clean up generated files clean: - rm -rf $(BUILD_DIR)/* $(DIST_DIR)/* *.gcda *.gcno *.gcov *.sqlite + rm -rf $(BUILD_DIR)/* $(DIST_DIR)/* *.gcda *.gcno *.gcov *.sqlite # Help message help: - @echo "SQLite AI Extension Makefile" - @echo "Usage:" - @echo " make [PLATFORM=platform] [ARCH=arch] [ANDROID_NDK=\$$ANDROID_HOME/ndk/26.1.10909125] [target]" - @echo "" - @echo "Platforms:" - @echo " linux (default on Linux)" - @echo " macos (default on macOS)" - @echo " windows (default on Windows)" - @echo " android (needs ARCH to be set to x86_64 or arm64-v8a and ANDROID_NDK to be set)" - @echo " ios (only on macOS)" - @echo " isim (only on macOS)" - @echo "" - @echo "Targets:" - @echo " all - Build the extension (default)" - @echo " clean - Remove built files" - @echo " test - Test the extension" - @echo " help - Display this help message" + @echo "SQLite AI Extension Makefile" + @echo "Usage:" + @echo " make [PLATFORM=platform] [ARCH=arch] [ANDROID_NDK=\$$ANDROID_HOME/ndk/26.1.10909125] [target]" + @echo "" + @echo "Platforms:" + @echo " linux (default on Linux)" + @echo " macos (default on macOS)" + @echo " windows (default on Windows)" + @echo " android (needs ARCH to be set to x86_64 or arm64-v8a and ANDROID_NDK to be set)" + @echo " ios (only on macOS)" + @echo " isim (only on macOS)" + @echo "" + @echo "Targets:" + @echo " all - Build the extension (default)" + @echo " clean - Remove built files" + @echo " test - Test the extension" + @echo " help - Display this help message" .PHONY: all clean test extension help compile From 9a466f1fd506d36f998e1057214e371a5dc0449e Mon Sep 17 00:00:00 2001 From: Daniele Briggi <=> Date: Thu, 17 Jul 2025 13:13:39 +0200 Subject: [PATCH 38/42] fix(makefile): identation to tabs --- Makefile | 232 +++++++++++++++++++++++++++---------------------------- 1 file changed, 116 insertions(+), 116 deletions(-) diff --git a/Makefile b/Makefile index 59cc62b..40ee241 100644 --- a/Makefile +++ b/Makefile @@ -7,18 +7,18 @@ SQLITE3 ?= sqlite3 # Set default platform if not specified ifeq ($(OS),Windows_NT) - PLATFORM := windows - HOST := windows - CPUS := $(shell powershell -Command "[Environment]::ProcessorCount") + PLATFORM := windows + HOST := windows + CPUS := $(shell powershell -Command "[Environment]::ProcessorCount") else - HOST = $(shell uname -s | tr '[:upper:]' '[:lower:]') - ifeq ($(HOST),darwin) - PLATFORM := macos - CPUS := $(shell sysctl -n hw.ncpu) - else - PLATFORM := $(HOST) - CPUS := $(shell nproc) - endif + HOST = $(shell uname -s | tr '[:upper:]' '[:lower:]') + ifeq ($(HOST),darwin) + PLATFORM := macos + CPUS := $(shell sysctl -n hw.ncpu) + else + PLATFORM := $(HOST) + CPUS := $(shell nproc) + endif endif # Speed up builds by using all available CPU cores @@ -60,86 +60,86 @@ MINIAUDIO_LIBS = $(BUILD_MINIAUDIO)/libminiaudio.a # Platform-specific settings ifeq ($(PLATFORM),windows) - TARGET := $(DIST_DIR)/ai.dll - LDFLAGS = -L./$(BUILD_LLAMA)/common -L./$(BUILD_LLAMA)/ggml/src -L./$(BUILD_LLAMA)/src -L./$(BUILD_WHISPER)/src -L./$(BUILD_MINIAUDIO) -l:libllama.a -l:libwhisper.a -l:libminiaudio.a -l:libcommon.a -l:ggml.a -l:ggml-cpu.a -l:ggml-base.a -fopenmp -static-libgcc -static-libstdc++ -shared - # Create .def file for Windows - DEF_FILE := $(BUILD_DIR)/ai.def - STRIP = strip --strip-unneeded $@ + TARGET := $(DIST_DIR)/ai.dll + LDFLAGS = -L./$(BUILD_LLAMA)/common -L./$(BUILD_LLAMA)/ggml/src -L./$(BUILD_LLAMA)/src -L./$(BUILD_WHISPER)/src -L./$(BUILD_MINIAUDIO) -l:libllama.a -l:libwhisper.a -l:libminiaudio.a -l:libcommon.a -l:ggml.a -l:ggml-cpu.a -l:ggml-base.a -fopenmp -static-libgcc -static-libstdc++ -shared + # Create .def file for Windows + DEF_FILE := $(BUILD_DIR)/ai.def + STRIP = strip --strip-unneeded $@ else ifeq ($(PLATFORM),macos) - TARGET := $(DIST_DIR)/ai.dylib - LLAMA_LIBS += $(BUILD_LLAMA)/ggml/src/ggml-metal/libggml-metal.a $(BUILD_LLAMA)/ggml/src/ggml-blas/libggml-blas.a - WHISPER_LIBS += $(BUILD_WHISPER)/src/libwhisper.coreml.a - LDFLAGS += -arch x86_64 -arch arm64 -L./$(BUILD_LLAMA)/ggml/src/ggml-metal -lggml-metal -L./$(BUILD_LLAMA)/ggml/src/ggml-blas -lggml-blas -Wl,-force_load,$(BUILD_WHISPER)/src/libwhisper.coreml.a -framework Metal -framework Foundation -framework CoreFoundation -framework QuartzCore -framework Accelerate -framework CoreML -dynamiclib -undefined dynamic_lookup - CFLAGS += -arch x86_64 -arch arm64 - LLAMA_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" - WHISPER_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" -DWHISPER_COREML=ON - MINIAUDIO_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" - STRIP = true - # STRIP = strip -x -S $@ # Disabled for debugging symbol issues + TARGET := $(DIST_DIR)/ai.dylib + LLAMA_LIBS += $(BUILD_LLAMA)/ggml/src/ggml-metal/libggml-metal.a $(BUILD_LLAMA)/ggml/src/ggml-blas/libggml-blas.a + WHISPER_LIBS += $(BUILD_WHISPER)/src/libwhisper.coreml.a + LDFLAGS += -arch x86_64 -arch arm64 -L./$(BUILD_LLAMA)/ggml/src/ggml-metal -lggml-metal -L./$(BUILD_LLAMA)/ggml/src/ggml-blas -lggml-blas -Wl,-force_load,$(BUILD_WHISPER)/src/libwhisper.coreml.a -framework Metal -framework Foundation -framework CoreFoundation -framework QuartzCore -framework Accelerate -framework CoreML -dynamiclib -undefined dynamic_lookup + CFLAGS += -arch x86_64 -arch arm64 + LLAMA_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" + WHISPER_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" -DWHISPER_COREML=ON + MINIAUDIO_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" + STRIP = true + # STRIP = strip -x -S $@ else ifeq ($(PLATFORM),android) - # Set ARCH to find Android NDK's Clang compiler, the user should set the ARCH - ifeq ($(filter %,$(ARCH)),) - $(error "Android ARCH must be set to ARCH=x86_64 or ARCH=arm64-v8a") - endif - # 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 - ifeq ($(filter %,$(ANDROID_NDK)),) - $(error "Android NDK must be set") - endif - - BIN = $(ANDROID_NDK)/toolchains/llvm/prebuilt/$(HOST)-x86_64/bin - PATH := $(BIN):$(PATH) - - ifneq (,$(filter $(ARCH),arm64 arm64-v8a)) - override ARCH := aarch64 - endif - - CC = $(BIN)/$(ARCH)-linux-android26-clang - CXX = $(CC)++ - TARGET := $(DIST_DIR)/ai.so - LDFLAGS += -static-libstdc++ -shared - LLAMA_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_TOOLCHAIN_FILE=$(ANDROID_NDK)/build/cmake/android.toolchain.cmake -DANDROID_ABI=$(if $(filter aarch64,$(ARCH)),arm64-v8a,$(ARCH)) -DANDROID_PLATFORM=android-26 -DCMAKE_C_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,x86-64)" -DCMAKE_CXX_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,x86-64)" -DGGML_OPENMP=OFF -DGGML_LLAMAFILE=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON - WHISPER_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_TOOLCHAIN_FILE=$(ANDROID_NDK)/build/cmake/android.toolchain.cmake -DANDROID_ABI=$(if $(filter aarch64,$(ARCH)),arm64-v8a,$(ARCH)) -DANDROID_PLATFORM=android-26 -DCMAKE_C_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,x86-64)" -DCMAKE_CXX_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,x86-64)" -DGGML_OPENMP=OFF -DGGML_LLAMAFILE=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON - STRIP = $(BIN)/llvm-strip --strip-unneeded $@ + # Set ARCH to find Android NDK's Clang compiler, the user should set the ARCH + ifeq ($(filter %,$(ARCH)),) + $(error "Android ARCH must be set to ARCH=x86_64 or ARCH=arm64-v8a") + endif + # 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 + ifeq ($(filter %,$(ANDROID_NDK)),) + $(error "Android NDK must be set") + endif + + BIN = $(ANDROID_NDK)/toolchains/llvm/prebuilt/$(HOST)-x86_64/bin + PATH := $(BIN):$(PATH) + + ifneq (,$(filter $(ARCH),arm64 arm64-v8a)) + override ARCH := aarch64 + endif + + CC = $(BIN)/$(ARCH)-linux-android26-clang + CXX = $(CC)++ + TARGET := $(DIST_DIR)/ai.so + LDFLAGS += -static-libstdc++ -shared + LLAMA_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_TOOLCHAIN_FILE=$(ANDROID_NDK)/build/cmake/android.toolchain.cmake -DANDROID_ABI=$(if $(filter aarch64,$(ARCH)),arm64-v8a,$(ARCH)) -DANDROID_PLATFORM=android-26 -DCMAKE_C_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,x86-64)" -DCMAKE_CXX_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,x86-64)" -DGGML_OPENMP=OFF -DGGML_LLAMAFILE=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON + WHISPER_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_TOOLCHAIN_FILE=$(ANDROID_NDK)/build/cmake/android.toolchain.cmake -DANDROID_ABI=$(if $(filter aarch64,$(ARCH)),arm64-v8a,$(ARCH)) -DANDROID_PLATFORM=android-26 -DCMAKE_C_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,x86-64)" -DCMAKE_CXX_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,x86-64)" -DGGML_OPENMP=OFF -DGGML_LLAMAFILE=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON + STRIP = $(BIN)/llvm-strip --strip-unneeded $@ else ifeq ($(PLATFORM),ios) - CC = clang - CXX = $(CC)++ - TARGET := $(DIST_DIR)/ai.dylib - SDK := -isysroot $(shell xcrun --sdk iphoneos --show-sdk-path) -miphoneos-version-min=14.0 - LLAMA_LIBS += $(BUILD_LLAMA)/ggml/src/ggml-metal/libggml-metal.a $(BUILD_LLAMA)/ggml/src/ggml-blas/libggml-blas.a - # miniaudio requires -ldl for dlopen() and compile as Objective-C on iOS - # https://github.com/mackron/miniaudio/blob/master/README.md#building - LDFLAGS += -L./$(BUILD_LLAMA)/ggml/src/ggml-metal -lggml-metal -L./$(BUILD_LLAMA)/ggml/src/ggml-blas -lggml-blas -framework Accelerate -framework Metal -framework Foundation -framework CoreML -framework AVFoundation -framework AudioToolbox -framework Security -dynamiclib -ldl $(SDK) - CFLAGS += -arch arm64 -x objective-c $(SDK) - LLAMA_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 - WHISPER_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 -DWHISPER_COREML=ON - STRIP = strip -x -S $@ + CC = clang + CXX = $(CC)++ + TARGET := $(DIST_DIR)/ai.dylib + SDK := -isysroot $(shell xcrun --sdk iphoneos --show-sdk-path) -miphoneos-version-min=14.0 + LLAMA_LIBS += $(BUILD_LLAMA)/ggml/src/ggml-metal/libggml-metal.a $(BUILD_LLAMA)/ggml/src/ggml-blas/libggml-blas.a + # miniaudio requires -ldl for dlopen() and compile as Objective-C on iOS + # https://github.com/mackron/miniaudio/blob/master/README.md#building + LDFLAGS += -L./$(BUILD_LLAMA)/ggml/src/ggml-metal -lggml-metal -L./$(BUILD_LLAMA)/ggml/src/ggml-blas -lggml-blas -framework Accelerate -framework Metal -framework Foundation -framework CoreML -framework AVFoundation -framework AudioToolbox -framework Security -dynamiclib -ldl $(SDK) + CFLAGS += -arch arm64 -x objective-c $(SDK) + LLAMA_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 + WHISPER_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 -DWHISPER_COREML=ON + STRIP = strip -x -S $@ else ifeq ($(PLATFORM),isim) - TARGET := $(DIST_DIR)/ai.dylib - SDK := -isysroot $(shell xcrun --sdk iphonesimulator --show-sdk-path) -miphonesimulator-version-min=14.0 - LLAMA_LIBS += $(BUILD_LLAMA)/ggml/src/ggml-metal/libggml-metal.a $(BUILD_LLAMA)/ggml/src/ggml-blas/libggml-blas.a - LDFLAGS += -arch x86_64 -arch arm64 -L./$(BUILD_LLAMA)/ggml/src/ggml-metal -lggml-metal -L./$(BUILD_LLAMA)/ggml/src/ggml-blas -lggml-blas -framework Accelerate -framework Metal -framework Foundation -framework CoreML -dynamiclib $(SDK) - CFLAGS += -arch x86_64 -arch arm64 $(SDK) - LLAMA_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" - WHISPER_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" -DWHISPER_COREML=ON + TARGET := $(DIST_DIR)/ai.dylib + SDK := -isysroot $(shell xcrun --sdk iphonesimulator --show-sdk-path) -miphonesimulator-version-min=14.0 + LLAMA_LIBS += $(BUILD_LLAMA)/ggml/src/ggml-metal/libggml-metal.a $(BUILD_LLAMA)/ggml/src/ggml-blas/libggml-blas.a + LDFLAGS += -arch x86_64 -arch arm64 -L./$(BUILD_LLAMA)/ggml/src/ggml-metal -lggml-metal -L./$(BUILD_LLAMA)/ggml/src/ggml-blas -lggml-blas -framework Accelerate -framework Metal -framework Foundation -framework CoreML -dynamiclib $(SDK) + CFLAGS += -arch x86_64 -arch arm64 $(SDK) + LLAMA_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" + WHISPER_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" -DWHISPER_COREML=ON else # linux - TARGET := $(DIST_DIR)/ai.so - # using -DGGML_CPU_ALL_VARIANTS=ON - LDFLAGS := $(filter-out -lggml-cpu,$(LDFLAGS)) - LDFLAGS += -shared -L./$(BUILD_LLAMA)/bin -Wl,-rpath,./$(BUILD_LLAMA)/bin -Wl,-rpath,./$(BUILD_LLAMA)/common -Wl,-rpath,./$(BUILD_LLAMA)/ggml/src -Wl,-rpath,./$(BUILD_LLAMA)/src -Wl,-rpath,./$(BUILD_WHISPER)/src - # Add miniaudio Linux-specific flags (as per miniaudio docs) - MINIAUDIO_LDFLAGS += -lpthread -lm - LLAMA_OPTIONS += -DBUILD_SHARED_LIBS=ON -DGGML_OPENMP=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON - WHISPER_OPTIONS += -DBUILD_SHARED_LIBS=ON -DGGML_OPENMP=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON - STRIP = strip --strip-unneeded $@ + TARGET := $(DIST_DIR)/ai.so + # using -DGGML_CPU_ALL_VARIANTS=ON + LDFLAGS := $(filter-out -lggml-cpu,$(LDFLAGS)) + LDFLAGS += -shared -L./$(BUILD_LLAMA)/bin -Wl,-rpath,./$(BUILD_LLAMA)/bin -Wl,-rpath,./$(BUILD_LLAMA)/common -Wl,-rpath,./$(BUILD_LLAMA)/ggml/src -Wl,-rpath,./$(BUILD_LLAMA)/src -Wl,-rpath,./$(BUILD_WHISPER)/src + # Add miniaudio Linux-specific flags (as per miniaudio docs) + MINIAUDIO_LDFLAGS += -lpthread -lm + LLAMA_OPTIONS += -DBUILD_SHARED_LIBS=ON -DGGML_OPENMP=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON + WHISPER_OPTIONS += -DBUILD_SHARED_LIBS=ON -DGGML_OPENMP=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON + STRIP = strip --strip-unneeded $@ endif # Windows .def file generation $(DEF_FILE): ifeq ($(PLATFORM),windows) - @echo "LIBRARY ai.dll" > $@ - @echo "EXPORTS" >> $@ - @echo " sqlite3_ai_init" >> $@ + @echo "LIBRARY ai.dll" > $@ + @echo "EXPORTS" >> $@ + @echo " sqlite3_ai_init" >> $@ endif # Make sure the build and dist directories exist @@ -154,36 +154,36 @@ compile: $(OBJ_FILES) # Loadable library $(TARGET): $(DEF_FILE) $(LLAMA_LIBS) $(WHISPER_LIBS) $(MINIAUDIO_LIBS) - $(CXX) $(OBJ_FILES) $(DEF_FILE) -o $@ $(LDFLAGS) + $(CXX) $(OBJ_FILES) $(DEF_FILE) -o $@ $(LDFLAGS) ifeq ($(PLATFORM),windows) - # Generate import library for Windows - dlltool -D $@ -d $(DEF_FILE) -l $(DIST_DIR)/ai.lib + # Generate import library for Windows + dlltool -D $@ -d $(DEF_FILE) -l $(DIST_DIR)/ai.lib endif - # Strip debug symbols - $(STRIP) + # Strip debug symbols + $(STRIP) # Object files $(BUILD_DIR)/%.o: %.c - $(CC) $(CFLAGS) -O3 -fPIC -c $< -o $@ + $(CC) $(CFLAGS) -O3 -fPIC -c $< -o $@ test: $(TARGET) - $(SQLITE3) ":memory:" -cmd ".bail on" ".load ./dist/ai" "SELECT ai_version();" + $(SQLITE3) ":memory:" -cmd ".bail on" ".load ./dist/ai" "SELECT ai_version();" # Build submodules (only after successful compilation of the extension) build/llama.cpp.stamp: | compile - cmake -B $(BUILD_LLAMA) $(LLAMA_OPTIONS) $(LLAMA_DIR) - cmake --build $(BUILD_LLAMA) --config Release -- -j$(CPUS) - touch $@ + cmake -B $(BUILD_LLAMA) $(LLAMA_OPTIONS) $(LLAMA_DIR) + cmake --build $(BUILD_LLAMA) --config Release -- -j$(CPUS) + touch $@ build/whisper.cpp.stamp: | compile - cmake -B $(BUILD_WHISPER) $(WHISPER_OPTIONS) $(WHISPER_DIR) - cmake --build $(BUILD_WHISPER) --config Release -- -j$(CPUS) - touch $@ + cmake -B $(BUILD_WHISPER) $(WHISPER_OPTIONS) $(WHISPER_DIR) + cmake --build $(BUILD_WHISPER) --config Release -- -j$(CPUS) + touch $@ build/miniaudio.stamp: | compile - cmake -B $(BUILD_MINIAUDIO) $(MINIAUDIO_OPTIONS) $(MINIAUDIO_DIR) - cmake --build $(BUILD_MINIAUDIO) --config Release -- -j$(CPUS) - touch $@ + cmake -B $(BUILD_MINIAUDIO) $(MINIAUDIO_OPTIONS) $(MINIAUDIO_DIR) + cmake --build $(BUILD_MINIAUDIO) --config Release -- -j$(CPUS) + touch $@ $(LLAMA_LIBS): build/llama.cpp.stamp $(WHISPER_LIBS): build/whisper.cpp.stamp @@ -191,30 +191,30 @@ $(MINIAUDIO_LIBS): build/miniaudio.stamp # Tools version: - @echo $(shell sed -n 's/^#define SQLITE_AI_VERSION[[:space:]]*"\([^"]*\)".*/\1/p' src/sqlite-ai.h) + @echo $(shell sed -n 's/^#define SQLITE_AI_VERSION[[:space:]]*"\([^"]*\)".*/\1/p' src/sqlite-ai.h) # Clean up generated files clean: - rm -rf $(BUILD_DIR)/* $(DIST_DIR)/* *.gcda *.gcno *.gcov *.sqlite + rm -rf $(BUILD_DIR)/* $(DIST_DIR)/* *.gcda *.gcno *.gcov *.sqlite # Help message help: - @echo "SQLite AI Extension Makefile" - @echo "Usage:" - @echo " make [PLATFORM=platform] [ARCH=arch] [ANDROID_NDK=\$$ANDROID_HOME/ndk/26.1.10909125] [target]" - @echo "" - @echo "Platforms:" - @echo " linux (default on Linux)" - @echo " macos (default on macOS)" - @echo " windows (default on Windows)" - @echo " android (needs ARCH to be set to x86_64 or arm64-v8a and ANDROID_NDK to be set)" - @echo " ios (only on macOS)" - @echo " isim (only on macOS)" - @echo "" - @echo "Targets:" - @echo " all - Build the extension (default)" - @echo " clean - Remove built files" - @echo " test - Test the extension" - @echo " help - Display this help message" + @echo "SQLite AI Extension Makefile" + @echo "Usage:" + @echo " make [PLATFORM=platform] [ARCH=arch] [ANDROID_NDK=\$$ANDROID_HOME/ndk/26.1.10909125] [target]" + @echo "" + @echo "Platforms:" + @echo " linux (default on Linux)" + @echo " macos (default on macOS)" + @echo " windows (default on Windows)" + @echo " android (needs ARCH to be set to x86_64 or arm64-v8a and ANDROID_NDK to be set)" + @echo " ios (only on macOS)" + @echo " isim (only on macOS)" + @echo "" + @echo "Targets:" + @echo " all - Build the extension (default)" + @echo " clean - Remove built files" + @echo " test - Test the extension" + @echo " help - Display this help message" .PHONY: all clean test extension help compile From a0494453bb487a98ad0d8baf7c0206b0c08ef920 Mon Sep 17 00:00:00 2001 From: Daniele Briggi <=> Date: Thu, 17 Jul 2025 14:27:01 +0200 Subject: [PATCH 39/42] fix(windows): use GetSystemTimeAsFileTime for timestamp - missing liks to bcrypt library --- .github/workflows/main.yml | 15 +++------------ Makefile | 2 +- src/utils.c | 14 ++++++++++++-- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 1686670..c67b0b3 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -21,9 +21,9 @@ jobs: # make: LLAMA="-DGGML_BACKEND_DL=ON -DGGML_NATIVE=OFF -DGGML_CPU_ALL_VARIANTS=ON -DGGML_VULKAN=ON" - name: macos os: macos-latest - # - name: windows - # os: windows-latest - # arch: x86_64 + - name: windows + os: windows-latest + arch: x86_64 # - name: android # os: ubuntu-latest # arch: arm64-v8a @@ -148,15 +148,6 @@ jobs: run: make test shell: msys2 {0} - - name: check whisper CoreML linking (macOS) - if: matrix.name == 'macos' - run: | - echo "Checking if whisper CoreML symbols are present..." - nm -D dist/ai.dylib | grep -i coreml || echo "CoreML symbols not found in binary" - otool -L dist/ai.dylib | grep CoreML || echo "CoreML framework not linked" - nm build/whisper.cpp/src/libwhisper.a | grep coreml - nm build/whisper.cpp/src/libwhisper.coreml.a | grep coreml - - name: test sqlite-ai if: matrix.name == 'linux' || matrix.name == 'macos' run: make test diff --git a/Makefile b/Makefile index 40ee241..becde51 100644 --- a/Makefile +++ b/Makefile @@ -61,7 +61,7 @@ MINIAUDIO_LIBS = $(BUILD_MINIAUDIO)/libminiaudio.a # Platform-specific settings ifeq ($(PLATFORM),windows) TARGET := $(DIST_DIR)/ai.dll - LDFLAGS = -L./$(BUILD_LLAMA)/common -L./$(BUILD_LLAMA)/ggml/src -L./$(BUILD_LLAMA)/src -L./$(BUILD_WHISPER)/src -L./$(BUILD_MINIAUDIO) -l:libllama.a -l:libwhisper.a -l:libminiaudio.a -l:libcommon.a -l:ggml.a -l:ggml-cpu.a -l:ggml-base.a -fopenmp -static-libgcc -static-libstdc++ -shared + LDFLAGS = -L./$(BUILD_LLAMA)/common -L./$(BUILD_LLAMA)/ggml/src -L./$(BUILD_LLAMA)/src -L./$(BUILD_WHISPER)/src -L./$(BUILD_MINIAUDIO) -l:libllama.a -l:libwhisper.a -l:libminiaudio.a -l:libcommon.a -l:ggml.a -l:ggml-cpu.a -l:ggml-base.a -fopenmp -static-libgcc -static-libstdc++ -shared -lbcrypt # Create .def file for Windows DEF_FILE := $(BUILD_DIR)/ai.def STRIP = strip --strip-unneeded $@ diff --git a/src/utils.c b/src/utils.c index cca1f21..b2c3627 100644 --- a/src/utils.c +++ b/src/utils.c @@ -369,15 +369,25 @@ int ai_uuid_v7_generate (uint8_t value[UUID_LEN]) { #endif // get current timestamp in ms + uint64_t timestamp; + #if defined(_WIN32) + // Use GetSystemTimeAsFileTime for Windows/MinGW + FILETIME ft; + GetSystemTimeAsFileTime(&ft); + uint64_t t = ((uint64_t)ft.dwHighDateTime << 32) | ft.dwLowDateTime; + // Convert FILETIME (100-ns intervals since Jan 1, 1601) to ms since Unix epoch + timestamp = (t / 10000ULL) - 11644473600000ULL; + #else struct timespec ts; - #ifdef __ANDROID__ + #if defined(__ANDROID__) if (clock_gettime(CLOCK_REALTIME, &ts) != 0) return -1; #else if (timespec_get(&ts, TIME_UTC) == 0) return -1; #endif + timestamp = (uint64_t)ts.tv_sec * 1000 + ts.tv_nsec / 1000000; + #endif // add timestamp part to UUID - uint64_t timestamp = (uint64_t)ts.tv_sec * 1000 + ts.tv_nsec / 1000000; value[0] = (timestamp >> 40) & 0xFF; value[1] = (timestamp >> 32) & 0xFF; value[2] = (timestamp >> 24) & 0xFF; From 3c3b30059cfe3f148fdd5265129dc06abd1d011c Mon Sep 17 00:00:00 2001 From: Daniele Briggi <=> Date: Thu, 17 Jul 2025 16:06:35 +0200 Subject: [PATCH 40/42] feat(makefile): miniaudio built for android --- .github/workflows/main.yml | 26 +++++++++++++------------- Makefile | 5 ++++- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c67b0b3..bbaa149 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -15,24 +15,24 @@ jobs: fail-fast: false matrix: include: - # - name: linux-vulkan - # os: ubuntu-latest - # arch: x86_64 - # make: LLAMA="-DGGML_BACKEND_DL=ON -DGGML_NATIVE=OFF -DGGML_CPU_ALL_VARIANTS=ON -DGGML_VULKAN=ON" + - name: linux-vulkan + os: ubuntu-latest + arch: x86_64 + make: LLAMA="-DGGML_BACKEND_DL=ON -DGGML_NATIVE=OFF -DGGML_CPU_ALL_VARIANTS=ON -DGGML_VULKAN=ON" - name: macos os: macos-latest - name: windows os: windows-latest arch: x86_64 - # - name: android - # os: ubuntu-latest - # arch: arm64-v8a - # make: PLATFORM=android ARCH=arm64-v8a - # - name: android - # os: ubuntu-latest - # arch: x86_64 - # make: PLATFORM=android ARCH=x86_64 - # sqlite-amalgamation-zip: https://sqlite.org/2025/sqlite-amalgamation-3490100.zip + - name: android + os: ubuntu-latest + arch: arm64-v8a + make: PLATFORM=android ARCH=arm64-v8a + - name: android + os: ubuntu-latest + arch: x86_64 + make: PLATFORM=android ARCH=x86_64 + sqlite-amalgamation-zip: https://sqlite.org/2025/sqlite-amalgamation-3490100.zip # - name: ios # os: macos-latest # make: PLATFORM=ios diff --git a/Makefile b/Makefile index becde51..b082f24 100644 --- a/Makefile +++ b/Makefile @@ -74,8 +74,10 @@ else ifeq ($(PLATFORM),macos) LLAMA_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" WHISPER_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" -DWHISPER_COREML=ON MINIAUDIO_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" - STRIP = true + # Strip removes symbols that are needed for the extension to work properly because loaded via `dlopen()`: + # Error: dlopen(./dist/ai.dylib, 0x000A): symbol not found in flat namespace '_whisper_coreml_encode' # STRIP = strip -x -S $@ + STRIP = true else ifeq ($(PLATFORM),android) # Set ARCH to find Android NDK's Clang compiler, the user should set the ARCH ifeq ($(filter %,$(ARCH)),) @@ -100,6 +102,7 @@ else ifeq ($(PLATFORM),android) LDFLAGS += -static-libstdc++ -shared LLAMA_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_TOOLCHAIN_FILE=$(ANDROID_NDK)/build/cmake/android.toolchain.cmake -DANDROID_ABI=$(if $(filter aarch64,$(ARCH)),arm64-v8a,$(ARCH)) -DANDROID_PLATFORM=android-26 -DCMAKE_C_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,x86-64)" -DCMAKE_CXX_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,x86-64)" -DGGML_OPENMP=OFF -DGGML_LLAMAFILE=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON WHISPER_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_TOOLCHAIN_FILE=$(ANDROID_NDK)/build/cmake/android.toolchain.cmake -DANDROID_ABI=$(if $(filter aarch64,$(ARCH)),arm64-v8a,$(ARCH)) -DANDROID_PLATFORM=android-26 -DCMAKE_C_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,x86-64)" -DCMAKE_CXX_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,x86-64)" -DGGML_OPENMP=OFF -DGGML_LLAMAFILE=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON + MINIAUDIO_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_TOOLCHAIN_FILE=$(ANDROID_NDK)/build/cmake/android.toolchain.cmake -DANDROID_ABI=$(if $(filter aarch64,$(ARCH)),arm64-v8a,$(ARCH)) -DANDROID_PLATFORM=android-26 -DCMAKE_C_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,x86-64)" -DCMAKE_CXX_FLAGS="-march=$(if $(filter aarch64,$(ARCH)),armv8.7a,x86-64)" -DCMAKE_POSITION_INDEPENDENT_CODE=ON STRIP = $(BIN)/llvm-strip --strip-unneeded $@ else ifeq ($(PLATFORM),ios) CC = clang From 82e79e9180b6cfdd6945a4573d3f82524ee8f44d Mon Sep 17 00:00:00 2001 From: Daniele Briggi <=> Date: Thu, 17 Jul 2025 17:01:11 +0200 Subject: [PATCH 41/42] feat(ios): restore workflows for iOS builds --- .github/workflows/main.yml | 12 ++++++------ Makefile | 9 +++++---- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index bbaa149..61f648f 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -33,12 +33,12 @@ jobs: arch: x86_64 make: PLATFORM=android ARCH=x86_64 sqlite-amalgamation-zip: https://sqlite.org/2025/sqlite-amalgamation-3490100.zip - # - name: ios - # os: macos-latest - # make: PLATFORM=ios - # - name: isim - # os: macos-latest - # make: PLATFORM=isim + - name: ios + os: macos-latest + make: PLATFORM=ios + - name: isim + os: macos-latest + make: PLATFORM=isim defaults: run: diff --git a/Makefile b/Makefile index b082f24..023c62b 100644 --- a/Makefile +++ b/Makefile @@ -110,9 +110,10 @@ else ifeq ($(PLATFORM),ios) TARGET := $(DIST_DIR)/ai.dylib SDK := -isysroot $(shell xcrun --sdk iphoneos --show-sdk-path) -miphoneos-version-min=14.0 LLAMA_LIBS += $(BUILD_LLAMA)/ggml/src/ggml-metal/libggml-metal.a $(BUILD_LLAMA)/ggml/src/ggml-blas/libggml-blas.a - # miniaudio requires -ldl for dlopen() and compile as Objective-C on iOS + # Need to force-load `libwhisper.coreml.a` for CoreML because dinamically loaded on runtime and the compiler strips the symbols + LDFLAGS += -L./$(BUILD_LLAMA)/ggml/src/ggml-metal -lggml-metal -L./$(BUILD_LLAMA)/ggml/src/ggml-blas -lggml-blas -Wl,-force_load,$(BUILD_WHISPER)/src/libwhisper.coreml.a -framework Accelerate -framework Metal -framework Foundation -framework CoreML -framework AVFoundation -framework AudioToolbox -framework Security -dynamiclib $(SDK) + # Miniaudio requires to compile as Objective-C on iOS # https://github.com/mackron/miniaudio/blob/master/README.md#building - LDFLAGS += -L./$(BUILD_LLAMA)/ggml/src/ggml-metal -lggml-metal -L./$(BUILD_LLAMA)/ggml/src/ggml-blas -lggml-blas -framework Accelerate -framework Metal -framework Foundation -framework CoreML -framework AVFoundation -framework AudioToolbox -framework Security -dynamiclib -ldl $(SDK) CFLAGS += -arch arm64 -x objective-c $(SDK) LLAMA_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 WHISPER_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 -DWHISPER_COREML=ON @@ -121,8 +122,8 @@ else ifeq ($(PLATFORM),isim) TARGET := $(DIST_DIR)/ai.dylib SDK := -isysroot $(shell xcrun --sdk iphonesimulator --show-sdk-path) -miphonesimulator-version-min=14.0 LLAMA_LIBS += $(BUILD_LLAMA)/ggml/src/ggml-metal/libggml-metal.a $(BUILD_LLAMA)/ggml/src/ggml-blas/libggml-blas.a - LDFLAGS += -arch x86_64 -arch arm64 -L./$(BUILD_LLAMA)/ggml/src/ggml-metal -lggml-metal -L./$(BUILD_LLAMA)/ggml/src/ggml-blas -lggml-blas -framework Accelerate -framework Metal -framework Foundation -framework CoreML -dynamiclib $(SDK) - CFLAGS += -arch x86_64 -arch arm64 $(SDK) + LDFLAGS += -arch x86_64 -arch arm64 -L./$(BUILD_LLAMA)/ggml/src/ggml-metal -lggml-metal -L./$(BUILD_LLAMA)/ggml/src/ggml-blas -lggml-blas -Wl,-force_load,$(BUILD_WHISPER)/src/libwhisper.coreml.a -framework Accelerate -framework Metal -framework Foundation -framework CoreML -framework AVFoundation -framework AudioToolbox -framework Security -dynamiclib $(SDK) + CFLAGS += -arch x86_64 -arch arm64 -x objective-c $(SDK) LLAMA_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" WHISPER_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" -DWHISPER_COREML=ON else # linux From 08d53d794cd96db32b938a0f1dd7368ca02110c9 Mon Sep 17 00:00:00 2001 From: Daniele Briggi <=> Date: Fri, 18 Jul 2025 09:49:20 +0200 Subject: [PATCH 42/42] feat(windows-cuda): make CUDA for Windows --- .github/workflows/main.yml | 87 ++++++++++++++++++++------------------ Makefile | 26 ++++++++---- 2 files changed, 63 insertions(+), 50 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 61f648f..2d47d57 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -15,30 +15,34 @@ jobs: fail-fast: false matrix: include: - - name: linux-vulkan - os: ubuntu-latest - arch: x86_64 - make: LLAMA="-DGGML_BACKEND_DL=ON -DGGML_NATIVE=OFF -DGGML_CPU_ALL_VARIANTS=ON -DGGML_VULKAN=ON" - - name: macos - os: macos-latest + # - name: linux-vulkan + # os: ubuntu-latest + # arch: x86_64 + # make: LLAMA="-DGGML_BACKEND_DL=ON -DGGML_NATIVE=OFF -DGGML_CPU_ALL_VARIANTS=ON -DGGML_VULKAN=ON" + # - name: macos + # os: macos-latest - name: windows os: windows-latest arch: x86_64 - - name: android - os: ubuntu-latest - arch: arm64-v8a - make: PLATFORM=android ARCH=arm64-v8a - - name: android - os: ubuntu-latest + - name: windows-cuda + os: windows-latest arch: x86_64 - make: PLATFORM=android ARCH=x86_64 - sqlite-amalgamation-zip: https://sqlite.org/2025/sqlite-amalgamation-3490100.zip - - name: ios - os: macos-latest - make: PLATFORM=ios - - name: isim - os: macos-latest - make: PLATFORM=isim + make: LLAMA="-DGGML_BACKEND_DL=ON -DGGML_NATIVE=OFF -DGGML_CPU=OFF -DGGML_CUDA=ON" + # - name: android + # os: ubuntu-latest + # arch: arm64-v8a + # make: PLATFORM=android ARCH=arm64-v8a + # - name: android + # os: ubuntu-latest + # arch: x86_64 + # make: PLATFORM=android ARCH=x86_64 + # sqlite-amalgamation-zip: https://sqlite.org/2025/sqlite-amalgamation-3490100.zip + # - name: ios + # os: macos-latest + # make: PLATFORM=ios + # - name: isim + # os: macos-latest + # make: PLATFORM=isim defaults: run: @@ -50,15 +54,6 @@ jobs: with: submodules: true - - uses: msys2/setup-msys2@v2.27.0 - if: matrix.os == 'windows-latest' - with: - msystem: mingw64 - install: >- - mingw-w64-x86_64-cc - mingw-w64-x86_64-cmake - make - - name: linux install dependencies if: matrix.name == 'linux-vulkan' run: | @@ -82,17 +77,24 @@ jobs: echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH" >> $GITHUB_ENV echo "VK_ADD_LAYER_PATH=$VK_ADD_LAYER_PATH" >> $GITHUB_ENV - - name: windows install dependencies - if: matrix.os == 'windows-latest' + + - name: Install CUDA Toolkit + if: matrix.name == 'windows-cuda' run: | - pacman -S --noconfirm git sqlite3 - shell: msys2 {0} + choco install cuda -y --no-progress + shell: powershell - - name: windows build sqlite-ai - if: matrix.name == 'windows' - run: make extension ${{ matrix.make && matrix.make || ''}} - shell: msys2 {0} - + - name: Setup MSBuild + if: matrix.name == 'windows' || matrix.name == 'windows-cuda' + uses: microsoft/setup-msbuild@v2 + + - name: Windows build sqlite-ai + if: matrix.name == 'windows' || matrix.name == 'windows-cuda' + shell: cmd + run: | + call "%VSINSTALLDIR%\VC\Auxiliary\Build\vcvars64.bat" + nmake /f Makefile PLATFORM=windows ${{ matrix.make && matrix.make || ''}} + - name: build sqlite-ai if: matrix.name != 'windows' run: make extension ${{ matrix.make && matrix.make || ''}} @@ -143,10 +145,13 @@ jobs: adb push ${{ github.workspace }}/. /data/local/tmp/ adb shell "sh /data/local/tmp/commands.sh" + - name: windows test sqlite-ai - if: matrix.name == 'windows' - run: make test - shell: msys2 {0} + if: matrix.os == 'windows-latest' + run: | + call "%ProgramFiles(x86)%\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" + nmake /f Makefile test PLATFORM=windows + shell: cmd - name: test sqlite-ai if: matrix.name == 'linux' || matrix.name == 'macos' diff --git a/Makefile b/Makefile index 023c62b..4b2d5d0 100644 --- a/Makefile +++ b/Makefile @@ -36,6 +36,7 @@ BUILD_LLAMA = $(BUILD_DIR)/llama.cpp BUILD_WHISPER = $(BUILD_DIR)/whisper.cpp BUILD_MINIAUDIO = $(BUILD_DIR)/miniaudio +OBJ_EXT = o # Compiler and flags CC = gcc CXX = g++ @@ -53,18 +54,21 @@ LDFLAGS = $(LLAMA_LDFLAGS) $(WHISPER_LDFLAGS) $(MINIAUDIO_LDFLAGS) # Files SRC_FILES = $(wildcard $(SRC_DIR)/*.c) -OBJ_FILES = $(patsubst %.c, $(BUILD_DIR)/%.o, $(notdir $(SRC_FILES))) +OBJ_FILES = $(patsubst %.c, $(BUILD_DIR)/%.$(OBJ_EXT), $(notdir $(SRC_FILES))) LLAMA_LIBS = $(BUILD_LLAMA)/common/libcommon.a $(BUILD_LLAMA)/ggml/src/libggml.a $(BUILD_LLAMA)/ggml/src/libggml-base.a $(BUILD_LLAMA)/ggml/src/libggml-cpu.a $(BUILD_LLAMA)/src/libllama.a WHISPER_LIBS = $(BUILD_WHISPER)/src/libwhisper.a MINIAUDIO_LIBS = $(BUILD_MINIAUDIO)/libminiaudio.a # Platform-specific settings ifeq ($(PLATFORM),windows) + OBJ_EXT = obj + CC = cl + CXX = cl TARGET := $(DIST_DIR)/ai.dll - LDFLAGS = -L./$(BUILD_LLAMA)/common -L./$(BUILD_LLAMA)/ggml/src -L./$(BUILD_LLAMA)/src -L./$(BUILD_WHISPER)/src -L./$(BUILD_MINIAUDIO) -l:libllama.a -l:libwhisper.a -l:libminiaudio.a -l:libcommon.a -l:ggml.a -l:ggml-cpu.a -l:ggml-base.a -fopenmp -static-libgcc -static-libstdc++ -shared -lbcrypt - # Create .def file for Windows + CFLAGS = /nologo /W3 /EHsc /I$(SRC_DIR) /I$(LLAMA_DIR)/ggml/include /I$(LLAMA_DIR)/include /I$(WHISPER_DIR)/include /I$(MINIAUDIO_DIR) /MD + LDFLAGS = /DLL /OUT:$(TARGET) /LIBPATH:$(BUILD_LLAMA)/common /LIBPATH:$(BUILD_LLAMA)/ggml/src /LIBPATH:$(BUILD_LLAMA)/src /LIBPATH:$(BUILD_WHISPER)/src /LIBPATH:$(BUILD_MINIAUDIO) common.lib ggml.lib ggml-cpu.lib ggml-base.lib llama.lib whisper.lib miniaudio.lib bcrypt.lib DEF_FILE := $(BUILD_DIR)/ai.def - STRIP = strip --strip-unneeded $@ + STRIP = echo "No strip needed for MSVC" else ifeq ($(PLATFORM),macos) TARGET := $(DIST_DIR)/ai.dylib LLAMA_LIBS += $(BUILD_LLAMA)/ggml/src/ggml-metal/libggml-metal.a $(BUILD_LLAMA)/ggml/src/ggml-blas/libggml-blas.a @@ -128,7 +132,7 @@ else ifeq ($(PLATFORM),isim) WHISPER_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" -DWHISPER_COREML=ON else # linux TARGET := $(DIST_DIR)/ai.so - # using -DGGML_CPU_ALL_VARIANTS=ON + # Using -DGGML_CPU_ALL_VARIANTS=ON, `-lggml-cpu` is not needed LDFLAGS := $(filter-out -lggml-cpu,$(LDFLAGS)) LDFLAGS += -shared -L./$(BUILD_LLAMA)/bin -Wl,-rpath,./$(BUILD_LLAMA)/bin -Wl,-rpath,./$(BUILD_LLAMA)/common -Wl,-rpath,./$(BUILD_LLAMA)/ggml/src -Wl,-rpath,./$(BUILD_LLAMA)/src -Wl,-rpath,./$(BUILD_WHISPER)/src # Add miniaudio Linux-specific flags (as per miniaudio docs) @@ -158,17 +162,21 @@ compile: $(OBJ_FILES) # Loadable library $(TARGET): $(DEF_FILE) $(LLAMA_LIBS) $(WHISPER_LIBS) $(MINIAUDIO_LIBS) - $(CXX) $(OBJ_FILES) $(DEF_FILE) -o $@ $(LDFLAGS) ifeq ($(PLATFORM),windows) - # Generate import library for Windows - dlltool -D $@ -d $(DEF_FILE) -l $(DIST_DIR)/ai.lib + $(CXX) $(OBJ_FILES) /link $(LDFLAGS) +else + $(CXX) $(OBJ_FILES) $(DEF_FILE) -o $@ $(LDFLAGS) endif - # Strip debug symbols $(STRIP) # Object files +ifeq ($(PLATFORM),windows) +$(BUILD_DIR)/%.obj: %.c + $(CC) $(CFLAGS) /c $< /Fo$@ +else $(BUILD_DIR)/%.o: %.c $(CC) $(CFLAGS) -O3 -fPIC -c $< -o $@ +endif test: $(TARGET) $(SQLITE3) ":memory:" -cmd ".bail on" ".load ./dist/ai" "SELECT ai_version();"