Felipe97/llama-cpp-compiled
01.1k
1llama_add_compile_flags()2 3function(llama_build source)4 set(TEST_SOURCES ${source} ${ARGN})5 6 if (DEFINED LLAMA_TEST_NAME)7 set(TEST_TARGET ${LLAMA_TEST_NAME})8 else()9 get_filename_component(TEST_TARGET ${source} NAME_WE)10 endif()11 12 add_executable(${TEST_TARGET} ${TEST_SOURCES})13 target_link_libraries(${TEST_TARGET} PRIVATE llama llama-common) # TODO: [TAG_TESTS_LLAMA_LINK]14 if (LLAMA_TESTS_INSTALL)15 install(TARGETS ${TEST_TARGET} RUNTIME)16 endif()17endfunction()18 19function(llama_test target)20 include(CMakeParseArguments)21 set(options)22 set(oneValueArgs NAME LABEL WORKING_DIRECTORY)23 set(multiValueArgs ARGS)24 cmake_parse_arguments(LLAMA_TEST "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})25 26 if (NOT DEFINED LLAMA_TEST_LABEL)27 set(LLAMA_TEST_LABEL "main")28 endif()29 if (NOT DEFINED LLAMA_TEST_WORKING_DIRECTORY)30 set(LLAMA_TEST_WORKING_DIRECTORY .)31 endif()32 if (DEFINED LLAMA_TEST_NAME)33 set(TEST_NAME ${LLAMA_TEST_NAME})34 else()35 set(TEST_NAME ${target})36 endif()37 38 set(TEST_TARGET ${target})39 40 add_test(41 NAME ${TEST_NAME}42 WORKING_DIRECTORY ${LLAMA_TEST_WORKING_DIRECTORY}43 COMMAND $<TARGET_FILE:${TEST_TARGET}>44 ${LLAMA_TEST_ARGS})45 46 set_property(TEST ${TEST_NAME} PROPERTY LABELS ${LLAMA_TEST_LABEL})47endfunction()48 49function(llama_test_cmd target)50 include(CMakeParseArguments)51 set(options)52 set(oneValueArgs NAME LABEL WORKING_DIRECTORY)53 set(multiValueArgs ARGS)54 cmake_parse_arguments(LLAMA_TEST "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})55 56 if (NOT DEFINED LLAMA_TEST_LABEL)57 set(LLAMA_TEST_LABEL "main")58 endif()59 if (NOT DEFINED LLAMA_TEST_WORKING_DIRECTORY)60 set(LLAMA_TEST_WORKING_DIRECTORY .)61 endif()62 if (DEFINED LLAMA_TEST_NAME)63 set(TEST_NAME ${LLAMA_TEST_NAME})64 else()65 set(TEST_NAME ${target})66 endif()67 68 add_test(69 NAME ${TEST_NAME}70 WORKING_DIRECTORY ${LLAMA_TEST_WORKING_DIRECTORY}71 COMMAND ${target}72 ${LLAMA_TEST_ARGS})73 74 set_property(TEST ${TEST_NAME} PROPERTY LABELS ${LLAMA_TEST_LABEL})75endfunction()76 77# Builds and runs a test source file.78# Optional args:79# - NAME: name of the executable & test target (defaults to the source file name without extension)80# - LABEL: label for the test (defaults to main)81# - ARGS: arguments to pass to the test executable82# - WORKING_DIRECTORY83function(llama_build_and_test source)84 include(CMakeParseArguments)85 set(options)86 set(oneValueArgs NAME LABEL WORKING_DIRECTORY)87 set(multiValueArgs ARGS)88 cmake_parse_arguments(LLAMA_TEST "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})89 90 set(TEST_SOURCES ${source} ${LLAMA_TEST_UNPARSED_ARGUMENTS})91 92 if (NOT DEFINED LLAMA_TEST_LABEL)93 set(LLAMA_TEST_LABEL "main")94 endif()95 if (NOT DEFINED LLAMA_TEST_WORKING_DIRECTORY)96 set(LLAMA_TEST_WORKING_DIRECTORY .)97 endif()98 if (DEFINED LLAMA_TEST_NAME)99 set(TEST_TARGET ${LLAMA_TEST_NAME})100 else()101 get_filename_component(TEST_TARGET ${source} NAME_WE)102 endif()103 104 add_executable(${TEST_TARGET} ${TEST_SOURCES})105 if (LLAMA_TESTS_INSTALL)106 install(TARGETS ${TEST_TARGET} RUNTIME)107 endif()108 target_link_libraries(${TEST_TARGET} PRIVATE llama-common)109 110 add_test(111 NAME ${TEST_TARGET}112 WORKING_DIRECTORY ${LLAMA_TEST_WORKING_DIRECTORY}113 COMMAND $<TARGET_FILE:${TEST_TARGET}>114 ${LLAMA_TEST_ARGS})115 116 set_property(TEST ${TEST_TARGET} PROPERTY LABELS ${LLAMA_TEST_LABEL})117endfunction()118 119# build test-tokenizer-0 target once and add many tests120llama_build(test-tokenizer-0.cpp)121 122llama_test(test-tokenizer-0 NAME test-tokenizer-0-bert-bge ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-bert-bge.gguf)123llama_test(test-tokenizer-0 NAME test-tokenizer-0-command-r ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-command-r.gguf)124llama_test(test-tokenizer-0 NAME test-tokenizer-0-deepseek-coder ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-deepseek-coder.gguf)125llama_test(test-tokenizer-0 NAME test-tokenizer-0-deepseek-llm ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-deepseek-llm.gguf)126llama_test(test-tokenizer-0 NAME test-tokenizer-0-falcon ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-falcon.gguf)127llama_test(test-tokenizer-0 NAME test-tokenizer-0-gemma-4 ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-gemma-4.gguf)128llama_test(test-tokenizer-0 NAME test-tokenizer-0-gpt-2 ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-gpt-2.gguf)129llama_test(test-tokenizer-0 NAME test-tokenizer-0-llama-bpe ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-llama-bpe.gguf)130llama_test(test-tokenizer-0 NAME test-tokenizer-0-llama-spm ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-llama-spm.gguf)131llama_test(test-tokenizer-0 NAME test-tokenizer-0-mpt ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-mpt.gguf)132llama_test(test-tokenizer-0 NAME test-tokenizer-0-phi-3 ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-phi-3.gguf)133llama_test(test-tokenizer-0 NAME test-tokenizer-0-qwen2 ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-qwen2.gguf)134llama_test(test-tokenizer-0 NAME test-tokenizer-0-qwen35 ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-qwen35.gguf)135llama_test(test-tokenizer-0 NAME test-tokenizer-0-refact ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-refact.gguf)136llama_test(test-tokenizer-0 NAME test-tokenizer-0-starcoder ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-starcoder.gguf)137 138if (NOT WIN32)139 llama_test_cmd(140 ${CMAKE_CURRENT_SOURCE_DIR}/test-tokenizers-repo.sh141 NAME test-tokenizers-ggml-vocabs142 WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}143 ARGS https://huggingface.co/ggml-org/vocabs ${PROJECT_SOURCE_DIR}/models/ggml-vocabs144 )145endif()146 147if (LLAMA_LLGUIDANCE)148 llama_build_and_test(test-grammar-llguidance.cpp ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-llama-bpe.gguf)149endif ()150 151llama_build(test-recurrent-state-rollback.cpp)152llama_build(test-save-load-state.cpp)153 154if (NOT WIN32 OR NOT BUILD_SHARED_LIBS)155 # these tests are disabled on Windows because they use internal functions not exported with LLAMA_API (when building with shared libraries)156 llama_build_and_test(test-unicode.cpp)157 llama_build_and_test(test-sampling.cpp)158 llama_build_and_test(test-reasoning-budget.cpp)159 llama_build_and_test(test-grammar-parser.cpp)160 llama_build_and_test(test-grammar-integration.cpp)161 llama_build_and_test(test-llama-grammar.cpp)162 llama_build_and_test(test-batch-alloc.cpp)163 llama_build_and_test(test-chat.cpp WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})164 target_include_directories(test-chat PRIVATE ${PROJECT_SOURCE_DIR}/tools/server)165 target_link_libraries(test-chat PRIVATE server-context)166 llama_build_and_test(test-json-schema-to-grammar.cpp)167 168 if (NOT GGML_BACKEND_DL)169 llama_build(test-quantize-stats.cpp)170 endif()171 172 llama_build(test-gbnf-validator.cpp)173 174 # build test-tokenizer-1-bpe target once and add many tests175 llama_build(test-tokenizer-1-bpe.cpp)176 177 # TODO: disabled due to slowness178 #llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-aquila ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-aquila.gguf)179 #llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-falcon ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-falcon.gguf)180 #llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-gpt-2 ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-gpt-2.gguf)181 #llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-gpt-neox ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-gpt-neox.gguf)182 #llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-llama-bpe ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-llama-bpe.gguf --ignore-merges)183 #llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-mpt ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-mpt.gguf)184 #llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-refact ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-refact.gguf)185 #llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-starcoder ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-starcoder.gguf)186 187 # build test-tokenizer-1-spm target once and add many tests188 llama_build(test-tokenizer-1-spm.cpp)189 190 llama_test(test-tokenizer-1-spm NAME test-tokenizer-1-llama-spm ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-llama-spm.gguf)191 #llama_test(test-tokenizer-1-spm NAME test-tokenizer-1-baichuan ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-baichuan.gguf)192 193 # llama_build_and_test(test-double-float.cpp) # SLOW194 195 llama_build(test-llama-archs.cpp)196 197 set(MODEL_DIR "${CMAKE_CURRENT_BINARY_DIR}/test-models/")198 file(MAKE_DIRECTORY "${MODEL_DIR}")199 200 llama_test(201 test-llama-archs202 NAME test-generate-models203 LABEL main204 ARGS -o "${MODEL_DIR}"205 )206 set_tests_properties(test-generate-models PROPERTIES207 FIXTURES_SETUP generate-models208 )209 210 llama_test(211 test-recurrent-state-rollback212 LABEL main213 ARGS -m "${MODEL_DIR}/qwen35-dense.gguf"214 )215 set_tests_properties(test-recurrent-state-rollback PROPERTIES216 FIXTURES_REQUIRED generate-models217 )218 219 llama_test(220 test-recurrent-state-rollback221 NAME test-recurrent-state-rollback-nemotron-h222 LABEL main223 ARGS -m "${MODEL_DIR}/nemotron_h-dense.gguf"224 )225 set_tests_properties(test-recurrent-state-rollback-nemotron-h PROPERTIES226 FIXTURES_REQUIRED generate-models227 )228 llama_test(229 test-recurrent-state-rollback230 NAME test-recurrent-state-rollback-dsv4231 LABEL main232 ARGS -m "${MODEL_DIR}/deepseek4-moe.gguf"233 )234 set_tests_properties(test-recurrent-state-rollback-dsv4 PROPERTIES235 FIXTURES_REQUIRED generate-models236 )237 llama_test(238 test-recurrent-state-rollback239 NAME test-recurrent-state-rollback-kimi-k3240 LABEL main241 ARGS -m "${MODEL_DIR}/kimi-k3-moe.gguf"242 )243 set_tests_properties(test-recurrent-state-rollback-kimi-k3 PROPERTIES244 FIXTURES_REQUIRED generate-models245 )246 247 # Test state save/load functionality across all architectures, using the generated dummy models248 llama_test(249 test-save-load-state250 LABEL main251 ARGS --models "${MODEL_DIR}"252 )253 set_tests_properties(test-save-load-state PROPERTIES FIXTURES_REQUIRED generate-models)254 255 llama_build(test-fusion.cpp)256endif()257 258llama_build_and_test(test-chat-peg-parser.cpp peg-parser/simple-tokenize.cpp)259llama_build_and_test(test-jinja.cpp)260llama_test(test-jinja NAME test-jinja-py ARGS -py LABEL python)261llama_build_and_test(test-json-schema.cpp)262llama_build_and_test(test-chat-auto-parser.cpp WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})263llama_build_and_test(test-chat-template.cpp)264# debug tool for chat template differential analysis (not registered as a test, run it manually)265llama_build(test-chat-analysis.cpp)266llama_build_and_test(test-log.cpp)267llama_build_and_test(268 test-peg-parser.cpp269 peg-parser/simple-tokenize.cpp270 peg-parser/test-basic.cpp271 peg-parser/test-gbnf-generation.cpp272 peg-parser/test-json-parser.cpp273 peg-parser/test-json-serialization.cpp274 peg-parser/test-python-dict-parser.cpp275 peg-parser/test-unicode.cpp276 peg-parser/tests.h277)278 279if (NOT ${CMAKE_SYSTEM_PROCESSOR} MATCHES "s390x")280 set(MODEL_NAME "tinyllamas/stories15M-q4_0.gguf")281 set(MODEL_HASH "SHA256=66967fbece6dbe97886593fdbb73589584927e29119ec31f08090732d1861739")282else()283 set(MODEL_NAME "tinyllamas/stories15M-be.Q4_0.gguf")284 set(MODEL_HASH "SHA256=9aec857937849d976f30397e97eb1cabb53eb9dcb1ce4611ba8247fb5f44c65d")285endif()286set(MODEL_DEST "${CMAKE_BINARY_DIR}/${MODEL_NAME}")287 288add_test(NAME test-download-model COMMAND ${CMAKE_COMMAND}289 -DDEST=${MODEL_DEST}290 -DNAME=${MODEL_NAME}291 -DHASH=${MODEL_HASH}292 -P ${PROJECT_SOURCE_DIR}/cmake/download-models.cmake293)294set_tests_properties(test-download-model PROPERTIES FIXTURES_SETUP test-download-model)295 296llama_build_and_test(test-thread-safety.cpp ARGS -m "${MODEL_DEST}" -ngl 99 -p "The meaning of life is" -n 128 -c 256 -ub 32 -np 4 -t 2)297set_tests_properties(test-thread-safety PROPERTIES FIXTURES_REQUIRED test-download-model)298 299llama_build_and_test(test-arg-parser.cpp)300llama_build_and_test(test-model-resolution.cpp)301# the test serves its repos from an httplib server, and the library links it privately302target_link_libraries(test-model-resolution PRIVATE cpp-httplib)303 304if (NOT LLAMA_SANITIZE_ADDRESS AND NOT GGML_SCHED_NO_REALLOC)305 # TODO: repair known memory leaks306 llama_build_and_test(test-opt.cpp)307endif()308 309# TODO: make this test (and others) not link `libllama` as it is not needed [TAG_TESTS_LLAMA_LINK]310llama_build(test-backend-ops.cpp)311 312llama_build_and_test(test-model-load-cancel.cpp LABEL "model")313llama_build_and_test(test-autorelease.cpp LABEL "model")314llama_build_and_test(test-backend-sampler.cpp LABEL "model")315 316# Test for state restore with fragmented KV cache317# Requires a model, uses same args pattern as test-thread-safety318llama_build_and_test(test-state-restore-fragmented.cpp LABEL "model" ARGS -m "${MODEL_DEST}")319set_tests_properties(test-state-restore-fragmented PROPERTIES FIXTURES_REQUIRED test-download-model)320 321if (APPLE)322 llama_build(test-rset-release.cpp)323endif()324 325if (NOT GGML_BACKEND_DL AND GGML_CPU)326 # these tests use the backends directly and cannot be built with dynamic loading327 llama_build_and_test(test-barrier.cpp)328 llama_build_and_test(test-quantize-fns.cpp)329 llama_build_and_test(test-quantize-perf.cpp)330 llama_build_and_test(test-rope.cpp)331 llama_build_and_test(test-col2im-1d.cpp)332endif()333 334# libmtmd335set(LLAMA_TEST_NAME test-mtmd-c-api)336llama_build_and_test(test-mtmd-c-api.c)337target_link_libraries(${LLAMA_TEST_NAME} PRIVATE mtmd)338unset(LLAMA_TEST_NAME)339 340llama_build_and_test(test-mtmd-impl.cpp)341target_link_libraries(test-mtmd-impl PRIVATE mtmd)342 343# GGUF model data fetcher library for tests that need real model metadata344# Only compile when cpp-httplib has SSL support (CPPHTTPLIB_OPENSSL_SUPPORT)345if (TARGET cpp-httplib)346 get_target_property(_cpp_httplib_defs cpp-httplib INTERFACE_COMPILE_DEFINITIONS)347 if (_cpp_httplib_defs MATCHES "CPPHTTPLIB_OPENSSL_SUPPORT")348 add_library(gguf-model-data STATIC gguf-model-data.cpp)349 target_link_libraries(gguf-model-data PRIVATE llama-common cpp-httplib)350 target_include_directories(gguf-model-data PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})351 352 add_executable(test-gguf-model-data test-gguf-model-data.cpp)353 target_link_libraries(test-gguf-model-data PRIVATE gguf-model-data llama-common)354 llama_test(test-gguf-model-data LABEL "model")355 356 # test-quant-type-selection requires gguf-model-data for remote model metadata357 llama_build_and_test(test-quant-type-selection.cpp LABEL "model")358 target_link_libraries(test-quant-type-selection PRIVATE gguf-model-data)359 target_compile_definitions(test-quant-type-selection PRIVATE360 SNAPSHOT_DIR="${CMAKE_CURRENT_SOURCE_DIR}/snapshots")361 endif()362endif()363 364# dummy executable - not installed365get_filename_component(TEST_TARGET test-c.c NAME_WE)366add_executable(${TEST_TARGET} test-c.c)367target_link_libraries(${TEST_TARGET} PRIVATE llama)368 369if (NOT LLAMA_USE_SYSTEM_GGML)370 # Needs non-public ggml-impl.h371 llama_build_and_test(test-gguf.cpp)372 373 # Needs non-public ggml{,-backend}-impl.h374 llama_build_and_test(test-alloc.cpp)375endif()376 377llama_build(test-export-graph-ops.cpp)378if (TARGET gguf-model-data)379 target_link_libraries(test-export-graph-ops PRIVATE gguf-model-data)380 target_compile_definitions(test-export-graph-ops PRIVATE LLAMA_HF_FETCH)381endif()382 