KBaba7/llama.cpp
0
1include(CheckCXXCompilerFlag)2 3add_compile_definitions(GGML_SCHED_MAX_COPIES=${GGML_SCHED_MAX_COPIES})4 5# enable libstdc++ assertions for debug builds6if (CMAKE_SYSTEM_NAME MATCHES "Linux")7 add_compile_definitions($<$<CONFIG:Debug>:_GLIBCXX_ASSERTIONS>)8endif()9 10if (NOT MSVC)11 if (GGML_SANITIZE_THREAD)12 add_compile_options(-fsanitize=thread)13 link_libraries (-fsanitize=thread)14 endif()15 16 if (GGML_SANITIZE_ADDRESS)17 add_compile_options(-fsanitize=address -fno-omit-frame-pointer)18 link_libraries (-fsanitize=address)19 endif()20 21 if (GGML_SANITIZE_UNDEFINED)22 add_compile_options(-fsanitize=undefined)23 link_libraries (-fsanitize=undefined)24 endif()25endif()26 27function(ggml_get_flags CCID CCVER)28 set(C_FLAGS "")29 set(CXX_FLAGS "")30 31 if (CCID MATCHES "Clang")32 set(C_FLAGS -Wunreachable-code-break -Wunreachable-code-return)33 set(CXX_FLAGS -Wunreachable-code-break -Wunreachable-code-return -Wmissing-prototypes -Wextra-semi)34 35 if (36 (CCID STREQUAL "Clang" AND CCVER VERSION_GREATER_EQUAL 3.8.0) OR37 (CCID STREQUAL "AppleClang" AND CCVER VERSION_GREATER_EQUAL 7.3.0)38 )39 list(APPEND C_FLAGS -Wdouble-promotion)40 endif()41 elseif (CCID STREQUAL "GNU")42 set(C_FLAGS -Wdouble-promotion)43 set(CXX_FLAGS -Wno-array-bounds)44 45 if (CCVER VERSION_GREATER_EQUAL 8.1.0)46 list(APPEND CXX_FLAGS -Wextra-semi)47 endif()48 endif()49 50 set(GF_C_FLAGS ${C_FLAGS} PARENT_SCOPE)51 set(GF_CXX_FLAGS ${CXX_FLAGS} PARENT_SCOPE)52endfunction()53 54if (GGML_FATAL_WARNINGS)55 if (CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")56 list(APPEND C_FLAGS -Werror)57 list(APPEND CXX_FLAGS -Werror)58 elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")59 add_compile_options(/WX)60 endif()61endif()62 63if (GGML_ALL_WARNINGS)64 if (NOT MSVC)65 list(APPEND WARNING_FLAGS -Wall -Wextra -Wpedantic -Wcast-qual -Wno-unused-function)66 list(APPEND C_FLAGS -Wshadow -Wstrict-prototypes -Wpointer-arith -Wmissing-prototypes67 -Werror=implicit-int -Werror=implicit-function-declaration)68 list(APPEND CXX_FLAGS -Wmissing-declarations -Wmissing-noreturn)69 70 list(APPEND C_FLAGS ${WARNING_FLAGS})71 list(APPEND CXX_FLAGS ${WARNING_FLAGS})72 73 ggml_get_flags(${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION})74 75 add_compile_options("$<$<COMPILE_LANGUAGE:C>:${C_FLAGS};${GF_C_FLAGS}>"76 "$<$<COMPILE_LANGUAGE:CXX>:${CXX_FLAGS};${GF_CXX_FLAGS}>")77 else()78 # todo : msvc79 set(C_FLAGS "")80 set(CXX_FLAGS "")81 endif()82endif()83 84if (GGML_LTO)85 include(CheckIPOSupported)86 check_ipo_supported(RESULT result OUTPUT output)87 if (result)88 set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)89 else()90 message(WARNING "IPO is not supported: ${output}")91 endif()92endif()93 94if (GGML_CCACHE)95 find_program(GGML_CCACHE_FOUND ccache)96 find_program(GGML_SCCACHE_FOUND sccache)97 98 if (GGML_CCACHE_FOUND OR GGML_SCCACHE_FOUND)99 if(GGML_CCACHE_FOUND)100 set(GGML_CCACHE_VARIANT ccache)101 else()102 set(GGML_CCACHE_VARIANT sccache)103 endif()104 # TODO: should not be set globally105 set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${GGML_CCACHE_VARIANT}")106 set(ENV{CCACHE_SLOPPINESS} time_macros)107 message(STATUS "${GGML_CCACHE_VARIANT} found, compilation results will be cached. Disable with GGML_CCACHE=OFF.")108 else()109 message(STATUS "Warning: ccache not found - consider installing it for faster compilation or disable this warning with GGML_CCACHE=OFF")110 endif ()111endif()112 113# this version of Apple ld64 is buggy114execute_process(115 COMMAND ${CMAKE_C_COMPILER} ${CMAKE_EXE_LINKER_FLAGS} -Wl,-v116 ERROR_VARIABLE output117 OUTPUT_QUIET118)119 120if (output MATCHES "dyld-1015\.7")121 add_compile_definitions(HAVE_BUGGY_APPLE_LINKER)122endif()123 124# architecture specific125# TODO: probably these flags need to be tweaked on some architectures126# feel free to update the Makefile for your architecture and send a pull request or issue127message(STATUS "CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}")128if (MSVC)129 string(TOLOWER "${CMAKE_GENERATOR_PLATFORM}" CMAKE_GENERATOR_PLATFORM_LWR)130 message(STATUS "CMAKE_GENERATOR_PLATFORM: ${CMAKE_GENERATOR_PLATFORM}")131else ()132 set(CMAKE_GENERATOR_PLATFORM_LWR "")133endif ()134 135if (NOT MSVC)136 if (GGML_STATIC)137 add_link_options(-static)138 if (MINGW)139 add_link_options(-static-libgcc -static-libstdc++)140 endif()141 endif()142 if (GGML_GPROF)143 add_compile_options(-pg)144 endif()145endif()146 147if (MINGW)148 # Target Windows 8 for PrefetchVirtualMemory149 add_compile_definitions(_WIN32_WINNT=${GGML_WIN_VER})150endif()151 152#153# POSIX conformance154#155 156# clock_gettime came in POSIX.1b (1993)157# CLOCK_MONOTONIC came in POSIX.1-2001 / SUSv3 as optional158# posix_memalign came in POSIX.1-2001 / SUSv3159# M_PI is an XSI extension since POSIX.1-2001 / SUSv3, came in XPG1 (1985)160 161# Somehow in OpenBSD whenever POSIX conformance is specified162# some string functions rely on locale_t availability,163# which was introduced in POSIX.1-2008, forcing us to go higher164if (CMAKE_SYSTEM_NAME MATCHES "OpenBSD")165 add_compile_definitions(_XOPEN_SOURCE=700)166else()167 add_compile_definitions(_XOPEN_SOURCE=600)168endif()169 170# Data types, macros and functions related to controlling CPU affinity and171# some memory allocation are available on Linux through GNU extensions in libc172if (CMAKE_SYSTEM_NAME MATCHES "Linux" OR CMAKE_SYSTEM_NAME MATCHES "Android")173 add_compile_definitions(_GNU_SOURCE)174endif()175 176# RLIMIT_MEMLOCK came in BSD, is not specified in POSIX.1,177# and on macOS its availability depends on enabling Darwin extensions178# similarly on DragonFly, enabling BSD extensions is necessary179if (180 CMAKE_SYSTEM_NAME MATCHES "Darwin" OR181 CMAKE_SYSTEM_NAME MATCHES "iOS" OR182 CMAKE_SYSTEM_NAME MATCHES "tvOS" OR183 CMAKE_SYSTEM_NAME MATCHES "DragonFly"184)185 add_compile_definitions(_DARWIN_C_SOURCE)186endif()187 188# alloca is a non-standard interface that is not visible on BSDs when189# POSIX conformance is specified, but not all of them provide a clean way190# to enable it in such cases191if (CMAKE_SYSTEM_NAME MATCHES "FreeBSD")192 add_compile_definitions(__BSD_VISIBLE)193endif()194if (CMAKE_SYSTEM_NAME MATCHES "NetBSD")195 add_compile_definitions(_NETBSD_SOURCE)196endif()197if (CMAKE_SYSTEM_NAME MATCHES "OpenBSD")198 add_compile_definitions(_BSD_SOURCE)199endif()200 201if (WIN32)202 add_compile_definitions(_CRT_SECURE_NO_WARNINGS)203endif()204 205# ggml206 207if (GGML_BACKEND_DL AND NOT BUILD_SHARED_LIBS)208 message(FATAL_ERROR "GGML_BACKEND_DL requires BUILD_SHARED_LIBS")209endif()210 211add_library(ggml-base212 ../include/ggml.h213 ../include/ggml-alloc.h214 ../include/ggml-backend.h215 ../include/ggml-cpp.h216 ../include/ggml-opt.h217 ../include/gguf.h218 ggml.c219 ggml-alloc.c220 ggml-backend.cpp221 ggml-opt.cpp222 ggml-threading.cpp223 ggml-threading.h224 ggml-quants.c225 ggml-quants.h226 gguf.cpp)227 228target_include_directories(ggml-base PRIVATE .)229 230add_library(ggml231 ggml-backend-reg.cpp)232 233target_link_libraries(ggml PUBLIC ggml-base)234 235if (CMAKE_SYSTEM_NAME MATCHES "Linux")236 target_link_libraries(ggml PRIVATE dl)237endif()238 239function(ggml_add_backend_library backend)240 if (GGML_BACKEND_DL)241 add_library(${backend} MODULE ${ARGN})242 # write the shared library to the output directory243 set_target_properties(${backend} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})244 target_compile_definitions(${backend} PRIVATE GGML_BACKEND_DL)245 add_dependencies(ggml ${backend})246 else()247 add_library(${backend} ${ARGN})248 target_link_libraries(ggml PUBLIC ${backend})249 install(TARGETS ${backend} LIBRARY)250 endif()251 252 target_link_libraries(${backend} PRIVATE ggml-base)253 target_include_directories(${backend} PRIVATE ..)254 255 if (${BUILD_SHARED_LIBS})256 target_compile_definitions(${backend} PRIVATE GGML_BACKEND_BUILD)257 target_compile_definitions(${backend} PUBLIC GGML_BACKEND_SHARED)258 endif()259 260 if(NOT GGML_AVAILABLE_BACKENDS)261 set(GGML_AVAILABLE_BACKENDS "${backend}"262 CACHE INTERNAL "List of backends for cmake package")263 else()264 list(FIND GGML_AVAILABLE_BACKENDS "${backend}" has_backend)265 if(has_backend EQUAL -1)266 set(GGML_AVAILABLE_BACKENDS "${GGML_AVAILABLE_BACKENDS};${backend}"267 CACHE INTERNAL "List of backends for cmake package")268 endif()269 endif()270endfunction()271 272function(ggml_add_backend backend)273 string(TOUPPER "GGML_${backend}" backend_id)274 if (${backend_id})275 string(TOLOWER "ggml-${backend}" backend_target)276 add_subdirectory(${backend_target})277 message(STATUS "Including ${backend} backend")278 if (NOT GGML_BACKEND_DL)279 string(TOUPPER "GGML_USE_${backend}" backend_use)280 target_compile_definitions(ggml PUBLIC ${backend_use})281 endif()282 endif()283endfunction()284 285function(ggml_add_cpu_backend_variant tag_name)286 set(GGML_CPU_TAG_NAME ${tag_name})287 # other: OPENMP LLAMAFILE CPU_HBM288 foreach (feat NATIVE289 AVX AVX2 AVX_VNNI FMA F16C290 AVX512 AVX512_VBMI AVX512_VNNI AVX512_BF16291 AMX_TILE AMX_INT8 AMX_BF16)292 set(GGML_${feat} OFF)293 endforeach()294 295 foreach (feat ${ARGN})296 set(GGML_${feat} ON)297 endforeach()298 299 ggml_add_cpu_backend_variant_impl(${tag_name})300endfunction()301 302ggml_add_backend(CPU)303 304if (GGML_CPU_ALL_VARIANTS)305 if (NOT GGML_BACKEND_DL)306 message(FATAL_ERROR "GGML_CPU_ALL_VARIANTS requires GGML_BACKEND_DL")307 endif()308 ggml_add_cpu_backend_variant(sandybridge AVX)309 ggml_add_cpu_backend_variant(haswell AVX F16C AVX2 FMA)310 ggml_add_cpu_backend_variant(skylakex AVX F16C AVX2 FMA AVX512)311 ggml_add_cpu_backend_variant(icelake AVX F16C AVX2 FMA AVX512 AVX512_VBMI AVX512_VNNI)312 ggml_add_cpu_backend_variant(alderlake AVX F16C AVX2 FMA AVX_VNNI)313 if (NOT MSVC)314 # MSVC doesn't support AMX315 ggml_add_cpu_backend_variant(sapphirerapids AVX F16C AVX2 FMA AVX512 AVX512_VBMI AVX512_VNNI AVX512_BF16 AMX_TILE AMX_INT8)316 endif()317elseif (GGML_CPU)318 ggml_add_cpu_backend_variant_impl("")319endif()320 321ggml_add_backend(BLAS)322ggml_add_backend(CANN)323ggml_add_backend(CUDA)324ggml_add_backend(HIP)325ggml_add_backend(Kompute)326ggml_add_backend(METAL)327ggml_add_backend(MUSA)328ggml_add_backend(RPC)329ggml_add_backend(SYCL)330ggml_add_backend(Vulkan)331ggml_add_backend(OpenCL)332 333foreach (target ggml-base ggml)334 target_include_directories(${target} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../include> $<INSTALL_INTERFACE:include>)335 target_compile_features (${target} PRIVATE c_std_11 cxx_std_17) # don't bump336endforeach()337 338target_link_libraries(ggml-base PRIVATE Threads::Threads)339 340find_library(MATH_LIBRARY m)341if (MATH_LIBRARY)342 if (NOT WIN32 OR NOT DEFINED ENV{ONEAPI_ROOT})343 target_link_libraries(ggml-base PRIVATE m)344 endif()345endif()346 347if (CMAKE_SYSTEM_NAME MATCHES "Android")348 target_link_libraries(ggml-base PRIVATE dl)349endif()350 351if (BUILD_SHARED_LIBS)352 foreach (target ggml-base ggml)353 set_target_properties(${target} PROPERTIES POSITION_INDEPENDENT_CODE ON)354 target_compile_definitions(${target} PRIVATE GGML_BUILD)355 target_compile_definitions(${target} PUBLIC GGML_SHARED)356 endforeach()357endif()358 