2023-08-21 23:07:43 +03:00
# common
2024-06-26 18:33:02 +03:00
find_package ( Threads REQUIRED )
2023-11-02 02:50:16 -04:00
2024-11-26 14:18:08 +02:00
llama_add_compile_flags ()
2023-11-02 02:50:16 -04:00
# Build info header
#
if ( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../.git" )
set ( GIT_DIR "${CMAKE_CURRENT_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 } )
2023-11-30 17:23:08 -05:00
string ( FIND "${REAL_GIT_DIR}" "/" SLASH_POS )
if ( SLASH_POS EQUAL 0 )
set ( GIT_DIR "${REAL_GIT_DIR}" )
else ()
set ( GIT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../${REAL_GIT_DIR}" )
endif ()
2023-11-02 02:50:16 -04:00
endif ()
2024-03-05 05:26:55 +11:00
if ( EXISTS "${GIT_DIR}/index" )
set ( GIT_INDEX "${GIT_DIR}/index" )
else ()
message ( WARNING "Git index not found in git repository." )
set ( GIT_INDEX "" )
endif ()
2023-11-02 02:50:16 -04:00
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." )
set ( GIT_INDEX "" )
endif ()
# Add a custom command to rebuild build-info.cpp when .git/index changes
add_custom_command (
OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/build-info.cpp"
COMMENT "Generating build details from Git"
COMMAND ${ CMAKE_COMMAND } -DMSVC= ${ MSVC } -DCMAKE_C_COMPILER_VERSION= ${ CMAKE_C_COMPILER_VERSION }
-DCMAKE_C_COMPILER_ID= ${ CMAKE_C_COMPILER_ID } -DCMAKE_VS_PLATFORM_NAME= ${ CMAKE_VS_PLATFORM_NAME }
2025-05-01 21:48:08 +02:00
-DCMAKE_C_COMPILER= ${ CMAKE_C_COMPILER }
-DCMAKE_SYSTEM_NAME= ${ CMAKE_SYSTEM_NAME } -DCMAKE_SYSTEM_PROCESSOR= ${ CMAKE_SYSTEM_PROCESSOR }
-P "${CMAKE_CURRENT_SOURCE_DIR}/cmake/build-info-gen-cpp.cmake"
2023-11-02 02:50:16 -04:00
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/.."
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/build-info.cpp.in" ${ GIT_INDEX }
VERBATIM
)
set ( TARGET build_info )
add_library ( ${ TARGET } OBJECT build-info.cpp )
if ( BUILD_SHARED_LIBS )
set_target_properties ( ${ TARGET } PROPERTIES POSITION_INDEPENDENT_CODE ON )
endif ()
2023-08-21 23:07:43 +03:00
set ( TARGET common )
2023-11-02 02:50:16 -04:00
add_library ( ${ TARGET } STATIC
2024-09-09 23:36:09 +02:00
arg.cpp
2024-09-15 20:46:12 +03:00
arg.h
base64.hpp
2025-05-25 01:48:08 +01:00
chat-parser.cpp
chat-parser.h
2025-05-30 16:25:45 +03:00
chat.cpp
chat.h
2024-09-15 20:46:12 +03:00
common.cpp
common.h
2023-08-21 23:07:43 +03:00
console.cpp
2024-09-15 20:46:12 +03:00
console.h
2025-05-25 01:48:08 +01:00
json-partial.cpp
2025-05-30 16:25:45 +03:00
json-partial.h
json-schema-to-grammar.cpp
2025-02-01 23:55:32 -08:00
llguidance.cpp
2024-09-15 20:46:12 +03:00
log.cpp
log.h
2024-03-23 01:24:36 +01:00
ngram-cache.cpp
2024-09-15 20:46:12 +03:00
ngram-cache.h
2025-05-14 19:50:57 +01:00
regex-partial.cpp
regex-partial.h
2024-09-15 20:46:12 +03:00
sampling.cpp
sampling.h
2024-11-25 09:58:41 +02:00
speculative.cpp
speculative.h
2023-08-21 23:07:43 +03:00
)
if ( BUILD_SHARED_LIBS )
set_target_properties ( ${ TARGET } PROPERTIES POSITION_INDEPENDENT_CODE ON )
endif ()
2024-03-17 19:12:37 +01:00
set ( LLAMA_COMMON_EXTRA_LIBS build_info )
# Use curl to download model url
if ( LLAMA_CURL )
2025-04-07 13:35:19 +02:00
find_package ( CURL )
if ( NOT CURL_FOUND )
message ( FATAL_ERROR "Could NOT find CURL. Hint: to disable this feature, set -DLLAMA_CURL=OFF" )
endif ()
2024-12-13 18:34:25 +00:00
target_compile_definitions ( ${ TARGET } PUBLIC LLAMA_USE_CURL )
2024-03-17 19:12:37 +01:00
include_directories ( ${ CURL_INCLUDE_DIRS } )
find_library ( CURL_LIBRARY curl REQUIRED )
set ( LLAMA_COMMON_EXTRA_LIBS ${ LLAMA_COMMON_EXTRA_LIBS } ${ CURL_LIBRARY } )
endif ()
2025-02-01 23:55:32 -08:00
if ( LLAMA_LLGUIDANCE )
include ( ExternalProject )
set ( LLGUIDANCE_SRC ${ CMAKE_BINARY_DIR } /llguidance/source )
set ( LLGUIDANCE_PATH ${ LLGUIDANCE_SRC } /target/release )
2025-02-14 12:46:08 -08:00
# 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 ()
2025-02-01 23:55:32 -08:00
ExternalProject_Add ( llguidance_ext
GIT_REPOSITORY https://github.com/guidance-ai/llguidance
2025-05-16 14:56:28 -06:00
# v0.7.20 (+ fix to build on GCC 15):
GIT_TAG b5b8b64dba11c4e4ee6b1d1450d3a3ae279891e8
2025-02-01 23:55:32 -08:00
PREFIX ${ CMAKE_BINARY_DIR } /llguidance
SOURCE_DIR ${ LLGUIDANCE_SRC }
BUILD_IN_SOURCE TRUE
CONFIGURE_COMMAND ""
BUILD_COMMAND cargo build --release
INSTALL_COMMAND ""
2025-02-14 12:46:08 -08:00
BUILD_BYPRODUCTS ${ LLGUIDANCE_PATH } / ${ LLGUIDANCE_LIB_NAME } ${ LLGUIDANCE_PATH } /llguidance.h
2025-02-01 23:55:32 -08:00
UPDATE_COMMAND ""
)
target_compile_definitions ( ${ TARGET } PUBLIC LLAMA_USE_LLGUIDANCE )
add_library ( llguidance STATIC IMPORTED )
2025-02-14 12:46:08 -08:00
set_target_properties ( llguidance PROPERTIES IMPORTED_LOCATION ${ LLGUIDANCE_PATH } / ${ LLGUIDANCE_LIB_NAME } )
2025-02-01 23:55:32 -08:00
add_dependencies ( llguidance llguidance_ext )
target_include_directories ( ${ TARGET } PRIVATE ${ LLGUIDANCE_PATH } )
2025-02-14 12:46:08 -08:00
# Add platform libraries to the main target
set ( LLAMA_COMMON_EXTRA_LIBS ${ LLAMA_COMMON_EXTRA_LIBS } llguidance ${ LLGUIDANCE_PLATFORM_LIBS } )
2025-02-01 23:55:32 -08:00
endif ()
2025-05-30 16:25:45 +03:00
target_include_directories ( ${ TARGET } PUBLIC . ../vendor )
2024-11-29 21:54:58 +01:00
target_compile_features ( ${ TARGET } PUBLIC cxx_std_17 )
2024-06-26 18:33:02 +03:00
target_link_libraries ( ${ TARGET } PRIVATE ${ LLAMA_COMMON_EXTRA_LIBS } PUBLIC llama Threads::Threads )
2025-05-08 23:45:22 +02:00
#
# copy the license files
#
# Check if running in GitHub Actions
if ( DEFINED ENV{GITHUB_ACTIONS} AND "$ENV{GITHUB_ACTIONS}" STREQUAL "true" )
message ( STATUS "Running inside GitHub Actions - copying license files" )
# Copy all files from licenses/ to build/bin/
file ( GLOB LICENSE_FILES "${CMAKE_SOURCE_DIR}/licenses/*" )
foreach ( LICENSE_FILE ${ LICENSE_FILES } )
get_filename_component ( FILENAME ${ LICENSE_FILE } NAME )
add_custom_command (
POST_BUILD
TARGET ${ TARGET }
COMMAND ${ CMAKE_COMMAND } -E copy_if_different
"${LICENSE_FILE}"
"$<TARGET_FILE_DIR:llama>/${FILENAME}"
COMMENT "Copying ${FILENAME} to ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" )
message ( STATUS "Copying ${LICENSE_FILE} to ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${FILENAME}" )
endforeach ()
endif ()