@@ -36,6 +36,7 @@ BUILD_LLAMA = $(BUILD_DIR)/llama.cpp
3636BUILD_WHISPER = $(BUILD_DIR ) /whisper.cpp
3737BUILD_MINIAUDIO = $(BUILD_DIR ) /miniaudio
3838
39+ OBJ_EXT = o
3940# Compiler and flags
4041CC = gcc
4142CXX = g++
@@ -53,18 +54,21 @@ LDFLAGS = $(LLAMA_LDFLAGS) $(WHISPER_LDFLAGS) $(MINIAUDIO_LDFLAGS)
5354
5455# Files
5556SRC_FILES = $(wildcard $(SRC_DIR ) /* .c)
56- OBJ_FILES = $(patsubst % .c, $(BUILD_DIR ) /% .o , $(notdir $(SRC_FILES ) ) )
57+ OBJ_FILES = $(patsubst % .c, $(BUILD_DIR ) /% .$( OBJ_EXT ) , $(notdir $(SRC_FILES ) ) )
5758LLAMA_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
5859WHISPER_LIBS = $(BUILD_WHISPER ) /src/libwhisper.a
5960MINIAUDIO_LIBS = $(BUILD_MINIAUDIO ) /libminiaudio.a
6061
6162# Platform-specific settings
6263ifeq ($(PLATFORM ) ,windows)
64+ OBJ_EXT = obj
65+ CC = cl
66+ CXX = cl
6367 TARGET := $(DIST_DIR)/ai.dll
64- 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
65- # Create .def file for Windows
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
6670 DEF_FILE := $(BUILD_DIR)/ai.def
67- STRIP = strip -- strip-unneeded $@
71+ STRIP = echo "No strip needed for MSVC"
6872else ifeq ($(PLATFORM),macos)
6973 TARGET := $(DIST_DIR)/ai.dylib
7074 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)
128132 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
129133else # linux
130134 TARGET := $(DIST_DIR)/ai.so
131- # using -DGGML_CPU_ALL_VARIANTS=ON
135+ # Using -DGGML_CPU_ALL_VARIANTS=ON, `-lggml-cpu` is not needed
132136 LDFLAGS := $(filter-out -lggml-cpu,$(LDFLAGS))
133137 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
134138 # Add miniaudio Linux-specific flags (as per miniaudio docs)
@@ -158,17 +162,21 @@ compile: $(OBJ_FILES)
158162
159163# Loadable library
160164$(TARGET ) : $(DEF_FILE ) $(LLAMA_LIBS ) $(WHISPER_LIBS ) $(MINIAUDIO_LIBS )
161- $(CXX ) $(OBJ_FILES ) $(DEF_FILE ) -o $@ $(LDFLAGS )
162165ifeq ($(PLATFORM ) ,windows)
163- # Generate import library for Windows
164- dlltool -D $@ -d $(DEF_FILE) -l $(DIST_DIR)/ai.lib
166+ $(CXX) $(OBJ_FILES) /link $(LDFLAGS)
167+ else
168+ $(CXX) $(OBJ_FILES) $(DEF_FILE) -o $@ $(LDFLAGS)
165169endif
166- # Strip debug symbols
167170 $(STRIP)
168171
169172# Object files
173+ ifeq ($(PLATFORM ) ,windows)
174+ $(BUILD_DIR ) /% .obj : % .c
175+ $(CC ) $(CFLAGS ) /c $< /Fo$@
176+ else
170177$(BUILD_DIR ) /% .o : % .c
171178 $(CC ) $(CFLAGS ) -O3 -fPIC -c $< -o $@
179+ endif
172180
173181test : $(TARGET )
174182 $(SQLITE3 ) " :memory:" -cmd " .bail on" " .load ./dist/ai" " SELECT ai_version();"
0 commit comments