* jinja vm * lexer * add vm types * demo * clean up * parser ok * binary_expression::execute * shadow naming * bin ops works! * fix map object * add string builtins * add more builtins * wip * use mk_val * eval with is_user_input * render gemma tmpl ok * track input string even after transformations * support binded functions * keyword arguments and slicing array * use shared_ptr for values * add mk_stmt * allow print source on exception * fix negate test * testing more templates * mostly works * add filter_statement * allow func to access ctx * add jinja-value.cpp * impl global_from_json * a lot of fixes * more tests * more fix, more tests * more fixes * rm workarounds * demo: type inferrence * add placeholder for tojson * improve function args handling * rm type inference * no more std::regex * trailing spaces * make testing more flexible * make output a bit cleaner * (wip) redirect minja calls * test: add --output * fix crash on macro kwargs * add minimal caps system * add some workarounds * rm caps_apply_workarounds * get rid of preprocessing * more fixes * fix test-chat-template * move test-chat-jinja into test-chat-template * rm test-chat-jinja from cmake * test-chat-template: use common * fix build * fix build (2) * rename vm --> interpreter * improve error reporting * correct lstrip behavior * add tojson * more fixes * disable tests for COMMON_CHAT_FORMAT_GENERIC * make sure tojson output correct order * add object.length * fully functional selectattr / rejectattr * improve error reporting * more builtins added, more fixes * create jinja rendering tests * fix testing.h path * adjust whitespace rules * more fixes * temporary disable test for ibm-granite * r/lstrip behavior matched with hf.js * minimax, glm4.5 ok * add append and pop * kimi-k2 ok * test-chat passed * fix lstrip_block * add more jinja tests * cast to unsigned char * allow dict key to be numeric * nemotron: rm windows newline * tests ok * fix test * rename interpreter --> runtime * fix build * add more checks * bring back generic format support * fix Apertus * [json.exception.out_of_range.403] key 'content' not found * rm generic test * refactor input marking * add docs * fix windows build * clarify error message * improved tests * split/rsplit with maxsplit * non-inverse maxsplit forgot to change after simplifying * implement separators for tojson and fix indent * i like to move it move it * rename null -- > none * token::eof * some nits + comments * add exception classes for lexer and parser * null -> none * rename global -> env * rm minja * update docs * docs: add input marking caveats * imlement missing jinja-tests functions * oops * support trim filter with args, remove bogus to_json reference * numerous argument fixes * updated tests * implement optional strip chars parameter * use new chars parameter * float filter also has default * always leave at least one decimal in float string * jinja : static analysis + header cleanup + minor fixes * add fuzz test * add string.cpp * fix chat_template_kwargs * nits * fix build * revert * unrevert sorry :) * add fuzz func_args, refactor to be safer * fix array.map() * loosen ensure_vals max count condition, add not impl for map(int) * hopefully fix windows * check if empty first * normalize newlines --------- Co-authored-by: Alde Rojas <hello@alde.dev> Co-authored-by: Sigbjørn Skjæret <sigbjorn.skjaeret@scala.com> Co-authored-by: Georgi Gerganov <ggerganov@gmail.com>
161 lines
4.6 KiB
CMake
161 lines
4.6 KiB
CMake
# common
|
|
|
|
find_package(Threads REQUIRED)
|
|
|
|
llama_add_compile_flags()
|
|
|
|
# Build info header
|
|
#
|
|
|
|
if(EXISTS "${PROJECT_SOURCE_DIR}/.git")
|
|
set(GIT_DIR "${PROJECT_SOURCE_DIR}/.git")
|
|
|
|
# Is git submodule
|
|
if(NOT IS_DIRECTORY "${GIT_DIR}")
|
|
file(READ ${GIT_DIR} REAL_GIT_DIR_LINK)
|
|
string(REGEX REPLACE "gitdir: (.*)\n$" "\\1" REAL_GIT_DIR ${REAL_GIT_DIR_LINK})
|
|
string(FIND "${REAL_GIT_DIR}" "/" SLASH_POS)
|
|
if (SLASH_POS EQUAL 0)
|
|
set(GIT_DIR "${REAL_GIT_DIR}")
|
|
else()
|
|
set(GIT_DIR "${PROJECT_SOURCE_DIR}/${REAL_GIT_DIR}")
|
|
endif()
|
|
endif()
|
|
|
|
if(EXISTS "${GIT_DIR}/index")
|
|
# For build-info.cpp below
|
|
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${GIT_DIR}/index")
|
|
else()
|
|
message(WARNING "Git index not found in git repository.")
|
|
endif()
|
|
else()
|
|
message(WARNING "Git repository not found; to enable automatic generation of build info, make sure Git is installed and the project is a Git repository.")
|
|
endif()
|
|
|
|
set(TEMPLATE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/build-info.cpp.in")
|
|
set(OUTPUT_FILE "${CMAKE_CURRENT_BINARY_DIR}/build-info.cpp")
|
|
configure_file(${TEMPLATE_FILE} ${OUTPUT_FILE})
|
|
|
|
set(TARGET build_info)
|
|
add_library(${TARGET} OBJECT ${OUTPUT_FILE})
|
|
if (BUILD_SHARED_LIBS)
|
|
set_target_properties(${TARGET} PROPERTIES POSITION_INDEPENDENT_CODE ON)
|
|
endif()
|
|
|
|
set(TARGET common)
|
|
|
|
add_library(${TARGET} STATIC
|
|
arg.cpp
|
|
arg.h
|
|
base64.hpp
|
|
chat-parser.cpp
|
|
chat-parser.h
|
|
chat-parser-xml-toolcall.h
|
|
chat-parser-xml-toolcall.cpp
|
|
chat-peg-parser.cpp
|
|
chat-peg-parser.h
|
|
chat.cpp
|
|
chat.h
|
|
common.cpp
|
|
common.h
|
|
console.cpp
|
|
console.h
|
|
debug.cpp
|
|
debug.h
|
|
download.cpp
|
|
download.h
|
|
http.h
|
|
json-partial.cpp
|
|
json-partial.h
|
|
json-schema-to-grammar.cpp
|
|
llguidance.cpp
|
|
log.cpp
|
|
log.h
|
|
ngram-cache.cpp
|
|
ngram-cache.h
|
|
peg-parser.cpp
|
|
peg-parser.h
|
|
preset.cpp
|
|
preset.h
|
|
regex-partial.cpp
|
|
regex-partial.h
|
|
sampling.cpp
|
|
sampling.h
|
|
speculative.cpp
|
|
speculative.h
|
|
unicode.cpp
|
|
unicode.h
|
|
jinja/lexer.cpp
|
|
jinja/lexer.h
|
|
jinja/parser.cpp
|
|
jinja/parser.h
|
|
jinja/runtime.cpp
|
|
jinja/runtime.h
|
|
jinja/value.cpp
|
|
jinja/value.h
|
|
jinja/string.cpp
|
|
jinja/string.h
|
|
jinja/caps.cpp
|
|
jinja/caps.h
|
|
)
|
|
|
|
target_include_directories(${TARGET} PUBLIC . ../vendor)
|
|
target_compile_features (${TARGET} PUBLIC cxx_std_17)
|
|
|
|
if (BUILD_SHARED_LIBS)
|
|
set_target_properties(${TARGET} PROPERTIES POSITION_INDEPENDENT_CODE ON)
|
|
endif()
|
|
|
|
# TODO: use list(APPEND LLAMA_COMMON_EXTRA_LIBS ...)
|
|
set(LLAMA_COMMON_EXTRA_LIBS build_info)
|
|
|
|
if (LLAMA_HTTPLIB)
|
|
target_compile_definitions(${TARGET} PUBLIC LLAMA_USE_HTTPLIB)
|
|
set(LLAMA_COMMON_EXTRA_LIBS ${LLAMA_COMMON_EXTRA_LIBS} cpp-httplib)
|
|
endif()
|
|
|
|
if (LLAMA_LLGUIDANCE)
|
|
include(ExternalProject)
|
|
set(LLGUIDANCE_SRC ${CMAKE_BINARY_DIR}/llguidance/source)
|
|
set(LLGUIDANCE_PATH ${LLGUIDANCE_SRC}/target/release)
|
|
|
|
# Set the correct library file extension based on platform
|
|
if (WIN32)
|
|
set(LLGUIDANCE_LIB_NAME "llguidance.lib")
|
|
# Add Windows-specific libraries
|
|
set(LLGUIDANCE_PLATFORM_LIBS
|
|
ws2_32 # Windows Sockets API
|
|
userenv # For GetUserProfileDirectoryW
|
|
ntdll # For NT functions
|
|
bcrypt # For BCryptGenRandom
|
|
)
|
|
else()
|
|
set(LLGUIDANCE_LIB_NAME "libllguidance.a")
|
|
set(LLGUIDANCE_PLATFORM_LIBS "")
|
|
endif()
|
|
|
|
ExternalProject_Add(llguidance_ext
|
|
GIT_REPOSITORY https://github.com/guidance-ai/llguidance
|
|
# v1.0.1:
|
|
GIT_TAG d795912fedc7d393de740177ea9ea761e7905774
|
|
PREFIX ${CMAKE_BINARY_DIR}/llguidance
|
|
SOURCE_DIR ${LLGUIDANCE_SRC}
|
|
BUILD_IN_SOURCE TRUE
|
|
CONFIGURE_COMMAND ""
|
|
BUILD_COMMAND cargo build --release --package llguidance
|
|
INSTALL_COMMAND ""
|
|
BUILD_BYPRODUCTS ${LLGUIDANCE_PATH}/${LLGUIDANCE_LIB_NAME} ${LLGUIDANCE_PATH}/llguidance.h
|
|
UPDATE_COMMAND ""
|
|
)
|
|
target_compile_definitions(${TARGET} PUBLIC LLAMA_USE_LLGUIDANCE)
|
|
|
|
add_library(llguidance STATIC IMPORTED)
|
|
set_target_properties(llguidance PROPERTIES IMPORTED_LOCATION ${LLGUIDANCE_PATH}/${LLGUIDANCE_LIB_NAME})
|
|
add_dependencies(llguidance llguidance_ext)
|
|
|
|
target_include_directories(${TARGET} PRIVATE ${LLGUIDANCE_PATH})
|
|
# Add platform libraries to the main target
|
|
set(LLAMA_COMMON_EXTRA_LIBS ${LLAMA_COMMON_EXTRA_LIBS} llguidance ${LLGUIDANCE_PLATFORM_LIBS})
|
|
endif ()
|
|
|
|
target_link_libraries(${TARGET} PRIVATE ${LLAMA_COMMON_EXTRA_LIBS} PUBLIC llama Threads::Threads)
|