2023-04-20 03:14:14 +02:00
# Define the default target now so that it is always the first target
2023-10-11 21:25:33 +03:00
BUILD_TARGETS = \
2024-06-13 00:41:52 +01:00
libllava.a \
llama-baby-llama \
llama-batched \
llama-batched-bench \
llama-bench \
llama-benchmark-matmult \
llama-cli \
llama-convert-llama2c-to-ggml \
llama-embedding \
llama-eval-callback \
llama-export-lora \
llama-finetune \
llama-gbnf-validator \
llama-gguf \
2024-07-07 22:58:43 +10:00
llama-gguf-hash \
2024-06-13 00:41:52 +01:00
llama-gguf-split \
llama-gritlm \
llama-imatrix \
llama-infill \
llama-llava-cli \
llama-lookahead \
llama-lookup \
llama-lookup-create \
llama-lookup-merge \
llama-lookup-stats \
llama-parallel \
llama-passkey \
llama-perplexity \
llama-q8dot \
llama-quantize \
llama-quantize-stats \
llama-retrieval \
llama-save-load-state \
llama-server \
llama-simple \
llama-speculative \
llama-tokenize \
llama-train-text-from-scratch \
llama-vdot \
2024-06-15 18:53:40 +02:00
llama-cvector-generator \
2024-06-13 00:41:52 +01:00
tests/test-c.o
2023-05-27 11:04:14 -06:00
2023-07-21 12:09:16 +02:00
# Binaries only useful for tests
2023-10-11 21:25:33 +03:00
TEST_TARGETS = \
2024-04-29 16:58:41 +03:00
tests/test-autorelease \
tests/test-backend-ops \
2024-06-28 02:19:11 +02:00
tests/test-chat-template \
2024-04-29 16:58:41 +03:00
tests/test-double-float \
tests/test-grad0 \
tests/test-grammar-integration \
tests/test-grammar-parser \
tests/test-json-schema-to-grammar \
tests/test-llama-grammar \
tests/test-model-load-cancel \
tests/test-opt \
tests/test-quantize-fns \
tests/test-quantize-perf \
tests/test-rope \
tests/test-sampling \
tests/test-tokenizer-0 \
tests/test-tokenizer-1-bpe \
tests/test-tokenizer-1-spm
2023-07-21 12:09:16 +02:00
2024-07-02 13:19:56 -04:00
# Legacy build targets that were renamed in #7809, but should still be removed when the project is cleaned
LEGACY_TARGETS = main quantize quantize-stats perplexity imatrix embedding vdot q8dot train-text-from-scratch convert-llama2c-to-ggml \
simple batched batched-bench save-load-state server gguf gguf-split eval-callback llama-bench libllava.a llava-cli baby-llama \
retrieval speculative infill tokenize benchmark-matmult parallel finetune export-lora lookahead lookup passkey gritlm
2024-06-26 18:33:02 +03:00
# Deprecation aliases
ifdef LLAMA_CUBLAS
$( error LLAMA_CUBLAS is removed . Use GGML_CUDA instead .)
endif
ifdef LLAMA_CUDA
GGML_CUDA := 1
DEPRECATE_WARNING := 1
endif
ifdef LLAMA_KOMPUTE
GGML_KOMPUTE := 1
DEPRECATE_WARNING := 1
endif
ifdef LLAMA_METAL
GGML_METAL := 1
DEPRECATE_WARNING := 1
endif
ifdef LLAMA_OPENMP
GGML_OPENMP := 1
DEPRECATE_WARNING := 1
endif
ifdef LLAMA_RPC
GGML_RPC := 1
DEPRECATE_WARNING := 1
endif
ifdef LLAMA_SYCL
GGML_SYCL := 1
DEPRECATE_WARNING := 1
endif
ifdef LLAMA_SYCL_F16
GGML_SYCL_F16 := 1
DEPRECATE_WARNING := 1
endif
ifdef LLAMA_OPENBLAS
GGML_OPENBLAS := 1
DEPRECATE_WARNING := 1
endif
ifdef LLAMA_OPENBLAS64
GGML_OPENBLAS64 := 1
DEPRECATE_WARNING := 1
endif
ifdef LLAMA_BLIS
GGML_BLIS := 1
DEPRECATE_WARNING := 1
endif
ifdef LLAMA_NO_LLAMAFILE
GGML_NO_LLAMAFILE := 1
DEPRECATE_WARNING := 1
endif
ifdef LLAMA_NO_ACCELERATE
GGML_NO_ACCELERATE := 1
DEPRECATE_WARNING := 1
endif
ifdef LLAMA_NO_OPENMP
GGML_NO_OPENMP := 1
DEPRECATE_WARNING := 1
endif
ifdef LLAMA_NO_METAL
GGML_NO_METAL := 1
DEPRECATE_WARNING := 1
endif
2023-09-03 11:48:49 +03:00
2023-09-04 22:26:24 +03:00
ifndef UNAME_S
UNAME_S := $( shell uname -s)
endif
ifndef UNAME_P
UNAME_P := $( shell uname -p)
endif
ifndef UNAME_M
UNAME_M := $( shell uname -m)
endif
2024-04-29 15:08:20 +02:00
# In GNU make default CXX is g++ instead of c++. Let's fix that so that users
# of non-gcc compilers don't have to provide g++ alias or wrapper.
DEFCC := cc
DEFCXX := c++
ifeq ( $( origin CC ) ,default)
CC := $( DEFCC)
endif
ifeq ( $( origin CXX ) ,default)
CXX := $( DEFCXX)
endif
2023-09-04 22:26:24 +03:00
# Mac OS + Arm can report x86_64
# ref: https://github.com/ggerganov/whisper.cpp/issues/66#issuecomment-1282546789
ifeq ( $( UNAME_S ) ,Darwin)
2024-06-26 18:33:02 +03:00
ifndef GGML_NO_METAL
GGML_METAL := 1
2023-09-04 22:26:24 +03:00
endif
2024-06-26 18:33:02 +03:00
GGML_NO_OPENMP := 1
2024-06-04 00:14:15 +09:00
2023-09-04 22:26:24 +03:00
ifneq ( $( UNAME_P) ,arm)
SYSCTL_M := $( shell sysctl -n hw.optional.arm64 2>/dev/null)
ifeq ( $( SYSCTL_M) ,1)
# UNAME_P := arm
# UNAME_M := arm64
warn := $( warning Your arch is announced as x86_64, but it seems to actually be ARM64. Not fixing that can lead to bad performance. For more info see: https://github.com/ggerganov/whisper.cpp/issues/66\# issuecomment-1282546789)
endif
endif
endif
2024-06-26 18:33:02 +03:00
ifdef GGML_METAL
GGML_METAL_EMBED_LIBRARY := 1
endif
ifdef GGML_RPC
2024-06-03 20:03:26 +03:00
BUILD_TARGETS += rpc-server
endif
2023-05-27 11:04:14 -06:00
default : $( BUILD_TARGETS )
2023-04-20 03:14:14 +02:00
2023-09-07 10:15:01 -04:00
test : $( TEST_TARGETS )
@failures= 0; \
for test_target in $( TEST_TARGETS) ; do \
2024-04-29 16:58:41 +03:00
if [ " $$ test_target" = "tests/test-tokenizer-0" ] ; then \
./$$ test_target $( CURDIR) /models/ggml-vocab-llama-spm.gguf; \
./$$ test_target $( CURDIR) /models/ggml-vocab-llama-bpe.gguf; \
./$$ test_target $( CURDIR) /models/ggml-vocab-phi-3.gguf; \
2023-10-03 09:16:26 +02:00
./$$ test_target $( CURDIR) /models/ggml-vocab-falcon.gguf; \
2024-04-29 16:58:41 +03:00
./$$ test_target $( CURDIR) /models/ggml-vocab-bert-bge.gguf; \
./$$ test_target $( CURDIR) /models/ggml-vocab-starcoder.gguf; \
./$$ test_target $( CURDIR) /models/ggml-vocab-gpt-2.gguf; \
2024-05-04 08:32:32 +03:00
./$$ test_target $( CURDIR) /models/ggml-vocab-refact.gguf; \
2024-04-29 16:58:41 +03:00
elif [ " $$ test_target" = "tests/test-tokenizer-1-spm" ] ; then \
2023-08-30 12:42:51 +03:00
continue ; \
2023-10-03 09:16:26 +02:00
elif [ " $$ test_target" = "tests/test-tokenizer-1-bpe" ] ; then \
continue ; \
2023-08-30 12:42:51 +03:00
else \
2023-09-07 10:15:01 -04:00
echo "Running test $$ test_target..." ; \
2023-08-30 12:42:51 +03:00
./$$ test_target; \
fi ; \
2023-09-07 10:15:01 -04:00
if [ $$ ? -ne 0 ] ; then \
2023-12-21 21:07:46 +01:00
printf 'Test %s FAILED!\n\n' $$ test_target; \
2023-09-07 10:15:01 -04:00
failures = $$ (( failures + 1 )) ; \
else \
printf 'Test %s passed.\n\n' $$ test_target; \
fi ; \
done ; \
if [ $$ failures -gt 0 ] ; then \
printf '\n%s tests failed.\n' $$ failures; \
exit 1; \
fi
@echo 'All tests passed.'
2023-08-30 12:42:51 +03:00
all : $( BUILD_TARGETS ) $( TEST_TARGETS )
2023-09-01 18:27:40 +05:00
ifdef RISCV_CROSS_COMPILE
CC := riscv64-unknown-linux-gnu-gcc
CXX := riscv64-unknown-linux-gnu-g++
endif
2023-03-10 20:40:58 +02:00
#
# Compile flags
#
2023-03-21 17:29:41 +02:00
# keep standard at C11 and C++11
2024-06-26 18:33:02 +03:00
MK_CPPFLAGS = -Iggml/include -Iggml/src -Iinclude -Isrc -Icommon
2024-02-19 13:41:51 +02:00
MK_CFLAGS = -std= c11 -fPIC
MK_CXXFLAGS = -std= c++11 -fPIC
MK_NVCCFLAGS = -std= c++11
2023-09-16 17:55:43 +03:00
2024-02-05 19:33:00 +01:00
ifndef LLAMA_NO_CCACHE
CCACHE := $( shell which ccache)
ifdef CCACHE
export CCACHE_SLOPPINESS = time_macros
$( info I ccache found , compilation results will be cached . Disable with LLAMA_NO_CCACHE .)
CC := $( CCACHE) $( CC)
CXX := $( CCACHE) $( CXX)
else
$( info I ccache not found . Consider installing it for faster compilation .)
endif # CCACHE
endif # LLAMA_NO_CCACHE
2023-09-08 14:09:21 +02:00
# clock_gettime came in POSIX.1b (1993)
# CLOCK_MONOTONIC came in POSIX.1-2001 / SUSv3 as optional
# posix_memalign came in POSIX.1-2001 / SUSv3
# M_PI is an XSI extension since POSIX.1-2001 / SUSv3, came in XPG1 (1985)
2023-09-14 13:22:47 -04:00
MK_CPPFLAGS += -D_XOPEN_SOURCE= 600
2023-09-08 14:09:21 +02:00
# Somehow in OpenBSD whenever POSIX conformance is specified
# some string functions rely on locale_t availability,
# which was introduced in POSIX.1-2008, forcing us to go higher
ifeq ( $( UNAME_S ) ,OpenBSD)
2023-09-14 13:22:47 -04:00
MK_CPPFLAGS += -U_XOPEN_SOURCE -D_XOPEN_SOURCE= 700
2023-09-08 14:09:21 +02:00
endif
# Data types, macros and functions related to controlling CPU affinity and
# some memory allocation are available on Linux through GNU extensions in libc
ifeq ( $( UNAME_S ) ,Linux)
2023-09-14 13:22:47 -04:00
MK_CPPFLAGS += -D_GNU_SOURCE
2023-09-08 14:09:21 +02:00
endif
# RLIMIT_MEMLOCK came in BSD, is not specified in POSIX.1,
# and on macOS its availability depends on enabling Darwin extensions
# similarly on DragonFly, enabling BSD extensions is necessary
ifeq ( $( UNAME_S ) ,Darwin)
2023-09-14 13:22:47 -04:00
MK_CPPFLAGS += -D_DARWIN_C_SOURCE
2023-09-08 14:09:21 +02:00
endif
ifeq ( $( UNAME_S ) ,DragonFly)
2023-09-14 13:22:47 -04:00
MK_CPPFLAGS += -D__BSD_VISIBLE
2023-09-08 14:09:21 +02:00
endif
# alloca is a non-standard interface that is not visible on BSDs when
# POSIX conformance is specified, but not all of them provide a clean way
# to enable it in such cases
ifeq ( $( UNAME_S ) ,FreeBSD)
2023-09-14 13:22:47 -04:00
MK_CPPFLAGS += -D__BSD_VISIBLE
2023-09-08 14:09:21 +02:00
endif
ifeq ( $( UNAME_S ) ,NetBSD)
2023-09-14 13:22:47 -04:00
MK_CPPFLAGS += -D_NETBSD_SOURCE
2023-09-08 14:09:21 +02:00
endif
ifeq ( $( UNAME_S ) ,OpenBSD)
2023-09-14 13:22:47 -04:00
MK_CPPFLAGS += -D_BSD_SOURCE
2023-09-08 14:09:21 +02:00
endif
2024-06-26 18:33:02 +03:00
ifdef GGML_SCHED_MAX_COPIES
MK_CPPFLAGS += -DGGML_SCHED_MAX_COPIES= $( GGML_SCHED_MAX_COPIES)
2024-03-13 18:54:21 +01:00
endif
2023-05-28 21:01:02 +02:00
ifdef LLAMA_DEBUG
2024-06-03 16:28:58 +02:00
MK_CFLAGS += -O0 -g
MK_CXXFLAGS += -O0 -g
MK_LDFLAGS += -g
MK_NVCCFLAGS += -O0 -g
2023-12-01 13:18:35 -05:00
ifeq ( $( UNAME_S) ,Linux)
2024-02-20 20:06:17 +01:00
MK_CPPFLAGS += -D_GLIBCXX_ASSERTIONS
2023-12-01 13:18:35 -05:00
endif
2023-05-28 21:01:02 +02:00
else
2024-06-26 20:20:22 +02:00
MK_CPPFLAGS += -DNDEBUG
MK_CFLAGS += -O3
MK_CXXFLAGS += -O3
MK_NVCCFLAGS += -O3
2023-04-29 18:43:28 +03:00
endif
2023-10-11 13:35:46 -06:00
ifdef LLAMA_SANITIZE_THREAD
MK_CFLAGS += -fsanitize= thread -g
MK_CXXFLAGS += -fsanitize= thread -g
MK_LDFLAGS += -fsanitize= thread -g
endif
ifdef LLAMA_SANITIZE_ADDRESS
MK_CFLAGS += -fsanitize= address -fno-omit-frame-pointer -g
MK_CXXFLAGS += -fsanitize= address -fno-omit-frame-pointer -g
MK_LDFLAGS += -fsanitize= address -fno-omit-frame-pointer -g
endif
ifdef LLAMA_SANITIZE_UNDEFINED
MK_CFLAGS += -fsanitize= undefined -g
MK_CXXFLAGS += -fsanitize= undefined -g
MK_LDFLAGS += -fsanitize= undefined -g
endif
2023-07-04 15:38:04 +03:00
ifdef LLAMA_SERVER_VERBOSE
2023-09-03 01:26:59 -04:00
MK_CPPFLAGS += -DSERVER_VERBOSE= $( LLAMA_SERVER_VERBOSE)
2023-07-04 15:38:04 +03:00
endif
2024-03-09 02:57:09 -07:00
ifdef LLAMA_SERVER_SSL
MK_CPPFLAGS += -DCPPHTTPLIB_OPENSSL_SUPPORT
MK_LDFLAGS += -lssl -lcrypto
endif
2023-09-03 11:48:49 +03:00
2023-09-01 11:07:06 +02:00
ifdef LLAMA_DISABLE_LOGS
2023-09-05 15:12:00 -04:00
MK_CPPFLAGS += -DLOG_DISABLE_LOGS
2023-09-01 11:07:06 +02:00
endif # LLAMA_DISABLE_LOGS
2023-03-28 16:48:20 +00:00
# warnings
2024-06-26 18:33:02 +03:00
WARN_FLAGS = \
-Wall \
-Wextra \
-Wpedantic \
-Wcast-qual \
-Wno-unused-function
MK_CFLAGS += \
$( WARN_FLAGS) \
-Wshadow \
-Wstrict-prototypes \
-Wpointer-arith \
-Wmissing-prototypes \
-Werror= implicit-int \
-Werror= implicit-function-declaration
MK_CXXFLAGS += \
$( WARN_FLAGS) \
-Wmissing-declarations \
-Wmissing-noreturn
2023-03-28 16:48:20 +00:00
2024-02-17 16:03:14 -05:00
ifeq ( $( LLAMA_FATAL_WARNINGS ) ,1)
2024-02-19 14:45:41 +02:00
MK_CFLAGS += -Werror
2024-02-17 16:03:14 -05:00
MK_CXXFLAGS += -Werror
endif
2023-11-14 09:34:41 -08:00
# this version of Apple ld64 is buggy
ifneq '' '$(findstring dyld-1015.7,$(shell $(CC) $(LDFLAGS) -Wl,-v 2>&1))'
MK_CPPFLAGS += -DHAVE_BUGGY_APPLE_LINKER
endif
2023-03-10 20:40:58 +02:00
# OS specific
# TODO: support Windows
2023-09-03 01:26:59 -04:00
ifneq '' '$(filter $(UNAME_S),Linux Darwin FreeBSD NetBSD OpenBSD Haiku)'
MK_CFLAGS += -pthread
MK_CXXFLAGS += -pthread
2023-03-10 20:40:58 +02:00
endif
2023-07-21 09:42:21 +02:00
# detect Windows
ifneq ( $( findstring _NT ,$( UNAME_S )) ,)
_WIN32 := 1
endif
# library name prefix
ifneq ( $( _WIN 32) ,1)
LIB_PRE := lib
endif
# Dynamic Shared Object extension
ifneq ( $( _WIN 32) ,1)
DSO_EXT := .so
else
DSO_EXT := .dll
endif
# Windows Sockets 2 (Winsock) for network-capable apps
ifeq ( $( _WIN 32) ,1)
LWINSOCK2 := -lws2_32
endif
2023-05-13 17:25:09 +03:00
ifdef LLAMA_GPROF
2023-09-03 01:26:59 -04:00
MK_CFLAGS += -pg
MK_CXXFLAGS += -pg
2023-05-13 17:25:09 +03:00
endif
2023-03-10 20:40:58 +02:00
# Architecture specific
# TODO: probably these flags need to be tweaked on some architectures
# feel free to update the Makefile for your architecture and send a pull request or issue
2023-09-01 18:27:40 +05:00
ifndef RISCV
2023-07-21 06:53:27 -04:00
ifeq ( $( UNAME_M ) , $( filter $( UNAME_M ) ,x 86_ 64 i 686 amd 64) )
2023-04-02 09:17:05 +02:00
# Use all CPU extensions that are available:
2023-12-13 12:10:10 -05:00
MK_CFLAGS += -march= native -mtune= native
HOST_CXXFLAGS += -march= native -mtune= native
2023-04-22 11:08:12 +03:00
# Usage AVX-only
2023-09-03 01:26:59 -04:00
#MK_CFLAGS += -mfma -mf16c -mavx
#MK_CXXFLAGS += -mfma -mf16c -mavx
2023-06-10 14:41:59 +08:00
# Usage SSSE3-only (Not is SSE3!)
2023-09-03 01:26:59 -04:00
#MK_CFLAGS += -mssse3
#MK_CXXFLAGS += -mssse3
2023-03-10 20:40:58 +02:00
endif
2023-06-04 23:34:30 +03:00
2023-09-01 09:53:14 -04:00
ifneq '' '$(findstring mingw,$(shell $(CC) -dumpmachine))'
2023-12-12 04:27:26 -05:00
# The stack is only 16-byte aligned on Windows, so don't let gcc emit aligned moves.
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54412
# https://github.com/ggerganov/llama.cpp/issues/2922
2023-09-05 15:12:00 -04:00
MK_CFLAGS += -Xassembler -muse-unaligned-vector-move
MK_CXXFLAGS += -Xassembler -muse-unaligned-vector-move
2023-12-12 04:27:26 -05:00
# Target Windows 8 for PrefetchVirtualMemory
MK_CPPFLAGS += -D_WIN32_WINNT= 0x602
2023-09-01 09:53:14 -04:00
endif
2023-08-06 23:21:46 -07:00
ifneq ( $( filter aarch 64%,$( UNAME_M )) ,)
# Apple M1, M2, etc.
# Raspberry Pi 3, 4, Zero 2 (64-bit)
2023-12-22 23:11:12 +08:00
# Nvidia Jetson
2023-09-03 01:26:59 -04:00
MK_CFLAGS += -mcpu= native
MK_CXXFLAGS += -mcpu= native
2023-12-22 23:11:12 +08:00
JETSON_RELEASE_INFO = $( shell jetson_release)
ifdef JETSON_RELEASE_INFO
ifneq ( $( filter TX2%,$( JETSON_RELEASE_INFO)) ,)
JETSON_EOL_MODULE_DETECT = 1
CC = aarch64-unknown-linux-gnu-gcc
cxx = aarch64-unknown-linux-gnu-g++
endif
endif
2023-08-06 23:21:46 -07:00
endif
ifneq ( $( filter armv 6%,$( UNAME_M )) ,)
# Raspberry Pi 1, Zero
2023-09-03 01:26:59 -04:00
MK_CFLAGS += -mfpu= neon-fp-armv8 -mfp16-format= ieee -mno-unaligned-access
MK_CXXFLAGS += -mfpu= neon-fp-armv8 -mfp16-format= ieee -mno-unaligned-access
2023-08-06 23:21:46 -07:00
endif
ifneq ( $( filter armv 7%,$( UNAME_M )) ,)
# Raspberry Pi 2
2023-09-03 01:26:59 -04:00
MK_CFLAGS += -mfpu= neon-fp-armv8 -mfp16-format= ieee -mno-unaligned-access -funsafe-math-optimizations
MK_CXXFLAGS += -mfpu= neon-fp-armv8 -mfp16-format= ieee -mno-unaligned-access -funsafe-math-optimizations
2023-08-06 23:21:46 -07:00
endif
ifneq ( $( filter armv 8%,$( UNAME_M )) ,)
# Raspberry Pi 3, 4, Zero 2 (32-bit)
2023-09-03 01:26:59 -04:00
MK_CFLAGS += -mfp16-format= ieee -mno-unaligned-access
MK_CXXFLAGS += -mfp16-format= ieee -mno-unaligned-access
2023-08-06 23:21:46 -07:00
endif
2023-03-10 20:40:58 +02:00
ifneq ( $( filter ppc 64%,$( UNAME_M )) ,)
POWER9_M := $( shell grep "POWER9" /proc/cpuinfo)
ifneq ( ,$( findstring POWER9,$( POWER9_M)) )
2023-09-03 01:26:59 -04:00
MK_CFLAGS += -mcpu= power9
MK_CXXFLAGS += -mcpu= power9
2023-03-10 20:40:58 +02:00
endif
endif
2023-06-04 23:34:30 +03:00
2023-11-17 17:11:23 +01:00
ifneq ( $( filter ppc 64le %,$( UNAME_M )) ,)
MK_CFLAGS += -mcpu= powerpc64le
MK_CXXFLAGS += -mcpu= powerpc64le
CUDA_POWER_ARCH = 1
endif
2024-05-20 15:19:21 +08:00
ifneq ( $( filter loongarch 64%,$( UNAME_M )) ,)
MK_CFLAGS += -mlasx
MK_CXXFLAGS += -mlasx
endif
2023-09-01 18:27:40 +05:00
else
2023-09-05 15:12:00 -04:00
MK_CFLAGS += -march= rv64gcv -mabi= lp64d
MK_CXXFLAGS += -march= rv64gcv -mabi= lp64d
2023-09-01 18:27:40 +05:00
endif
2024-06-26 18:33:02 +03:00
ifndef GGML_NO_ACCELERATE
2023-09-04 22:26:24 +03:00
# Mac OS - include Accelerate framework.
# `-framework Accelerate` works both with Apple Silicon and Mac Intel
2023-03-10 20:40:58 +02:00
ifeq ( $( UNAME_S) ,Darwin)
2024-06-13 03:11:35 +02:00
MK_CPPFLAGS += -DGGML_USE_ACCELERATE -DGGML_USE_BLAS
2023-09-27 11:34:32 -04:00
MK_CPPFLAGS += -DACCELERATE_NEW_LAPACK
MK_CPPFLAGS += -DACCELERATE_LAPACK_ILP64
2023-09-03 01:26:59 -04:00
MK_LDFLAGS += -framework Accelerate
2024-06-26 18:33:02 +03:00
OBJ_GGML += ggml/src/ggml-blas.o
2023-03-10 20:40:58 +02:00
endif
2024-06-26 18:33:02 +03:00
endif # GGML_NO_ACCELERATE
2023-06-04 23:34:30 +03:00
2024-06-26 18:33:02 +03:00
ifndef GGML_NO_OPENMP
2024-06-04 00:14:15 +09:00
MK_CPPFLAGS += -DGGML_USE_OPENMP
MK_CFLAGS += -fopenmp
MK_CXXFLAGS += -fopenmp
2024-06-26 18:33:02 +03:00
endif # GGML_NO_OPENMP
2024-06-04 00:14:15 +09:00
2024-06-26 18:33:02 +03:00
ifdef GGML_OPENBLAS
2024-06-13 03:11:35 +02:00
MK_CPPFLAGS += -DGGML_USE_BLAS $( shell pkg-config --cflags-only-I openblas)
2023-09-03 01:26:59 -04:00
MK_CFLAGS += $( shell pkg-config --cflags-only-other openblas)
MK_LDFLAGS += $( shell pkg-config --libs openblas)
2024-06-26 18:33:02 +03:00
OBJ_GGML += ggml/src/ggml-blas.o
endif # GGML_OPENBLAS
2023-06-04 23:34:30 +03:00
2024-06-26 18:33:02 +03:00
ifdef GGML_OPENBLAS64
2024-06-13 03:11:35 +02:00
MK_CPPFLAGS += -DGGML_USE_BLAS $( shell pkg-config --cflags-only-I openblas64)
MK_CFLAGS += $( shell pkg-config --cflags-only-other openblas64)
MK_LDFLAGS += $( shell pkg-config --libs openblas64)
2024-06-26 18:33:02 +03:00
OBJ_GGML += ggml/src/ggml-blas.o
endif # GGML_OPENBLAS64
2024-06-13 03:11:35 +02:00
2024-06-26 18:33:02 +03:00
ifdef GGML_BLIS
2024-06-13 03:11:35 +02:00
MK_CPPFLAGS += -DGGML_USE_BLAS -I/usr/local/include/blis -I/usr/include/blis
MK_LDFLAGS += -lblis -L/usr/local/lib
2024-06-26 18:33:02 +03:00
OBJ_GGML += ggml/src/ggml-blas.o
endif # GGML_BLIS
2024-06-13 03:11:35 +02:00
2024-06-26 18:33:02 +03:00
ifndef GGML_NO_LLAMAFILE
2024-04-17 23:58:26 +03:00
MK_CPPFLAGS += -DGGML_USE_LLAMAFILE
2024-06-26 18:33:02 +03:00
OBJ_GGML += ggml/src/sgemm.o
2024-04-17 23:58:26 +03:00
endif
2024-06-26 18:33:02 +03:00
ifdef GGML_RPC
MK_CPPFLAGS += -DGGML_USE_RPC
OBJ_GGML += ggml/src/ggml-rpc.o
endif # GGML_RPC
2024-06-03 20:03:26 +03:00
2024-06-26 18:33:02 +03:00
OBJ_CUDA_TMPL = $( patsubst %.cu,%.o,$( wildcard ggml/src/ggml-cuda/template-instances/fattn-wmma*.cu))
OBJ_CUDA_TMPL += $( patsubst %.cu,%.o,$( wildcard ggml/src/ggml-cuda/template-instances/mmq*.cu))
2024-03-26 01:16:01 +01:00
2024-06-26 18:33:02 +03:00
ifdef GGML_CUDA_FA_ALL_QUANTS
OBJ_CUDA_TMPL += $( patsubst %.cu,%.o,$( wildcard ggml/src/ggml-cuda/template-instances/fattn-vec*.cu))
2024-06-01 08:44:14 +02:00
else
2024-06-26 18:33:02 +03:00
OBJ_CUDA_TMPL += $( patsubst %.cu,%.o,$( wildcard ggml/src/ggml-cuda/template-instances/fattn-vec*q4_0-q4_0.cu))
OBJ_CUDA_TMPL += $( patsubst %.cu,%.o,$( wildcard ggml/src/ggml-cuda/template-instances/fattn-vec*q8_0-q8_0.cu))
OBJ_CUDA_TMPL += $( patsubst %.cu,%.o,$( wildcard ggml/src/ggml-cuda/template-instances/fattn-vec*f16-f16.cu))
endif # GGML_CUDA_FA_ALL_QUANTS
2024-06-01 08:44:14 +02:00
2024-06-26 18:33:02 +03:00
ifdef GGML_CUDA
2024-02-27 10:03:06 +08:00
ifneq ( '' , '$(wildcard /opt/cuda)' )
CUDA_PATH ?= /opt/cuda
else
CUDA_PATH ?= /usr/local/cuda
endif
2024-06-26 18:33:02 +03:00
2024-05-08 21:55:49 +01:00
MK_CPPFLAGS += -DGGML_USE_CUDA -I$( CUDA_PATH) /include -I$( CUDA_PATH) /targets/$( UNAME_M) -linux/include -DGGML_CUDA_USE_GRAPHS
2024-06-18 14:00:14 +02:00
MK_LDFLAGS += -lcuda -lcublas -lculibos -lcudart -lcublasLt -lpthread -ldl -lrt -L$( CUDA_PATH) /lib64 -L/usr/lib64 -L$( CUDA_PATH) /targets/$( UNAME_M) -linux/lib -L$( CUDA_PATH) /lib64/stubs -L/usr/lib/wsl/lib
2024-02-03 20:14:59 +01:00
MK_NVCCFLAGS += -use_fast_math
2024-06-26 18:33:02 +03:00
OBJ_GGML += ggml/src/ggml-cuda.o
OBJ_GGML += $( patsubst %.cu,%.o,$( wildcard ggml/src/ggml-cuda/*.cu))
OBJ_GGML += $( OBJ_CUDA_TMPL)
2024-02-19 14:45:41 +02:00
ifdef LLAMA_FATAL_WARNINGS
MK_NVCCFLAGS += -Werror all-warnings
endif # LLAMA_FATAL_WARNINGS
2024-06-26 18:33:02 +03:00
2023-12-22 23:11:12 +08:00
ifndef JETSON_EOL_MODULE_DETECT
MK_NVCCFLAGS += --forward-unknown-to-host-compiler
endif # JETSON_EOL_MODULE_DETECT
2024-06-26 18:33:02 +03:00
2023-12-13 13:04:25 +01:00
ifdef LLAMA_DEBUG
2023-12-13 12:10:10 -05:00
MK_NVCCFLAGS += -lineinfo
2023-12-24 14:34:22 +01:00
endif # LLAMA_DEBUG
2024-06-26 18:33:02 +03:00
ifdef GGML_CUDA_DEBUG
2024-05-27 19:34:40 +02:00
MK_NVCCFLAGS += --device-debug
2024-06-26 18:33:02 +03:00
endif # GGML_CUDA_DEBUG
ifdef GGML_CUDA_NVCC
NVCC = $( CCACHE) $( GGML_CUDA_NVCC)
2023-07-21 18:38:57 +08:00
else
2024-02-05 19:33:00 +01:00
NVCC = $( CCACHE) nvcc
2024-06-26 18:33:02 +03:00
endif #GGML_CUDA_NVCC
2023-07-07 11:25:25 -07:00
ifdef CUDA_DOCKER_ARCH
2023-12-13 12:10:10 -05:00
MK_NVCCFLAGS += -Wno-deprecated-gpu-targets -arch= $( CUDA_DOCKER_ARCH)
else ifndef CUDA_POWER_ARCH
MK_NVCCFLAGS += -arch= native
2023-10-23 23:46:05 +03:00
endif # CUDA_DOCKER_ARCH
2024-06-26 18:33:02 +03:00
ifdef GGML_CUDA_FORCE_DMMV
2023-12-13 12:10:10 -05:00
MK_NVCCFLAGS += -DGGML_CUDA_FORCE_DMMV
2024-06-26 18:33:02 +03:00
endif # GGML_CUDA_FORCE_DMMV
ifdef GGML_CUDA_FORCE_MMQ
2023-12-13 12:10:10 -05:00
MK_NVCCFLAGS += -DGGML_CUDA_FORCE_MMQ
2024-06-26 18:33:02 +03:00
endif # GGML_CUDA_FORCE_MMQ
ifdef GGML_CUDA_FORCE_CUBLAS
2024-06-24 17:43:42 +02:00
MK_NVCCFLAGS += -DGGML_CUDA_FORCE_CUBLAS
2024-06-26 18:33:02 +03:00
endif # GGML_CUDA_FORCE_CUBLAS
ifdef GGML_CUDA_DMMV_X
MK_NVCCFLAGS += -DGGML_CUDA_DMMV_X= $( GGML_CUDA_DMMV_X)
2023-05-25 23:07:29 +02:00
else
2023-12-13 12:10:10 -05:00
MK_NVCCFLAGS += -DGGML_CUDA_DMMV_X= 32
2024-06-26 18:33:02 +03:00
endif # GGML_CUDA_DMMV_X
ifdef GGML_CUDA_MMV_Y
MK_NVCCFLAGS += -DGGML_CUDA_MMV_Y= $( GGML_CUDA_MMV_Y)
else ifdef GGML_CUDA_DMMV_Y
MK_NVCCFLAGS += -DGGML_CUDA_MMV_Y= $( GGML_CUDA_DMMV_Y) # for backwards compatibility
2023-05-25 23:07:29 +02:00
else
2023-12-13 12:10:10 -05:00
MK_NVCCFLAGS += -DGGML_CUDA_MMV_Y= 1
2024-06-26 18:33:02 +03:00
endif # GGML_CUDA_MMV_Y
ifdef GGML_CUDA_F16
2023-12-13 12:10:10 -05:00
MK_NVCCFLAGS += -DGGML_CUDA_F16
2024-06-26 18:33:02 +03:00
endif # GGML_CUDA_F16
ifdef GGML_CUDA_DMMV_F16
2023-12-13 12:10:10 -05:00
MK_NVCCFLAGS += -DGGML_CUDA_F16
2024-06-26 18:33:02 +03:00
endif # GGML_CUDA_DMMV_F16
ifdef GGML_CUDA_KQUANTS_ITER
MK_NVCCFLAGS += -DK_QUANTS_PER_ITERATION= $( GGML_CUDA_KQUANTS_ITER)
2023-06-16 20:08:44 +03:00
else
2023-12-13 12:10:10 -05:00
MK_NVCCFLAGS += -DK_QUANTS_PER_ITERATION= 2
2023-06-16 20:08:44 +03:00
endif
2024-06-26 18:33:02 +03:00
ifdef GGML_CUDA_PEER_MAX_BATCH_SIZE
MK_NVCCFLAGS += -DGGML_CUDA_PEER_MAX_BATCH_SIZE= $( GGML_CUDA_PEER_MAX_BATCH_SIZE)
2023-09-17 16:37:53 +02:00
else
2023-12-13 12:10:10 -05:00
MK_NVCCFLAGS += -DGGML_CUDA_PEER_MAX_BATCH_SIZE= 128
2024-06-26 18:33:02 +03:00
endif # GGML_CUDA_PEER_MAX_BATCH_SIZE
ifdef GGML_CUDA_NO_PEER_COPY
2024-03-22 14:05:31 +01:00
MK_NVCCFLAGS += -DGGML_CUDA_NO_PEER_COPY
2024-06-26 18:33:02 +03:00
endif # GGML_CUDA_NO_PEER_COPY
ifdef GGML_CUDA_CCBIN
MK_NVCCFLAGS += -ccbin $( GGML_CUDA_CCBIN)
endif # GGML_CUDA_CCBIN
ifdef GGML_CUDA_FA_ALL_QUANTS
2024-06-01 08:44:14 +02:00
MK_NVCCFLAGS += -DGGML_CUDA_FA_ALL_QUANTS
2024-06-26 18:33:02 +03:00
endif # GGML_CUDA_FA_ALL_QUANTS
2024-03-25 13:50:23 +01:00
2023-12-22 23:11:12 +08:00
ifdef JETSON_EOL_MODULE_DETECT
2024-03-25 13:50:23 +01:00
define NVCC_COMPILE
2024-03-26 01:16:01 +01:00
$( NVCC ) -I. -Icommon -D_XOPEN_SOURCE = 600 -D_GNU_SOURCE -DNDEBUG -DGGML_USE_CUDA -I/usr/local/cuda/include -I/opt/cuda/include -I/usr/local/cuda/targets/aarch64-linux/include -std= c++11 -O3 $( NVCCFLAGS) $( CPPFLAGS) -Xcompiler " $( CUDA_CXXFLAGS) " -c $< -o $@
2024-03-25 13:50:23 +01:00
endef # NVCC_COMPILE
2023-12-22 23:11:12 +08:00
else
2024-03-25 13:50:23 +01:00
define NVCC_COMPILE
2024-02-19 15:54:12 -05:00
$( NVCC ) $( NVCCFLAGS ) $( CPPFLAGS ) -Xcompiler "$(CUDA_CXXFLAGS)" -c $< -o $@
2024-03-25 13:50:23 +01:00
endef # NVCC_COMPILE
2023-12-22 23:11:12 +08:00
endif # JETSON_EOL_MODULE_DETECT
2024-03-25 13:50:23 +01:00
2024-06-26 18:33:02 +03:00
ggml/src/ggml-cuda/%.o : \
ggml /src /ggml -cuda /%.cu \
ggml /include /ggml .h \
ggml /src /ggml -common .h \
ggml /src /ggml -cuda /common .cuh
2024-03-25 13:50:23 +01:00
$( NVCC_COMPILE)
2024-06-26 18:33:02 +03:00
ggml/src/ggml-cuda.o : \
ggml /src /ggml -cuda .cu \
ggml /include /ggml -cuda .h \
ggml /include /ggml .h \
ggml /include /ggml -backend .h \
ggml /src /ggml -backend -impl .h \
ggml /src /ggml -common .h \
$( wildcard ggml /src /ggml -cuda /*.cuh )
2024-03-25 13:50:23 +01:00
$( NVCC_COMPILE)
2024-06-26 18:33:02 +03:00
endif # GGML_CUDA
2023-06-04 23:34:30 +03:00
2024-06-26 18:33:02 +03:00
ifdef GGML_VULKAN
MK_CPPFLAGS += -DGGML_USE_VULKAN
MK_LDFLAGS += -lvulkan
OBJ_GGML += ggml/src/ggml-vulkan.o
2024-01-28 18:03:59 +01:00
2024-06-26 18:33:02 +03:00
ifdef GGML_VULKAN_CHECK_RESULTS
2024-01-28 18:03:59 +01:00
MK_CPPFLAGS += -DGGML_VULKAN_CHECK_RESULTS
endif
2024-06-26 18:33:02 +03:00
ifdef GGML_VULKAN_DEBUG
2024-02-03 18:15:00 +01:00
MK_CPPFLAGS += -DGGML_VULKAN_DEBUG
endif
2024-06-26 18:33:02 +03:00
ifdef GGML_VULKAN_MEMORY_DEBUG
2024-06-16 07:17:31 +02:00
MK_CPPFLAGS += -DGGML_VULKAN_MEMORY_DEBUG
endif
2024-06-26 18:33:02 +03:00
ifdef GGML_VULKAN_VALIDATE
2024-02-03 18:15:00 +01:00
MK_CPPFLAGS += -DGGML_VULKAN_VALIDATE
endif
2024-06-26 18:33:02 +03:00
ifdef GGML_VULKAN_RUN_TESTS
2024-02-03 18:15:00 +01:00
MK_CPPFLAGS += -DGGML_VULKAN_RUN_TESTS
endif
2024-06-26 18:33:02 +03:00
ggml/src/ggml-vulkan.o : \
ggml /src /ggml -vulkan .cpp \
ggml /include /ggml -vulkan .h
2024-01-28 18:03:59 +01:00
$( CXX) $( CXXFLAGS) -c $< -o $@
2024-06-26 18:33:02 +03:00
endif # GGML_VULKAN
2024-01-28 18:03:59 +01:00
2024-06-26 18:33:02 +03:00
ifdef GGML_HIPBLAS
2023-12-17 12:23:33 -03:00
ifeq ( $( wildcard /opt /rocm ) ,)
2024-06-26 18:33:02 +03:00
ROCM_PATH ?= /usr
2024-05-17 11:03:03 -04:00
AMDGPU_TARGETS ?= $( shell $( shell which amdgpu-arch))
2023-12-17 12:23:33 -03:00
else
ROCM_PATH ?= /opt/rocm
2024-05-17 11:03:03 -04:00
AMDGPU_TARGETS ?= $( shell $( ROCM_PATH) /llvm/bin/amdgpu-arch)
2023-12-17 12:23:33 -03:00
endif
2024-06-26 18:33:02 +03:00
GGML_CUDA_DMMV_X ?= 32
GGML_CUDA_MMV_Y ?= 1
GGML_CUDA_KQUANTS_ITER ?= 2
2024-03-26 01:16:01 +01:00
MK_CPPFLAGS += -DGGML_USE_HIPBLAS -DGGML_USE_CUDA
2024-06-26 18:33:02 +03:00
ifdef GGML_HIP_UMA
2023-12-22 09:03:25 +01:00
MK_CPPFLAGS += -DGGML_HIP_UMA
2024-06-26 18:33:02 +03:00
endif # GGML_HIP_UMA
2024-03-27 15:02:49 +02:00
2024-06-26 18:33:02 +03:00
MK_LDFLAGS += -L$( ROCM_PATH) /lib -Wl,-rpath= $( ROCM_PATH) /lib
MK_LDFLAGS += -L$( ROCM_PATH) /lib64 -Wl,-rpath= $( ROCM_PATH) /lib64
MK_LDFLAGS += -lhipblas -lamdhip64 -lrocblas
HIPCC ?= $( CCACHE) $( ROCM_PATH) /bin/hipcc
HIPFLAGS += $( addprefix --offload-arch= ,$( AMDGPU_TARGETS))
HIPFLAGS += -DGGML_CUDA_DMMV_X= $( GGML_CUDA_DMMV_X)
HIPFLAGS += -DGGML_CUDA_MMV_Y= $( GGML_CUDA_MMV_Y)
HIPFLAGS += -DK_QUANTS_PER_ITERATION= $( GGML_CUDA_KQUANTS_ITER)
ifdef GGML_CUDA_FORCE_DMMV
HIPFLAGS += -DGGML_CUDA_FORCE_DMMV
endif # GGML_CUDA_FORCE_DMMV
ifdef GGML_CUDA_NO_PEER_COPY
HIPFLAGS += -DGGML_CUDA_NO_PEER_COPY
endif # GGML_CUDA_NO_PEER_COPY
OBJ_GGML += ggml/src/ggml-cuda.o
OBJ_GGML += $( patsubst %.cu,%.o,$( wildcard ggml/src/ggml-cuda/*.cu))
OBJ_GGML += $( OBJ_CUDA_TMPL)
ggml/src/ggml-cuda.o : \
ggml /src /ggml -cuda .cu \
ggml /include /ggml -cuda .h \
ggml /include /ggml .h \
ggml /include /ggml -backend .h \
ggml /src /ggml -backend -impl .h \
ggml /src /ggml -common .h \
$( wildcard ggml /src /ggml -cuda /*.cuh )
2023-08-25 12:09:42 +03:00
$( HIPCC) $( CXXFLAGS) $( HIPFLAGS) -x hip -c -o $@ $<
2024-03-25 13:50:23 +01:00
2024-06-26 18:33:02 +03:00
ggml/src/ggml-cuda/%.o : \
ggml /src /ggml -cuda /%.cu \
ggml /include /ggml .h \
ggml /src /ggml -common .h \
ggml /src /ggml -cuda /common .cuh
2024-03-25 13:50:23 +01:00
$( HIPCC) $( CXXFLAGS) $( HIPFLAGS) -x hip -c -o $@ $<
2024-06-26 18:33:02 +03:00
endif # GGML_HIPBLAS
2024-03-25 13:50:23 +01:00
2024-06-26 18:33:02 +03:00
ifdef GGML_METAL
2023-09-05 15:12:00 -04:00
MK_CPPFLAGS += -DGGML_USE_METAL
2023-09-03 01:26:59 -04:00
MK_LDFLAGS += -framework Foundation -framework Metal -framework MetalKit
2024-06-26 18:33:02 +03:00
OBJ_GGML += ggml/src/ggml-metal.o
ifdef GGML_METAL_NDEBUG
2023-09-05 18:21:10 -04:00
MK_CPPFLAGS += -DGGML_METAL_NDEBUG
endif
2024-06-26 18:33:02 +03:00
ifdef GGML_METAL_EMBED_LIBRARY
2024-02-19 22:58:36 -11:00
MK_CPPFLAGS += -DGGML_METAL_EMBED_LIBRARY
2024-06-26 18:33:02 +03:00
OBJ_GGML += ggml/src/ggml-metal-embed.o
2024-02-19 22:58:36 -11:00
endif
2024-06-26 18:33:02 +03:00
endif # GGML_METAL
2023-06-04 23:34:30 +03:00
2024-06-26 18:33:02 +03:00
ifdef GGML_METAL
ggml/src/ggml-metal.o : \
ggml /src /ggml -metal .m \
ggml /include /ggml -metal .h \
ggml /include /ggml .h
2023-07-14 11:34:40 -06:00
$( CC) $( CFLAGS) -c $< -o $@
2024-02-19 22:58:36 -11:00
2024-06-26 18:33:02 +03:00
ifdef GGML_METAL_EMBED_LIBRARY
ggml/src/ggml-metal-embed.o : \
ggml /src /ggml -metal .metal \
ggml /src /ggml -common .h
2024-02-19 22:58:36 -11:00
@echo "Embedding Metal library"
2024-06-26 18:33:02 +03:00
@sed -e '/#include "ggml-common.h"/r ggml/src/ggml-common.h' -e '/#include "ggml-common.h"/d' < ggml/src/ggml-metal.metal > ggml/src/ggml-metal-embed.metal
2024-02-19 22:58:36 -11:00
$( eval TEMP_ASSEMBLY = $( shell mktemp))
2024-06-26 18:33:02 +03:00
@echo ".section __DATA, __ggml_metallib" > $( TEMP_ASSEMBLY)
@echo ".globl _ggml_metallib_start" >> $( TEMP_ASSEMBLY)
@echo "_ggml_metallib_start:" >> $( TEMP_ASSEMBLY)
@echo ".incbin \"ggml/src/ggml-metal-embed.metal\"" >> $( TEMP_ASSEMBLY)
@echo ".globl _ggml_metallib_end" >> $( TEMP_ASSEMBLY)
@echo "_ggml_metallib_end:" >> $( TEMP_ASSEMBLY)
2024-02-19 22:58:36 -11:00
@$( AS) $( TEMP_ASSEMBLY) -o $@
@rm -f ${ TEMP_ASSEMBLY }
endif
2024-06-26 18:33:02 +03:00
endif # GGML_METAL
2023-07-14 11:34:40 -06:00
2024-06-26 18:33:02 +03:00
OBJ_GGML += \
ggml/src/ggml.o \
ggml/src/ggml-alloc.o \
ggml/src/ggml-backend.o \
ggml/src/ggml-quants.o
2024-06-03 20:03:26 +03:00
2024-06-26 18:33:02 +03:00
OBJ_LLAMA = \
src/llama.o \
src/unicode.o \
src/unicode-data.o
2024-04-17 23:58:26 +03:00
2024-06-26 18:33:02 +03:00
OBJ_COMMON = \
common/common.o \
common/console.o \
common/ngram-cache.o \
common/sampling.o \
common/train.o \
common/grammar-parser.o \
common/build-info.o \
common/json-schema-to-grammar.o
2024-06-03 20:03:26 +03:00
2024-06-26 18:33:02 +03:00
OBJ_ALL = $( OBJ_GGML) $( OBJ_LLAMA) $( OBJ_COMMON)
2024-06-03 20:03:26 +03:00
2024-06-26 18:33:02 +03:00
LIB_GGML = $( LIB_PRE) ggml$( DSO_EXT)
LIB_GGML_S = $( LIB_PRE) ggml.a
LIB_LLAMA = $( LIB_PRE) llama$( DSO_EXT)
LIB_LLAMA_S = $( LIB_PRE) llama.a
LIB_COMMON = $( LIB_PRE) common$( DSO_EXT)
LIB_COMMON_S = $( LIB_PRE) common.a
LIB_ALL = $( LIB_GGML) $( LIB_LLAMA) $( LIB_COMMON)
LIB_ALL_S = $( LIB_GGML_S) $( LIB_LLAMA_S) $( LIB_COMMON_S)
2024-06-03 20:03:26 +03:00
2023-12-13 12:10:10 -05:00
GF_CC := $( CC)
include scripts/get-flags.mk
2023-09-16 17:55:43 +03:00
2023-12-13 12:10:10 -05:00
# combine build flags with cmdline overrides
2024-02-19 15:54:12 -05:00
override CPPFLAGS : = $( MK_CPPFLAGS ) $( CPPFLAGS )
override CFLAGS : = $( CPPFLAGS ) $( MK_CFLAGS ) $( GF_CFLAGS ) $( CFLAGS )
BASE_CXXFLAGS := $( MK_CXXFLAGS) $( CXXFLAGS)
override CXXFLAGS : = $( BASE_CXXFLAGS ) $( HOST_CXXFLAGS ) $( GF_CXXFLAGS ) $( CPPFLAGS )
2023-12-13 12:10:10 -05:00
override NVCCFLAGS : = $( MK_NVCCFLAGS ) $( NVCCFLAGS )
override LDFLAGS : = $( MK_LDFLAGS ) $( LDFLAGS )
# identify CUDA host compiler
2024-06-26 18:33:02 +03:00
ifdef GGML_CUDA
2023-12-13 12:10:10 -05:00
GF_CC := $( NVCC) $( NVCCFLAGS) 2>/dev/null .c -Xcompiler
include scripts/get-flags.mk
2024-02-18 16:21:52 -05:00
CUDA_CXXFLAGS := $( BASE_CXXFLAGS) $( GF_CXXFLAGS) -Wno-pedantic
2023-12-13 12:10:10 -05:00
endif
2023-09-03 01:26:59 -04:00
2024-03-17 19:12:37 +01:00
ifdef LLAMA_CURL
override CXXFLAGS : = $( CXXFLAGS ) -DLLAMA_USE_CURL
override LDFLAGS : = $( LDFLAGS ) -lcurl
endif
2023-03-10 20:40:58 +02:00
#
# Print build information
#
$(info I llama.cpp build info : )
2023-09-16 17:55:43 +03:00
$(info I UNAME_S : $( UNAME_S ) )
$(info I UNAME_P : $( UNAME_P ) )
$(info I UNAME_M : $( UNAME_M ) )
$(info I CFLAGS : $( CFLAGS ) )
$(info I CXXFLAGS : $( CXXFLAGS ) )
$(info I NVCCFLAGS : $( NVCCFLAGS ) )
$(info I LDFLAGS : $( LDFLAGS ) )
2024-02-03 20:15:13 +01:00
$(info I CC : $( shell $( CC ) --version | head -n 1) )
$(info I CXX : $( shell $( CXX ) --version | head -n 1) )
2024-06-26 18:33:02 +03:00
ifdef GGML_CUDA
2024-02-03 20:15:13 +01:00
$(info I NVCC : $( shell $( NVCC ) --version | tail -n 1) )
2024-02-26 00:46:49 +08:00
CUDA_VERSION := $( shell $( NVCC) --version | grep -oP 'release (\K[0-9]+\.[0-9])' )
2024-02-13 12:38:37 +01:00
ifeq ( $( shell awk -v "v =$( CUDA_VERSION ) " 'BEGIN { print ( v < 11.7) }') ,1)
2024-06-26 18:33:02 +03:00
2024-02-13 12:38:37 +01:00
ifndef CUDA_DOCKER_ARCH
ifndef CUDA_POWER_ARCH
2024-04-11 21:56:29 +02:00
$(error I ERROR : For CUDA versions < 11.7 a target CUDA architecture must be explicitly provided via environment variable CUDA_DOCKER_ARCH , e .g . by running "export CUDA_DOCKER_ARCH =compute_XX " on Unix -like systems , where XX is the minimum compute capability that the code needs to run on . A list with compute capabilities can be found here : https ://developer .nvidia .com /cuda -gpus )
2024-02-13 12:38:37 +01:00
endif # CUDA_POWER_ARCH
endif # CUDA_DOCKER_ARCH
2024-06-26 18:33:02 +03:00
2024-02-13 12:38:37 +01:00
endif # eq ($(shell echo "$(CUDA_VERSION) < 11.7" | bc),1)
2024-06-26 18:33:02 +03:00
endif # GGML_CUDA
2023-03-10 20:40:58 +02:00
$( info )
2024-06-26 18:33:02 +03:00
ifdef DEPRECATE_WARNING
$( info !!! DEPRECATION WARNING !!!)
$( info The following LLAMA_ options are deprecated and will be removed in the future . Use the GGML_ prefix instead )
$( info - LLAMA_CUDA )
$( info - LLAMA_METAL )
$( info - LLAMA_METAL_EMBED_LIBRARY )
$( info - LLAMA_OPENMP )
$( info - LLAMA_RPC )
$( info - LLAMA_SYCL )
$( info - LLAMA_SYCL_F 16)
$( info - LLAMA_OPENBLAS )
$( info - LLAMA_OPENBLAS 64)
$( info - LLAMA_BLIS )
$( info - LLAMA_NO_LLAMAFILE )
$( info - LLAMA_NO_ACCELERATE )
$( info - LLAMA_NO_OPENMP )
$( info - LLAMA_NO_METAL )
2024-03-26 01:16:01 +01:00
$( info )
endif
2023-03-10 20:40:58 +02:00
#
2024-06-26 18:33:02 +03:00
# Build libraries
2023-03-10 20:40:58 +02:00
#
2024-06-26 18:33:02 +03:00
# ggml
ggml/src/ggml.o : \
ggml /src /ggml .c \
ggml /include /ggml .h
2023-04-14 19:39:48 +00:00
$( CC) $( CFLAGS) -c $< -o $@
2023-03-10 20:40:58 +02:00
2024-06-26 18:33:02 +03:00
ggml/src/ggml-alloc.o : \
ggml /src /ggml -alloc .c \
ggml /include /ggml .h \
ggml /include /ggml -alloc .h
2023-07-30 15:58:01 +02:00
$( CC) $( CFLAGS) -c $< -o $@
2024-06-26 18:33:02 +03:00
ggml/src/ggml-backend.o : \
ggml /src /ggml -backend .c \
ggml /include /ggml .h \
ggml /include /ggml -backend .h
2023-10-08 20:19:14 +03:00
$( CC) $( CFLAGS) -c $< -o $@
2023-07-30 15:58:01 +02:00
2024-06-26 18:33:02 +03:00
ggml/src/ggml-quants.o : \
ggml /src /ggml -quants .c \
ggml /include /ggml .h \
ggml /src /ggml -quants .h \
ggml /src /ggml -common .h
2023-10-29 18:32:28 +02:00
$( CC) $( CFLAGS) -c $< -o $@
2024-06-26 18:33:02 +03:00
ggml/src/ggml-blas.o : \
ggml /src /ggml -blas .cpp \
ggml /include /ggml -blas .h
2024-06-13 03:11:35 +02:00
$( CXX) $( CXXFLAGS) -c $< -o $@
2024-06-26 18:33:02 +03:00
ifndef GGML_NO_LLAMAFILE
ggml/src/sgemm.o : \
ggml /src /sgemm .cpp \
ggml /src /sgemm .h \
ggml /include /ggml .h
2024-03-11 17:47:47 +02:00
$( CXX) $( CXXFLAGS) -c $< -o $@
2024-06-26 18:33:02 +03:00
endif # GGML_NO_LLAMAFILE
2023-10-08 20:19:14 +03:00
2024-06-26 18:33:02 +03:00
ifdef GGML_RPC
ggml/src/ggml-rpc.o : \
ggml /src /ggml -rpc .cpp \
ggml /include /ggml -rpc .h
2024-03-26 17:46:21 -04:00
$( CXX) $( CXXFLAGS) -c $< -o $@
2024-06-26 18:33:02 +03:00
endif # GGML_RPC
2024-03-26 17:46:21 -04:00
2024-06-26 18:33:02 +03:00
$(LIB_GGML) : \
$( OBJ_GGML )
2023-05-01 09:23:47 -07:00
$( CXX) $( CXXFLAGS) -shared -fPIC -o $@ $^ $( LDFLAGS)
2023-03-10 20:40:58 +02:00
2024-06-26 18:33:02 +03:00
$(LIB_GGML_S) : \
$( OBJ_GGML )
ar rcs $( LIB_GGML_S) $^
# llama
src/unicode.o : \
src /unicode .cpp \
src /unicode .h
$( CXX) $( CXXFLAGS) -c $< -o $@
src/unicode-data.o : \
src /unicode -data .cpp \
src /unicode -data .h
$( CXX) $( CXXFLAGS) -c $< -o $@
src/llama.o : \
src /llama .cpp \
src /unicode .h \
include /llama .h \
ggml /include /ggml -cuda .h \
ggml /include /ggml -metal .h \
ggml /include /ggml .h \
ggml /include /ggml -alloc .h \
ggml /include /ggml -backend .h
$( CXX) $( CXXFLAGS) -c $< -o $@
$(LIB_LLAMA) : \
$( OBJ_LLAMA ) \
$( LIB_GGML )
$( CXX) $( CXXFLAGS) -shared -fPIC -o $@ $^ $( LDFLAGS)
$(LIB_LLAMA_S) : \
$( OBJ_LLAMA )
ar rcs $( LIB_LLAMA_S) $^
# common
common/common.o : \
common /common .cpp \
common /common .h \
common /console .h \
common /sampling .h \
common /json .hpp \
common /json -schema -to -grammar .h \
include /llama .h
$( CXX) $( CXXFLAGS) -c $< -o $@
common/sampling.o : \
common /sampling .cpp \
common /sampling .h \
include /llama .h
$( CXX) $( CXXFLAGS) -c $< -o $@
common/console.o : \
common /console .cpp \
common /console .h
$( CXX) $( CXXFLAGS) -c $< -o $@
common/grammar-parser.o : \
common /grammar -parser .cpp \
common /grammar -parser .h
$( CXX) $( CXXFLAGS) -c $< -o $@
common/json-schema-to-grammar.o : \
common /json -schema -to -grammar .cpp \
common /json -schema -to -grammar .h
$( CXX) $( CXXFLAGS) -c $< -o $@
common/train.o : \
common /train .cpp \
common /train .h
$( CXX) $( CXXFLAGS) -c $< -o $@
common/ngram-cache.o : \
common /ngram -cache .cpp \
common /ngram -cache .h
$( CXX) $( CXXFLAGS) -c $< -o $@
$(LIB_COMMON) : \
$( OBJ_COMMON ) \
$( LIB_LLAMA ) \
$( LIB_GGML )
$( CXX) $( CXXFLAGS) -shared -fPIC -o $@ $^ $( LDFLAGS)
$(LIB_COMMON_S) : \
$( OBJ_COMMON )
ar rcs $( LIB_COMMON_S) $^
2024-02-02 02:18:53 +11:00
2023-05-01 09:23:47 -07:00
clean :
2024-06-26 18:33:02 +03:00
rm -vrf *.dot $( BUILD_TARGETS) $( TEST_TARGETS)
rm -rvf src/*.o
rm -rvf tests/*.o
rm -rvf examples/*.o
2024-06-28 02:19:11 +02:00
rm -rvf common/*.o
2024-06-26 18:33:02 +03:00
rm -rvf *.a
rm -rvf *.dll
rm -rvf *.so
rm -rvf *.dot
rm -rvf ggml/*.a
rm -rvf ggml/*.dll
rm -rvf ggml/*.so
rm -vrf ggml/src/*.o
rm -rvf common/build-info.cpp
rm -vrf ggml/src/ggml-metal-embed.metal
rm -vrf ggml/src/ggml-cuda/*.o
rm -vrf ggml/src/ggml-cuda/template-instances/*.o
rm -rvf $( BUILD_TARGETS)
rm -rvf $( TEST_TARGETS)
2024-07-02 13:19:56 -04:00
rm -rvf $( LEGACY_TARGETS)
2024-02-05 19:33:00 +01:00
find examples pocs -type f -name "*.o" -delete
2023-05-01 09:23:47 -07:00
#
# Examples
#
2024-02-05 19:33:00 +01:00
# $< is the first prerequisite, i.e. the source file.
# Explicitly compile this to an object file so that it can be cached with ccache.
# The source file is then filtered out from $^ (the list of all prerequisites) and the object file is added instead.
# Helper function that replaces .c, .cpp, and .cu file endings with .o:
GET_OBJ_FILE = $( patsubst %.c,%.o,$( patsubst %.cpp,%.o,$( patsubst %.cu,%.o,$( 1))))
2024-06-26 18:33:02 +03:00
llama-cli : examples /main /main .cpp \
$( OBJ_ALL )
2024-02-05 19:33:00 +01:00
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
2023-03-23 05:41:32 -06:00
@echo
2024-06-13 00:41:52 +01:00
@echo '==== Run ./llama-cli -h for help. ===='
2023-03-23 05:41:32 -06:00
@echo
2023-03-10 20:40:58 +02:00
2024-06-26 18:33:02 +03:00
llama-infill : examples /infill /infill .cpp \
$( OBJ_ALL )
2024-02-05 19:33:00 +01:00
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
2023-10-02 09:42:02 +02:00
2024-06-26 18:33:02 +03:00
llama-simple : examples /simple /simple .cpp \
$( OBJ_ALL )
2024-02-05 19:33:00 +01:00
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
2023-06-16 20:58:09 +02:00
2024-06-26 18:33:02 +03:00
llama-tokenize : examples /tokenize /tokenize .cpp \
$( OBJ_ALL )
2024-02-05 19:33:00 +01:00
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
2023-11-18 14:48:17 -07:00
2024-06-26 18:33:02 +03:00
llama-batched : examples /batched /batched .cpp \
$( OBJ_ALL )
2024-02-05 19:33:00 +01:00
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
2023-09-28 19:04:36 +03:00
2024-06-26 18:33:02 +03:00
llama-batched-bench : examples /batched -bench /batched -bench .cpp \
$( OBJ_ALL )
2024-02-05 19:33:00 +01:00
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
2023-10-11 21:25:33 +03:00
2024-06-26 18:33:02 +03:00
llama-quantize : examples /quantize /quantize .cpp \
$( OBJ_ALL )
2024-02-05 19:33:00 +01:00
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
2023-03-25 20:26:40 +02:00
2024-06-26 18:33:02 +03:00
llama-quantize-stats : examples /quantize -stats /quantize -stats .cpp \
$( OBJ_ALL )
2024-02-05 19:33:00 +01:00
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
2023-04-08 00:09:18 +02:00
2024-06-26 18:33:02 +03:00
llama-perplexity : examples /perplexity /perplexity .cpp \
$( OBJ_ALL )
2024-02-05 19:33:00 +01:00
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
2024-01-12 06:59:57 +01:00
2024-06-26 18:33:02 +03:00
llama-imatrix : examples /imatrix /imatrix .cpp \
$( OBJ_ALL )
2024-02-05 19:33:00 +01:00
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
2023-03-10 20:40:58 +02:00
2024-06-26 18:33:02 +03:00
llama-embedding : examples /embedding /embedding .cpp \
$( OBJ_ALL )
2024-02-05 19:33:00 +01:00
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
2023-03-28 08:11:09 +02:00
2024-06-26 18:33:02 +03:00
llama-gritlm : examples /gritlm /gritlm .cpp \
$( OBJ_ALL )
2024-03-10 11:56:30 -04:00
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
2024-06-26 18:33:02 +03:00
llama-save-load-state : examples /save -load -state /save -load -state .cpp \
$( OBJ_ALL )
2024-02-05 19:33:00 +01:00
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
2023-04-18 21:00:14 +02:00
2024-06-26 18:33:02 +03:00
llama-gguf : examples /gguf /gguf .cpp \
$( OBJ_GGML )
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
2024-07-07 22:58:43 +10:00
examples/gguf-hash/deps/sha1/sha1.o : \
examples /gguf -hash /deps /sha 1/sha 1.c
$( CC) $( CFLAGS) -Iexamples/gguf-hash/deps -c $< -o $@
examples/gguf-hash/deps/xxhash/xxhash.o : \
examples /gguf -hash /deps /xxhash /xxhash .c
$( CC) $( CFLAGS) -Iexamples/gguf-hash/deps -c $< -o $@
examples/gguf-hash/deps/sha256/sha256.o : \
examples /gguf -hash /deps /sha 256/sha 256.c
$( CC) $( CFLAGS) -Iexamples/gguf-hash/deps -c $< -o $@
llama-gguf-hash : examples /gguf -hash /gguf -hash .cpp examples /gguf -hash /deps /sha 1/sha 1.o examples /gguf -hash /deps /xxhash /xxhash .o examples /gguf -hash /deps /sha 256/sha 256.o \
$( OBJ_ALL )
$( CXX) $( CXXFLAGS) -Iexamples/gguf-hash/deps -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
2024-06-26 18:33:02 +03:00
llama-gguf-split : examples /gguf -split /gguf -split .cpp \
$( OBJ_ALL )
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
llama-eval-callback : examples /eval -callback /eval -callback .cpp \
$( OBJ_ALL )
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
llama-cvector-generator : examples /cvector -generator /cvector -generator .cpp \
$( OBJ_ALL )
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
llama-train-text-from-scratch : examples /train -text -from -scratch /train -text -from -scratch .cpp \
$( OBJ_ALL )
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
llama-convert-llama2c-to-ggml : examples /convert -llama 2c -to -ggml /convert -llama 2c -to -ggml .cpp \
$( OBJ_GGML ) $( OBJ_LLAMA )
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
llama-bench : examples /llama -bench /llama -bench .cpp \
$( OBJ_ALL )
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
llama-baby-llama : examples /baby -llama /baby -llama .cpp \
$( OBJ_ALL )
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
llama-finetune : examples /finetune /finetune .cpp \
$( OBJ_ALL )
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
llama-export-lora : examples /export -lora /export -lora .cpp \
$( OBJ_GGML ) common /log .h
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
llama-retrieval : examples /retrieval /retrieval .cpp \
$( OBJ_ALL )
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
llama-speculative : examples /speculative /speculative .cpp \
$( OBJ_ALL )
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
llama-parallel : examples /parallel /parallel .cpp \
$( OBJ_ALL )
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
llama-lookahead : examples /lookahead /lookahead .cpp \
$( OBJ_ALL )
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
llama-lookup : examples /lookup /lookup .cpp \
$( OBJ_ALL )
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
llama-lookup-create : examples /lookup /lookup -create .cpp \
$( OBJ_ALL )
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
llama-lookup-merge : examples /lookup /lookup -merge .cpp \
$( OBJ_ALL )
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
llama-lookup-stats : examples /lookup /lookup -stats .cpp \
$( OBJ_ALL )
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
llama-passkey : examples /passkey /passkey .cpp \
$( OBJ_ALL )
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
llama-gbnf-validator : examples /gbnf -validator /gbnf -validator .cpp \
$( OBJ_ALL )
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
ifdef GGML_RPC
rpc-server : examples /rpc /rpc -server .cpp \
$( OBJ_GGML )
$( CXX) $( CXXFLAGS) $^ -o $@ $( LDFLAGS)
endif # GGML_RPC
llama-server : \
examples /server /server .cpp \
examples /server /utils .hpp \
examples /server /httplib .h \
examples /server /colorthemes .css .hpp \
examples /server /style .css .hpp \
examples /server /theme -beeninorder .css .hpp \
examples /server /theme -ketivah .css .hpp \
examples /server /theme -mangotango .css .hpp \
examples /server /theme -playground .css .hpp \
examples /server /theme -polarnight .css .hpp \
examples /server /theme -snowstorm .css .hpp \
examples /server /index .html .hpp \
examples /server /index -new .html .hpp \
examples /server /index .js .hpp \
examples /server /completion .js .hpp \
examples /server /system -prompts .js .hpp \
examples /server /prompt -formats .js .hpp \
examples /server /json -schema -to -grammar .mjs .hpp \
common /json .hpp \
common /stb_image .h \
$( OBJ_ALL )
2024-02-05 19:33:00 +01:00
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
2024-03-07 11:41:53 +02:00
$( CXX) $( CXXFLAGS) $( filter-out %.h %.hpp $<,$^) -Iexamples/server $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS) $( LWINSOCK2)
2023-05-27 11:04:14 -06:00
2024-04-21 18:48:53 +01:00
# Portable equivalent of `cd examples/server/public && xxd -i $(notdir $<) ../$(notdir $<).hpp`:
examples/server/%.hpp : examples /server /public /% Makefile
@( export NAME = $( subst .,_,$( subst -,_,$( notdir $<))) && \
echo "unsigned char $$ {NAME}[] = {" && \
cat $< | od -v -t x1 -An | sed -E 's/([0-9a-fA-F]+)/0x\1, /g' && \
echo "};" && \
echo "unsigned int $$ {NAME}_len = $( shell cat $< | wc -c ) ;" \
) > $@
2024-06-26 18:33:02 +03:00
libllava.a : examples /llava /llava .cpp \
examples /llava /llava .h \
examples /llava /clip .cpp \
examples /llava /clip .h \
common /stb_image .h \
common /base 64.hpp \
$( OBJ_ALL )
2023-11-07 19:25:32 +02:00
$( CXX) $( CXXFLAGS) -static -fPIC -c $< -o $@ -Wno-cast-qual
2023-11-06 22:36:23 +01:00
2024-06-26 18:33:02 +03:00
llama-llava-cli : examples /llava /llava -cli .cpp \
examples /llava /clip .h \
examples /llava /clip .cpp \
examples /llava /llava .h \
examples /llava /llava .cpp \
$( OBJ_ALL )
2024-02-05 19:33:00 +01:00
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) -c examples/llava/clip.cpp -o $( call GET_OBJ_FILE, examples/llava/clip.cpp) -Wno-cast-qual
$( CXX) $( CXXFLAGS) -c examples/llava/llava.cpp -o $( call GET_OBJ_FILE, examples/llava/llava.cpp)
$( CXX) $( CXXFLAGS) $( filter-out %.h $< examples/llava/clip.cpp examples/llava/llava.cpp,$^) $( call GET_OBJ_FILE, $<) $( call GET_OBJ_FILE, examples/llava/clip.cpp) $( call GET_OBJ_FILE, examples/llava/llava.cpp) -o $@ $( LDFLAGS)
2023-10-12 18:23:18 +03:00
2023-10-11 04:14:05 -07:00
ifeq ( $( UNAME_S ) ,Darwin)
swift : examples /batched .swift
( cd examples/batched.swift; make build)
endif
2023-11-02 02:50:16 -04:00
common/build-info.cpp : $( wildcard .git /index ) scripts /build -info .sh
2024-02-05 19:33:00 +01:00
@sh scripts/build-info.sh " $( CC) " > $@ .tmp
2023-05-01 09:23:47 -07:00
@if ! cmp -s $@ .tmp $@ ; then \
mv $@ .tmp $@ ; \
else \
rm $@ .tmp; \
fi
2023-04-13 09:03:57 -05:00
2024-06-26 18:33:02 +03:00
common/build-info.o : common /build -info .cpp
2023-11-02 02:50:16 -04:00
$( CXX) $( CXXFLAGS) -c $( filter-out %.h,$^) -o $@
2023-03-10 20:40:58 +02:00
#
# Tests
#
2023-07-21 12:09:16 +02:00
tests : $( TEST_TARGETS )
2024-06-26 18:33:02 +03:00
llama-benchmark-matmult : examples /benchmark /benchmark -matmult .cpp \
$( OBJ_GGML ) common /build -info .o
2024-02-05 19:33:00 +01:00
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
2023-09-28 17:41:44 -04:00
2024-06-13 00:41:52 +01:00
run-benchmark-matmult : llama -benchmark -matmult
2023-04-30 12:32:37 +00:00
./$@
2023-04-13 09:03:57 -05:00
2023-10-11 04:14:05 -07:00
.PHONY : run -benchmark -matmult swift
2023-09-28 17:41:44 -04:00
2024-06-26 18:33:02 +03:00
tests/test-llama-grammar : tests /test -llama -grammar .cpp \
$( OBJ_GGML ) $( OBJ_COMMON ) src /unicode .o src /unicode -data .o
2024-02-05 19:33:00 +01:00
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
2023-08-17 03:41:01 -04:00
2024-06-26 18:33:02 +03:00
tests/test-grammar-parser : tests /test -grammar -parser .cpp \
$( OBJ_ALL )
2024-02-05 19:33:00 +01:00
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
2023-08-13 10:00:48 -04:00
2024-06-26 18:33:02 +03:00
tests/test-grammar-integration : tests /test -grammar -integration .cpp \
$( OBJ_ALL )
2024-04-06 10:31:33 -04:00
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
2024-06-26 18:33:02 +03:00
tests/test-double-float : tests /test -double -float .cpp
2024-02-05 19:33:00 +01:00
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
2023-07-21 12:09:16 +02:00
2024-06-26 18:33:02 +03:00
tests/test-json-schema-to-grammar : tests /test -json -schema -to -grammar .cpp \
$( OBJ_ALL )
2024-03-21 11:50:43 +00:00
$( CXX) $( CXXFLAGS) -Iexamples/server -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
2024-06-26 18:33:02 +03:00
tests/test-grad0 : tests /test -grad 0.cpp \
$( OBJ_GGML )
2024-02-05 19:33:00 +01:00
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
2023-07-21 12:09:16 +02:00
2024-06-26 18:33:02 +03:00
tests/test-opt : tests /test -opt .cpp \
$( OBJ_GGML )
2024-02-05 19:33:00 +01:00
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
2023-07-21 12:09:16 +02:00
2024-06-26 18:33:02 +03:00
tests/test-quantize-fns : tests /test -quantize -fns .cpp \
$( OBJ_GGML )
2024-02-05 19:33:00 +01:00
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
2023-07-21 12:09:16 +02:00
2024-06-26 18:33:02 +03:00
tests/test-quantize-perf : tests /test -quantize -perf .cpp \
$( OBJ_GGML )
2024-02-05 19:33:00 +01:00
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
2023-07-21 12:09:16 +02:00
2024-06-26 18:33:02 +03:00
tests/test-sampling : tests /test -sampling .cpp \
$( OBJ_ALL )
2024-02-05 19:33:00 +01:00
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
2023-07-21 12:09:16 +02:00
2024-06-26 18:33:02 +03:00
tests/test-tokenizer-0 : tests /test -tokenizer -0.cpp \
$( OBJ_ALL )
2024-02-05 19:33:00 +01:00
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
2023-08-28 18:38:35 +03:00
2024-06-26 18:33:02 +03:00
tests/test-tokenizer-1-bpe : tests /test -tokenizer -1-bpe .cpp \
$( OBJ_ALL )
2024-02-05 19:33:00 +01:00
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
2023-10-03 09:16:26 +02:00
2024-06-26 18:33:02 +03:00
tests/test-tokenizer-1-spm : tests /test -tokenizer -1-spm .cpp \
$( OBJ_ALL )
2024-02-05 19:33:00 +01:00
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
2023-08-30 02:20:26 -04:00
2024-06-26 18:33:02 +03:00
tests/test-rope : tests /test -rope .cpp ggml /src /ggml .o \
$( OBJ_GGML )
2024-02-05 19:33:00 +01:00
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
2023-11-30 17:23:08 -05:00
2024-06-26 18:33:02 +03:00
tests/test-c.o : tests /test -c .c include /llama .h
2023-08-30 02:20:26 -04:00
$( CC) $( CFLAGS) -c $( filter-out %.h,$^) -o $@
2023-12-07 22:26:54 +02:00
2024-06-26 18:33:02 +03:00
tests/test-backend-ops : tests /test -backend -ops .cpp \
$( OBJ_GGML )
2024-02-05 19:33:00 +01:00
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
2024-01-17 18:38:39 +02:00
2024-06-26 18:33:02 +03:00
tests/test-model-load-cancel : tests /test -model -load -cancel .cpp tests /get -model .cpp \
$( OBJ_ALL )
2024-02-05 19:33:00 +01:00
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
2024-01-26 07:18:00 -05:00
2024-06-26 18:33:02 +03:00
tests/test-autorelease : tests /test -autorelease .cpp tests /get -model .cpp \
$( OBJ_ALL )
2024-02-05 19:33:00 +01:00
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
2024-02-19 09:23:37 +01:00
2024-06-26 18:33:02 +03:00
tests/test-chat-template : tests /test -chat -template .cpp \
$( OBJ_ALL )
2024-02-19 09:23:37 +01:00
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out %.h $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
2024-06-26 18:33:02 +03:00
#
# PoCs
#
llama-vdot : pocs /vdot /vdot .cpp ggml /src /ggml .o \
$( OBJ_GGML )
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)
llama-q8dot : pocs /vdot /q 8dot .cpp ggml /src /ggml .o \
$( OBJ_GGML )
$( CXX) $( CXXFLAGS) -c $< -o $( call GET_OBJ_FILE, $<)
$( CXX) $( CXXFLAGS) $( filter-out $<,$^) $( call GET_OBJ_FILE, $<) -o $@ $( LDFLAGS)