@@ -36,52 +36,44 @@ BUILD_LLAMA = $(BUILD_DIR)/llama.cpp
3636BUILD_WHISPER = $(BUILD_DIR ) /whisper.cpp
3737BUILD_MINIAUDIO = $(BUILD_DIR ) /miniaudio
3838
39- OBJ_EXT = o
4039# Compiler and flags
4140CC = gcc
4241CXX = g++
4342CFLAGS = -Wall -Wextra -Wno-unused-parameter -I$(SRC_DIR ) -I$(LLAMA_DIR ) /ggml/include -I$(LLAMA_DIR ) /include -I$(WHISPER_DIR ) /include -I$(MINIAUDIO_DIR )
44- LLAMA_OPTIONS = -DLLAMA_CURL=OFF -DLLAMA_BUILD_EXAMPLES=OFF -DLLAMA_BUILD_TESTS=OFF -DLLAMA_BUILD_TOOLS=OFF -DLLAMA_BUILD_SERVER=OFF
45- WHISPER_OPTIONS = -DWHISPER_BUILD_EXAMPLES=OFF -DWHISPER_BUILD_TESTS=OFF -DWHISPER_BUILD_SERVER=OFF
46- MINIAUDIO_OPTIONS = -DMINIAUDIO_BUILD_EXAMPLES=OFF -DMINIAUDIO_BUILD_TESTS=OFF
47-
48- # Module-specific linking flags
49- LLAMA_LDFLAGS = -L./$(BUILD_LLAMA ) /common -L./$(BUILD_LLAMA ) /ggml/src -L./$(BUILD_LLAMA ) /src -lcommon -lggml -lggml-cpu -lggml-base -lllama
43+ LLAMA_OPTIONS = $(LLAMA ) -DBUILD_SHARED_LIBS=OFF -DLLAMA_CURL=OFF -DLLAMA_BUILD_EXAMPLES=OFF -DLLAMA_BUILD_TESTS=OFF -DLLAMA_BUILD_TOOLS=OFF -DLLAMA_BUILD_SERVER=OFF
44+ WHISPER_OPTIONS = $(WHISPER ) -DBUILD_SHARED_LIBS=OFF -DWHISPER_BUILD_EXAMPLES=OFF -DWHISPER_BUILD_TESTS=OFF -DWHISPER_BUILD_SERVER=OFF
45+ MINIAUDIO_OPTIONS = $(MINIAUDIO ) -DBUILD_SHARED_LIBS=OFF -DMINIAUDIO_BUILD_EXAMPLES=OFF -DMINIAUDIO_BUILD_TESTS=OFF
46+ # Module-specific linker flags
47+ LLAMA_LDFLAGS = -L./$(BUILD_LLAMA ) /common -L./$(BUILD_LLAMA ) /ggml/src -L./$(BUILD_LLAMA ) /src -lcommon -lggml -lggml-base -lggml-cpu -lllama
5048WHISPER_LDFLAGS = -L./$(BUILD_WHISPER ) /src -lwhisper
5149MINIAUDIO_LDFLAGS = -L./$(BUILD_MINIAUDIO ) -lminiaudio
52-
5350LDFLAGS = $(LLAMA_LDFLAGS ) $(WHISPER_LDFLAGS ) $(MINIAUDIO_LDFLAGS )
5451
5552# Files
5653SRC_FILES = $(wildcard $(SRC_DIR ) /* .c)
57- OBJ_FILES = $(patsubst % .c, $(BUILD_DIR ) /% .$( OBJ_EXT ) , $(notdir $(SRC_FILES ) ) )
54+ OBJ_FILES = $(patsubst % .c, $(BUILD_DIR ) /% .o , $(notdir $(SRC_FILES ) ) )
5855LLAMA_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
5956WHISPER_LIBS = $(BUILD_WHISPER ) /src/libwhisper.a
6057MINIAUDIO_LIBS = $(BUILD_MINIAUDIO ) /libminiaudio.a
6158
6259# Platform-specific settings
6360ifeq ($(PLATFORM ) ,windows)
64- OBJ_EXT = obj
65- CC = cl
66- CXX = cl
6761 TARGET := $(DIST_DIR)/ai.dll
68- CFLAGS = /nologo /W3 /EHsc /I$(SRC_DIR) /I$(LLAMA_DIR)/ggml/include /I$(LLAMA_DIR)/include /I$(WHISPER_DIR)/include /I$(MINIAUDIO_DIR) /MD
69- 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
62+ LDFLAGS += -shared
63+ # Create .def file for Windows
7064 DEF_FILE := $(BUILD_DIR)/ai.def
71- STRIP = echo "No strip needed for MSVC"
65+ STRIP = strip -- strip-unneeded $@
7266else ifeq ($(PLATFORM),macos)
7367 TARGET := $(DIST_DIR)/ai.dylib
7468 LLAMA_LIBS += $(BUILD_LLAMA)/ggml/src/ggml-metal/libggml-metal.a $(BUILD_LLAMA)/ggml/src/ggml-blas/libggml-blas.a
7569 WHISPER_LIBS += $(BUILD_WHISPER)/src/libwhisper.coreml.a
76- 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
70+ WHISPER_LDFLAGS += -lwhisper.coreml
71+ 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
7772 CFLAGS += -arch x86_64 -arch arm64
78- LLAMA_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64"
79- WHISPER_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" -DWHISPER_COREML=ON
80- MINIAUDIO_OPTIONS += -DBUILD_SHARED_LIBS=OFF -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64"
81- # Strip removes symbols that are needed for the extension to work properly because loaded via `dlopen()`:
82- # Error: dlopen(./dist/ai.dylib, 0x000A): symbol not found in flat namespace '_whisper_coreml_encode'
83- # STRIP = strip -x -S $@
84- STRIP = true
73+ LLAMA_OPTIONS += -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64"
74+ WHISPER_OPTIONS += -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" -DWHISPER_COREML=ON
75+ MINIAUDIO_OPTIONS += -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64"
76+ STRIP = strip -x -S $@
8577else ifeq ($(PLATFORM),android)
8678 # Set ARCH to find Android NDK's Clang compiler, the user should set the ARCH
8779 ifeq ($(filter %,$(ARCH)),)
@@ -104,41 +96,35 @@ else ifeq ($(PLATFORM),android)
10496 CXX = $(CC)++
10597 TARGET := $(DIST_DIR)/ai.so
10698 LDFLAGS += -static-libstdc++ -shared
107- 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
108- 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
109- 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
99+ 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
100+ 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
101+ MINIAUDIO_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)" -DCMAKE_POSITION_INDEPENDENT_CODE=ON
110102 STRIP = $(BIN)/llvm-strip --strip-unneeded $@
111103else ifeq ($(PLATFORM),ios)
112- CC = clang
113- CXX = $(CC)++
114104 TARGET := $(DIST_DIR)/ai.dylib
115105 SDK := -isysroot $(shell xcrun --sdk iphoneos --show-sdk-path) -miphoneos-version-min=14.0
116106 LLAMA_LIBS += $(BUILD_LLAMA)/ggml/src/ggml-metal/libggml-metal.a $(BUILD_LLAMA)/ggml/src/ggml-blas/libggml-blas.a
117- # Need to force-load `libwhisper.coreml.a` for CoreML because dinamically loaded on runtime and the compiler strips the symbols
118- 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)
119- # Miniaudio requires to compile as Objective-C on iOS
120- # https://github.com/mackron/miniaudio/blob/master/README.md#building
107+ WHISPER_LDFLAGS += -lwhisper.coreml
108+ 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 -ldl -dynamiclib $(SDK)
121109 CFLAGS += -arch arm64 -x objective-c $(SDK)
122- LLAMA_OPTIONS += -DBUILD_SHARED_LIBS=OFF - DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0
123- WHISPER_OPTIONS += -DBUILD_SHARED_LIBS=OFF - DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 -DWHISPER_COREML=ON
110+ LLAMA_OPTIONS += -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0
111+ WHISPER_OPTIONS += -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 -DWHISPER_COREML=ON
124112 STRIP = strip -x -S $@
125113else ifeq ($(PLATFORM),isim)
126114 TARGET := $(DIST_DIR)/ai.dylib
127115 SDK := -isysroot $(shell xcrun --sdk iphonesimulator --show-sdk-path) -miphonesimulator-version-min=14.0
128116 LLAMA_LIBS += $(BUILD_LLAMA)/ggml/src/ggml-metal/libggml-metal.a $(BUILD_LLAMA)/ggml/src/ggml-blas/libggml-blas.a
129- 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)
117+ WHISPER_LDFLAGS += -lwhisper.coreml
118+ 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 -ldl -dynamiclib $(SDK)
130119 CFLAGS += -arch x86_64 -arch arm64 -x objective-c $(SDK)
131- 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"
132- 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
120+ LLAMA_OPTIONS += -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64"
121+ 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
133122else # linux
134123 TARGET := $(DIST_DIR)/ai.so
135- # Using -DGGML_CPU_ALL_VARIANTS=ON, `-lggml-cpu` is not needed
136- LDFLAGS := $(filter-out -lggml-cpu,$(LDFLAGS))
137- 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
138- # Add miniaudio Linux-specific flags (as per miniaudio docs)
124+ LDFLAGS += -shared
139125 MINIAUDIO_LDFLAGS += -lpthread -lm
140- LLAMA_OPTIONS += -DBUILD_SHARED_LIBS=ON - DGGML_OPENMP=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON
141- WHISPER_OPTIONS += -DBUILD_SHARED_LIBS=ON - DGGML_OPENMP=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON
126+ LLAMA_OPTIONS += -DGGML_OPENMP=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON
127+ WHISPER_OPTIONS += -DGGML_OPENMP=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON
142128 STRIP = strip --strip-unneeded $@
143129endif
144130
@@ -147,7 +133,7 @@ $(DEF_FILE):
147133ifeq ($(PLATFORM ) ,windows)
148134 @echo "LIBRARY ai.dll" > $@
149135 @echo "EXPORTS" >> $@
150- @echo " sqlite3_ai_init" >> $@
136+ @echo " sqlite3_ai_init" >> $@
151137endif
152138
153139# Make sure the build and dist directories exist
@@ -157,42 +143,35 @@ $(shell mkdir -p $(BUILD_DIR) $(DIST_DIR))
157143extension : $(TARGET )
158144all : $(TARGET )
159145
160- # Ensure object files are built first
161- compile : $(OBJ_FILES )
162-
163146# Loadable library
164- $(TARGET ) : $(DEF_FILE ) $(LLAMA_LIBS ) $(WHISPER_LIBS ) $(MINIAUDIO_LIBS )
165- ifeq ($(PLATFORM ) ,windows)
166- $(CXX) $(OBJ_FILES) /link $(LDFLAGS)
167- else
147+ $(TARGET ) : $(OBJ_FILES ) $(DEF_FILE ) $(LLAMA_LIBS ) $(WHISPER_LIBS ) $(MINIAUDIO_LIBS )
168148 $(CXX ) $(OBJ_FILES ) $(DEF_FILE ) -o $@ $(LDFLAGS )
149+ ifeq ($(PLATFORM ) ,windows)
150+ # Generate import library for Windows
151+ dlltool -D $@ -d $(DEF_FILE) -l $(DIST_DIR)/ai.lib
169152endif
153+ # Strip debug symbols
170154 $(STRIP)
171155
172156# Object files
173- ifeq ($(PLATFORM ) ,windows)
174- $(BUILD_DIR ) /% .obj : % .c
175- $(CC ) $(CFLAGS ) /c $< /Fo$@
176- else
177157$(BUILD_DIR ) /% .o : % .c
178158 $(CC ) $(CFLAGS ) -O3 -fPIC -c $< -o $@
179- endif
180159
181160test : $(TARGET )
182161 $(SQLITE3 ) " :memory:" -cmd " .bail on" " .load ./dist/ai" " SELECT ai_version();"
183162
184- # Build submodules (only after successful compilation of the extension)
185- build/llama.cpp.stamp : | compile
163+ # Build submodules
164+ build/llama.cpp.stamp :
186165 cmake -B $(BUILD_LLAMA ) $(LLAMA_OPTIONS ) $(LLAMA_DIR )
187166 cmake --build $(BUILD_LLAMA ) --config Release -- -j$(CPUS )
188167 touch $@
189168
190- build/whisper.cpp.stamp : | compile
169+ build/whisper.cpp.stamp :
191170 cmake -B $(BUILD_WHISPER ) $(WHISPER_OPTIONS ) $(WHISPER_DIR )
192171 cmake --build $(BUILD_WHISPER ) --config Release -- -j$(CPUS )
193172 touch $@
194173
195- build/miniaudio.stamp : | compile
174+ build/miniaudio.stamp :
196175 cmake -B $(BUILD_MINIAUDIO ) $(MINIAUDIO_OPTIONS ) $(MINIAUDIO_DIR )
197176 cmake --build $(BUILD_MINIAUDIO ) --config Release -- -j$(CPUS )
198177 touch $@
@@ -229,4 +208,4 @@ help:
229208 @echo " test - Test the extension"
230209 @echo " help - Display this help message"
231210
232- .PHONY : all clean test extension help compile
211+ .PHONY : all clean test extension help
0 commit comments