# llama.cpp server and DLL build (CPU inference only) # # llama.cpp is an amazing project, but its build system is poor and # growing worse. It's never properly built llama.dll under any compiler, # and DLL builds have been unsupported by w64dk for some time. This # makefile is a replacement build system that produces llama.dll and # llama-server.exe using w64dk. No source file changes are needed. # # The DLL exports the public API and no more, and is readily usable as a # component in another project (game engine, etc.). The server EXE is # fully functional on Windows 7 or later. It is not linked against the # DLL, since that's not useful, but can be made to do so with a small # tweak to this makefile. # # Invoke this makefile in the llama.cpp source tree: # # $ make -j$(nproc) -f path/to/w64devkit/contrib/llama.mak # # Incremental builds are unsupported, so clean rebuild after pulling. It # was last tested at b7218, and an update will inevitably break it. CROSS = CPPFLAGS = -w -O2 -march=x86-64-v3 LDFLAGS = -s .SUFFIXES: .c .cpp .o def = \ -DGGML_COMMIT='"unknown"' \ -DGGML_USE_CPU \ -DGGML_VERSION='"0.9.4"' \ -DLLAMA_USE_HTTPLIB inc = \ -I. \ -Icommon \ -Iggml/include \ -Iggml/src \ -Iggml/src/ggml-cpu \ -Iinclude \ -Itools/mtmd \ -Ivendor \ -Ivendor/cpp-httplib %.c.o: %.c $(CROSS)gcc -c -o $@ $(inc) $(def) $(CPPFLAGS) $< %.cpp.o: %.cpp $(CROSS)g++ -c -o $@ $(inc) $(def) $(CPPFLAGS) $< dll = \ ggml/src/ggml-alloc.c.o \ ggml/src/ggml-backend-reg.cpp.o \ ggml/src/ggml-backend.cpp.o \ ggml/src/ggml-cpu/arch/x86/quants.c.o \ ggml/src/ggml-cpu/arch/x86/repack.cpp.o \ ggml/src/ggml-cpu/binary-ops.cpp.o \ ggml/src/ggml-cpu/ggml-cpu.c.o \ ggml/src/ggml-cpu/ggml-cpu.cpp.o \ ggml/src/ggml-cpu/hbm.cpp.o \ ggml/src/ggml-cpu/llamafile/sgemm.cpp.o \ ggml/src/ggml-cpu/ops.cpp.o \ ggml/src/ggml-cpu/quants.c.o \ ggml/src/ggml-cpu/repack.cpp.o \ ggml/src/ggml-cpu/traits.cpp.o \ ggml/src/ggml-cpu/unary-ops.cpp.o \ ggml/src/ggml-cpu/vec.cpp.o \ ggml/src/ggml-opt.cpp.o \ ggml/src/ggml-quants.c.o \ ggml/src/ggml-threading.cpp.o \ ggml/src/ggml.c.o \ ggml/src/ggml.cpp.o \ ggml/src/gguf.cpp.o \ src/llama-adapter.cpp.o \ src/llama-arch.cpp.o \ src/llama-batch.cpp.o \ src/llama-chat.cpp.o \ src/llama-context.cpp.o \ src/llama-cparams.cpp.o \ src/llama-grammar.cpp.o \ src/llama-graph.cpp.o \ src/llama-hparams.cpp.o \ src/llama-impl.cpp.o \ src/llama-io.cpp.o \ src/llama-kv-cache-iswa.cpp.o \ src/llama-kv-cache.cpp.o \ src/llama-memory-hybrid.cpp.o \ src/llama-memory-recurrent.cpp.o \ src/llama-memory.cpp.o \ src/llama-mmap.cpp.o \ src/llama-model-loader.cpp.o \ src/llama-model-saver.cpp.o \ src/llama-model.cpp.o \ src/llama-quant.cpp.o \ src/llama-sampling.cpp.o \ src/llama-vocab.cpp.o \ src/llama.cpp.o \ src/models/afmoe.cpp.o \ src/models/apertus.cpp.o \ src/models/arcee.cpp.o \ src/models/arctic.cpp.o \ src/models/arwkv7.cpp.o \ src/models/baichuan.cpp.o \ src/models/bailingmoe.cpp.o \ src/models/bailingmoe2.cpp.o \ src/models/bert.cpp.o \ src/models/bitnet.cpp.o \ src/models/bloom.cpp.o \ src/models/chameleon.cpp.o \ src/models/chatglm.cpp.o \ src/models/codeshell.cpp.o \ src/models/cogvlm.cpp.o \ src/models/cohere2-iswa.cpp.o \ src/models/command-r.cpp.o \ src/models/dbrx.cpp.o \ src/models/deci.cpp.o \ src/models/deepseek.cpp.o \ src/models/deepseek2.cpp.o \ src/models/dots1.cpp.o \ src/models/dream.cpp.o \ src/models/ernie4-5-moe.cpp.o \ src/models/ernie4-5.cpp.o \ src/models/exaone.cpp.o \ src/models/exaone4.cpp.o \ src/models/falcon-h1.cpp.o \ src/models/falcon.cpp.o \ src/models/gemma-embedding.cpp.o \ src/models/gemma.cpp.o \ src/models/gemma2-iswa.cpp.o \ src/models/gemma3-iswa.cpp.o \ src/models/gemma3n-iswa.cpp.o \ src/models/glm4-moe.cpp.o \ src/models/glm4.cpp.o \ src/models/gpt2.cpp.o \ src/models/gptneox.cpp.o \ src/models/granite-hybrid.cpp.o \ src/models/granite.cpp.o \ src/models/graph-context-mamba.cpp.o \ src/models/grok.cpp.o \ src/models/grovemoe.cpp.o \ src/models/hunyuan-dense.cpp.o \ src/models/hunyuan-moe.cpp.o \ src/models/internlm2.cpp.o \ src/models/jais.cpp.o \ src/models/jamba.cpp.o \ src/models/lfm2.cpp.o \ src/models/llada-moe.cpp.o \ src/models/llada.cpp.o \ src/models/llama-iswa.cpp.o \ src/models/llama.cpp.o \ src/models/mamba.cpp.o \ src/models/minicpm3.cpp.o \ src/models/minimax-m2.cpp.o \ src/models/mistral3.cpp.o \ src/models/mpt.cpp.o \ src/models/nemotron-h.cpp.o \ src/models/nemotron.cpp.o \ src/models/neo-bert.cpp.o \ src/models/olmo.cpp.o \ src/models/olmo2.cpp.o \ src/models/olmoe.cpp.o \ src/models/openai-moe-iswa.cpp.o \ src/models/openelm.cpp.o \ src/models/orion.cpp.o \ src/models/pangu-embedded.cpp.o \ src/models/phi2.cpp.o \ src/models/phi3.cpp.o \ src/models/plamo.cpp.o \ src/models/plamo2.cpp.o \ src/models/plm.cpp.o \ src/models/qwen.cpp.o \ src/models/qwen2.cpp.o \ src/models/qwen2moe.cpp.o \ src/models/qwen2vl.cpp.o \ src/models/qwen3.cpp.o \ src/models/qwen3moe.cpp.o \ src/models/qwen3next.cpp.o \ src/models/qwen3vl-moe.cpp.o \ src/models/qwen3vl.cpp.o \ src/models/refact.cpp.o \ src/models/rnd1.cpp.o \ src/models/rwkv6-base.cpp.o \ src/models/rwkv6.cpp.o \ src/models/rwkv6qwen2.cpp.o \ src/models/rwkv7-base.cpp.o \ src/models/rwkv7.cpp.o \ src/models/seed-oss.cpp.o \ src/models/smallthinker.cpp.o \ src/models/smollm3.cpp.o \ src/models/stablelm.cpp.o \ src/models/starcoder.cpp.o \ src/models/starcoder2.cpp.o \ src/models/t5-dec.cpp.o \ src/models/t5-enc.cpp.o \ src/models/wavtokenizer-dec.cpp.o \ src/unicode-data.cpp.o \ src/unicode.cpp.o \ src/models/xverse.cpp.o exe = \ common/arg.cpp.o \ common/chat-parser-xml-toolcall.cpp.o \ common/chat-parser.cpp.o \ common/chat.cpp.o \ common/common.cpp.o \ common/console.cpp.o \ common/download.cpp.o \ common/json-partial.cpp.o \ common/json-schema-to-grammar.cpp.o \ common/llguidance.cpp.o \ common/log.cpp.o \ common/ngram-cache.cpp.o \ common/regex-partial.cpp.o \ common/sampling.cpp.o \ common/speculative.cpp.o \ common/w64dk-build-info.cpp.o \ tools/mtmd/clip.cpp.o \ tools/mtmd/mtmd-audio.cpp.o \ tools/mtmd/mtmd-helper.cpp.o \ tools/mtmd/mtmd.cpp.o \ tools/server/server-common.cpp.o \ tools/server/server-context.cpp.o \ tools/server/server-http.cpp.o \ tools/server/server-models.cpp.o \ tools/server/server-queue.cpp.o \ tools/server/server-task.cpp.o \ tools/server/server.cpp.o \ vendor/cpp-httplib/httplib.cpp.o all: llama.dll llama-server.exe llama-server.exe: $(exe) $(dll) $(CROSS)g++ $(LDFLAGS) -o $@ $(exe) $(dll) -lws2_32 llama.dll: $(dll) llama.def $(CROSS)g++ -shared $(LDFLAGS) -o $@ $(dll) llama.def clean: rm -f $(dll) $(exe) llama.def llama.dll llama-server.exe \ tools/server/index.html.gz.hpp tools/server/loading.html.hpp \ common/w64dk-build-info.cpp .ONESHELL: # needed for heredocs # NOTE: produces valid C++ even if Git is unavailable common/w64dk-build-info.cpp: cat >$@ <../index.html.gz.hpp tools/server/loading.html.hpp: tools/server/public/loading.html cd tools/server/public/ && xxd -i loading.html >../loading.html.hpp tools/server/server-http.cpp.o: \ tools/server/server.cpp \ tools/server/index.html.gz.hpp \ tools/server/loading.html.hpp llama.def: @cat >$@ <