2025-01-18 16:18:15 +02:00
llama_add_compile_flags ()
2025-04-24 16:00:10 +03:00
function ( llama_build source )
2025-12-03 04:45:32 -06:00
set ( TEST_SOURCES ${ source } ${ ARGN } )
2025-04-24 16:00:10 +03:00
if ( DEFINED LLAMA_TEST_NAME )
set ( TEST_TARGET ${ LLAMA_TEST_NAME } )
else ()
get_filename_component ( TEST_TARGET ${ source } NAME_WE )
endif ()
2025-12-03 04:45:32 -06:00
add_executable ( ${ TEST_TARGET } ${ TEST_SOURCES } )
2025-04-24 16:00:10 +03:00
target_link_libraries ( ${ TEST_TARGET } PRIVATE common )
install ( TARGETS ${ TEST_TARGET } RUNTIME )
endfunction ()
2024-04-29 16:58:41 +03:00
function ( llama_test target )
include ( CMakeParseArguments )
set ( options )
set ( oneValueArgs NAME LABEL WORKING_DIRECTORY )
set ( multiValueArgs ARGS )
cmake_parse_arguments ( LLAMA_TEST "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ ARGN } )
if ( NOT DEFINED LLAMA_TEST_LABEL )
set ( LLAMA_TEST_LABEL "main" )
endif ()
if ( NOT DEFINED LLAMA_TEST_WORKING_DIRECTORY )
set ( LLAMA_TEST_WORKING_DIRECTORY . )
endif ()
if ( DEFINED LLAMA_TEST_NAME )
set ( TEST_NAME ${ LLAMA_TEST_NAME } )
else ()
set ( TEST_NAME ${ target } )
endif ()
set ( TEST_TARGET ${ target } )
add_test (
NAME ${ TEST_NAME }
WORKING_DIRECTORY ${ LLAMA_TEST_WORKING_DIRECTORY }
COMMAND $< TARGET_FILE:${TEST_TARGET} >
${ LLAMA_TEST_ARGS } )
set_property ( TEST ${ TEST_NAME } PROPERTY LABELS ${ LLAMA_TEST_LABEL } )
endfunction ()
2025-06-11 17:16:32 +02:00
function ( llama_test_cmd target )
include ( CMakeParseArguments )
set ( options )
set ( oneValueArgs NAME LABEL WORKING_DIRECTORY )
set ( multiValueArgs ARGS )
cmake_parse_arguments ( LLAMA_TEST "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ ARGN } )
if ( NOT DEFINED LLAMA_TEST_LABEL )
set ( LLAMA_TEST_LABEL "main" )
endif ()
if ( NOT DEFINED LLAMA_TEST_WORKING_DIRECTORY )
set ( LLAMA_TEST_WORKING_DIRECTORY . )
endif ()
if ( DEFINED LLAMA_TEST_NAME )
set ( TEST_NAME ${ LLAMA_TEST_NAME } )
else ()
set ( TEST_NAME ${ target } )
endif ()
add_test (
NAME ${ TEST_NAME }
WORKING_DIRECTORY ${ LLAMA_TEST_WORKING_DIRECTORY }
COMMAND ${ target }
${ LLAMA_TEST_ARGS } )
set_property ( TEST ${ TEST_NAME } PROPERTY LABELS ${ LLAMA_TEST_LABEL } )
endfunction ()
2024-03-21 11:50:43 +00:00
# Builds and runs a test source file.
# Optional args:
# - NAME: name of the executable & test target (defaults to the source file name without extension)
# - LABEL: label for the test (defaults to main)
# - ARGS: arguments to pass to the test executable
# - WORKING_DIRECTORY
2025-04-24 16:00:10 +03:00
function ( llama_build_and_test source )
2024-03-21 11:50:43 +00:00
include ( CMakeParseArguments )
set ( options )
set ( oneValueArgs NAME LABEL WORKING_DIRECTORY )
set ( multiValueArgs ARGS )
cmake_parse_arguments ( LLAMA_TEST "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ ARGN } )
2025-12-03 04:45:32 -06:00
set ( TEST_SOURCES ${ source } ${ LLAMA_TEST_UNPARSED_ARGUMENTS } get-model.cpp )
2024-03-21 11:50:43 +00:00
if ( NOT DEFINED LLAMA_TEST_LABEL )
set ( LLAMA_TEST_LABEL "main" )
endif ()
if ( NOT DEFINED LLAMA_TEST_WORKING_DIRECTORY )
set ( LLAMA_TEST_WORKING_DIRECTORY . )
endif ()
if ( DEFINED LLAMA_TEST_NAME )
set ( TEST_TARGET ${ LLAMA_TEST_NAME } )
else ()
get_filename_component ( TEST_TARGET ${ source } NAME_WE )
endif ()
2025-12-03 04:45:32 -06:00
add_executable ( ${ TEST_TARGET } ${ TEST_SOURCES } )
2023-07-19 15:01:11 +08:00
install ( TARGETS ${ TEST_TARGET } RUNTIME )
2024-04-15 18:35:21 +01:00
target_link_libraries ( ${ TEST_TARGET } PRIVATE common )
2025-04-24 16:00:10 +03:00
2024-03-21 11:50:43 +00:00
add_test (
NAME ${ TEST_TARGET }
WORKING_DIRECTORY ${ LLAMA_TEST_WORKING_DIRECTORY }
COMMAND $< TARGET_FILE:${TEST_TARGET} >
${ LLAMA_TEST_ARGS } )
set_property ( TEST ${ TEST_TARGET } PROPERTY LABELS ${ LLAMA_TEST_LABEL } )
2023-08-21 23:07:43 +03:00
endfunction ()
2024-04-29 16:58:41 +03:00
# build test-tokenizer-0 target once and add many tests
2025-04-24 16:00:10 +03:00
llama_build ( test-tokenizer-0.cpp )
2023-08-21 23:07:43 +03:00
2025-06-11 19:04:23 +02:00
llama_test ( test-tokenizer-0 NAME test-tokenizer-0-bert-bge ARGS ${ PROJECT_SOURCE_DIR } /models/ggml-vocab-bert-bge.gguf )
llama_test ( test-tokenizer-0 NAME test-tokenizer-0-command-r ARGS ${ PROJECT_SOURCE_DIR } /models/ggml-vocab-command-r.gguf )
llama_test ( test-tokenizer-0 NAME test-tokenizer-0-deepseek-coder ARGS ${ PROJECT_SOURCE_DIR } /models/ggml-vocab-deepseek-coder.gguf )
llama_test ( test-tokenizer-0 NAME test-tokenizer-0-deepseek-llm ARGS ${ PROJECT_SOURCE_DIR } /models/ggml-vocab-deepseek-llm.gguf )
llama_test ( test-tokenizer-0 NAME test-tokenizer-0-falcon ARGS ${ PROJECT_SOURCE_DIR } /models/ggml-vocab-falcon.gguf )
llama_test ( test-tokenizer-0 NAME test-tokenizer-0-gpt-2 ARGS ${ PROJECT_SOURCE_DIR } /models/ggml-vocab-gpt-2.gguf )
llama_test ( test-tokenizer-0 NAME test-tokenizer-0-llama-bpe ARGS ${ PROJECT_SOURCE_DIR } /models/ggml-vocab-llama-bpe.gguf )
llama_test ( test-tokenizer-0 NAME test-tokenizer-0-llama-spm ARGS ${ PROJECT_SOURCE_DIR } /models/ggml-vocab-llama-spm.gguf )
llama_test ( test-tokenizer-0 NAME test-tokenizer-0-mpt ARGS ${ PROJECT_SOURCE_DIR } /models/ggml-vocab-mpt.gguf )
llama_test ( test-tokenizer-0 NAME test-tokenizer-0-phi-3 ARGS ${ PROJECT_SOURCE_DIR } /models/ggml-vocab-phi-3.gguf )
llama_test ( test-tokenizer-0 NAME test-tokenizer-0-qwen2 ARGS ${ PROJECT_SOURCE_DIR } /models/ggml-vocab-qwen2.gguf )
llama_test ( test-tokenizer-0 NAME test-tokenizer-0-refact ARGS ${ PROJECT_SOURCE_DIR } /models/ggml-vocab-refact.gguf )
llama_test ( test-tokenizer-0 NAME test-tokenizer-0-starcoder ARGS ${ PROJECT_SOURCE_DIR } /models/ggml-vocab-starcoder.gguf )
2024-01-26 07:18:00 -05:00
2025-06-11 17:16:32 +02:00
if ( NOT WIN32 )
llama_test_cmd (
${ CMAKE_CURRENT_SOURCE_DIR } /test-tokenizers-repo.sh
NAME test-tokenizers-ggml-vocabs
WORKING_DIRECTORY ${ CMAKE_RUNTIME_OUTPUT_DIRECTORY }
2025-06-11 19:04:23 +02:00
ARGS https://huggingface.co/ggml-org/vocabs ${ PROJECT_SOURCE_DIR } /models/ggml-vocabs
2025-06-11 17:16:32 +02:00
)
endif ()
2025-05-30 12:24:37 +02:00
2025-02-01 23:55:32 -08:00
if ( LLAMA_LLGUIDANCE )
2025-06-11 19:04:23 +02:00
llama_build_and_test ( test-grammar-llguidance.cpp ARGS ${ PROJECT_SOURCE_DIR } /models/ggml-vocab-llama-bpe.gguf )
2025-02-01 23:55:32 -08:00
endif ()
2023-03-22 17:29:06 +00:00
2025-06-09 11:03:09 -07:00
if ( NOT WIN32 OR NOT BUILD_SHARED_LIBS )
# these tests are disabled on Windows because they use internal functions not exported with LLAMA_API (when building with shared libraries)
2025-04-24 16:00:10 +03:00
llama_build_and_test ( test-sampling.cpp )
llama_build_and_test ( test-grammar-parser.cpp )
llama_build_and_test ( test-grammar-integration.cpp )
llama_build_and_test ( test-llama-grammar.cpp )
llama_build_and_test ( test-chat.cpp )
2024-12-12 19:02:49 +01:00
# TODO: disabled on loongarch64 because the ggml-ci node lacks Python 3.8
if ( NOT ${ CMAKE_SYSTEM_PROCESSOR } MATCHES "loongarch64" )
2025-06-11 19:04:23 +02:00
llama_build_and_test ( test-json-schema-to-grammar.cpp WORKING_DIRECTORY ${ PROJECT_SOURCE_DIR } )
target_include_directories ( test-json-schema-to-grammar PRIVATE ${ PROJECT_SOURCE_DIR } /tools/server )
2024-12-12 19:02:49 +01:00
endif ()
2023-12-07 22:26:54 +02:00
2025-05-04 14:20:49 +02:00
if ( NOT GGML_BACKEND_DL )
llama_build ( test-quantize-stats.cpp )
endif ()
2025-04-24 16:00:10 +03:00
llama_build ( test-gbnf-validator.cpp )
2023-12-07 22:26:54 +02:00
2024-12-12 19:02:49 +01:00
# build test-tokenizer-1-bpe target once and add many tests
2025-04-24 16:00:10 +03:00
llama_build ( test-tokenizer-1-bpe.cpp )
2024-12-12 19:02:49 +01:00
# TODO: disabled due to slowness
2025-06-11 19:04:23 +02:00
#llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-aquila ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-aquila.gguf)
#llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-falcon ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-falcon.gguf)
#llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-gpt-2 ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-gpt-2.gguf)
#llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-gpt-neox ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-gpt-neox.gguf)
#llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-llama-bpe ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-llama-bpe.gguf --ignore-merges)
#llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-mpt ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-mpt.gguf)
#llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-refact ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-refact.gguf)
#llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-starcoder ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-starcoder.gguf)
2024-12-12 19:02:49 +01:00
# build test-tokenizer-1-spm target once and add many tests
2025-04-24 16:00:10 +03:00
llama_build ( test-tokenizer-1-spm.cpp )
2024-12-12 19:02:49 +01:00
2025-06-11 19:04:23 +02:00
llama_test ( test-tokenizer-1-spm NAME test-tokenizer-1-llama-spm ARGS ${ PROJECT_SOURCE_DIR } /models/ggml-vocab-llama-spm.gguf )
#llama_test(test-tokenizer-1-spm NAME test-tokenizer-1-baichuan ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-baichuan.gguf)
2024-12-12 19:02:49 +01:00
2025-04-24 16:00:10 +03:00
# llama_build_and_test(test-double-float.cpp) # SLOW
2024-12-12 19:02:49 +01:00
endif ()
2023-12-07 22:26:54 +02:00
2025-05-25 01:48:08 +01:00
llama_build_and_test ( test-chat-parser.cpp )
2025-12-03 04:45:32 -06:00
llama_build_and_test ( test-chat-peg-parser.cpp peg-parser/simple-tokenize.cpp )
2025-04-24 16:00:10 +03:00
llama_build_and_test ( test-chat-template.cpp )
2025-05-25 01:48:08 +01:00
llama_build_and_test ( test-json-partial.cpp )
llama_build_and_test ( test-log.cpp )
2025-12-03 04:45:32 -06:00
llama_build_and_test (
test-peg-parser.cpp
peg-parser/simple-tokenize.cpp
peg-parser/test-basic.cpp
peg-parser/test-gbnf-generation.cpp
peg-parser/test-json-parser.cpp
peg-parser/test-json-serialization.cpp
peg-parser/test-unicode.cpp
peg-parser/testing.h
peg-parser/tests.h
)
2025-05-14 19:50:57 +01:00
llama_build_and_test ( test-regex-partial.cpp )
2023-12-07 22:26:54 +02:00
2025-09-27 02:03:33 +08:00
if ( NOT ${ CMAKE_SYSTEM_PROCESSOR } MATCHES "s390x" )
llama_build_and_test ( test-thread-safety.cpp ARGS -hf ggml-org/models -hff tinyllamas/stories15M-q4_0.gguf -ngl 99 -p "The meaning of life is" -n 128 -c 256 -ub 32 -np 4 -t 2 )
else ()
llama_build_and_test ( test-thread-safety.cpp ARGS -hf ggml-org/models -hff tinyllamas/stories15M-be.Q4_0.gguf -ngl 99 -p "The meaning of life is" -n 128 -c 256 -ub 32 -np 4 -t 2 )
endif ()
2025-06-16 08:11:43 -07:00
2025-04-07 13:35:19 +02:00
# this fails on windows (github hosted runner) due to curl DLL not found (exit code 0xc0000135)
if ( NOT WIN32 )
2025-04-24 16:00:10 +03:00
llama_build_and_test ( test-arg-parser.cpp )
2025-04-07 13:35:19 +02:00
endif ()
2025-11-28 07:33:23 -08:00
if ( NOT LLAMA_SANITIZE_ADDRESS AND NOT GGML_SCHED_NO_REALLOC )
2025-08-14 03:03:57 -07:00
# TODO: repair known memory leaks
llama_build_and_test ( test-opt.cpp )
endif ()
2025-04-24 16:00:10 +03:00
llama_build_and_test ( test-gguf.cpp )
llama_build_and_test ( test-backend-ops.cpp )
2024-04-29 16:58:41 +03:00
2025-04-24 16:00:10 +03:00
llama_build_and_test ( test-model-load-cancel.cpp LABEL "model" )
llama_build_and_test ( test-autorelease.cpp LABEL "model" )
2024-04-29 16:58:41 +03:00
2025-12-15 09:28:35 -08:00
# Test for state restore with fragmented KV cache
# Requires a model, uses same args pattern as test-thread-safety
if ( NOT ${ CMAKE_SYSTEM_PROCESSOR } MATCHES "s390x" )
llama_build_and_test ( test-state-restore-fragmented.cpp LABEL "model" ARGS -hf ggml-org/models -hff tinyllamas/stories15M-q4_0.gguf )
else ()
llama_build_and_test ( test-state-restore-fragmented.cpp LABEL "model" ARGS -hf ggml-org/models -hff tinyllamas/stories15M-be.Q4_0.gguf )
endif ()
2024-11-25 15:13:39 +01:00
if ( NOT GGML_BACKEND_DL )
# these tests use the backends directly and cannot be built with dynamic loading
2025-04-24 16:00:10 +03:00
llama_build_and_test ( test-barrier.cpp )
llama_build_and_test ( test-quantize-fns.cpp )
llama_build_and_test ( test-quantize-perf.cpp )
llama_build_and_test ( test-rope.cpp )
2024-11-25 15:13:39 +01:00
endif ()
2025-05-04 23:43:42 +02:00
# libmtmd
set ( LLAMA_TEST_NAME test-mtmd-c-api )
llama_build_and_test ( test-mtmd-c-api.c )
target_link_libraries ( ${ LLAMA_TEST_NAME } PRIVATE mtmd )
2024-01-26 07:18:00 -05:00
2023-08-30 02:20:26 -04:00
# dummy executable - not installed
get_filename_component ( TEST_TARGET test-c.c NAME_WE )
add_executable ( ${ TEST_TARGET } test-c.c )
target_link_libraries ( ${ TEST_TARGET } PRIVATE llama )
2025-09-24 16:17:49 +02:00
llama_build_and_test ( test-alloc.cpp )
target_include_directories ( test-alloc PRIVATE ${ PROJECT_SOURCE_DIR } /ggml/src )