| include(CheckCXXCompilerFlag) |
|
|
| add_compile_definitions(GGML_SCHED_MAX_COPIES=${GGML_SCHED_MAX_COPIES}) |
|
|
| # enable libstdc++ assertions for debug builds |
| if (CMAKE_SYSTEM_NAME MATCHES "Linux") |
| add_compile_definitions($<$<CONFIG:Debug>:_GLIBCXX_ASSERTIONS>) |
| endif() |
|
|
| if (NOT MSVC) |
| if (GGML_SANITIZE_THREAD) |
| add_compile_options(-fsanitize=thread) |
| link_libraries (-fsanitize=thread) |
| endif() |
|
|
| if (GGML_SANITIZE_ADDRESS) |
| add_compile_options(-fsanitize=address -fno-omit-frame-pointer) |
| link_libraries (-fsanitize=address) |
| endif() |
|
|
| if (GGML_SANITIZE_UNDEFINED) |
| add_compile_options(-fsanitize=undefined) |
| link_libraries (-fsanitize=undefined) |
| endif() |
| endif() |
|
|
| function(ggml_get_flags CCID CCVER) |
| set(C_FLAGS "") |
| set(CXX_FLAGS "") |
|
|
| if (CCID MATCHES "Clang") |
| set(C_FLAGS -Wunreachable-code-break -Wunreachable-code-return) |
| set(CXX_FLAGS -Wunreachable-code-break -Wunreachable-code-return -Wmissing-prototypes -Wextra-semi) |
|
|
| if ( |
| (CCID STREQUAL "Clang" AND CCVER VERSION_GREATER_EQUAL 3.8.0) OR |
| (CCID STREQUAL "AppleClang" AND CCVER VERSION_GREATER_EQUAL 7.3.0) |
| ) |
| list(APPEND C_FLAGS -Wdouble-promotion) |
| endif() |
| elseif (CCID STREQUAL "GNU") |
| set(C_FLAGS -Wdouble-promotion) |
| set(CXX_FLAGS -Wno-array-bounds) |
|
|
| if (CCVER VERSION_GREATER_EQUAL 8.1.0) |
| list(APPEND CXX_FLAGS -Wextra-semi) |
| endif() |
| endif() |
|
|
| set(GF_C_FLAGS ${C_FLAGS} PARENT_SCOPE) |
| set(GF_CXX_FLAGS ${CXX_FLAGS} PARENT_SCOPE) |
| endfunction() |
|
|
| if (GGML_FATAL_WARNINGS) |
| if (CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") |
| list(APPEND C_FLAGS -Werror) |
| list(APPEND CXX_FLAGS -Werror) |
| elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") |
| add_compile_options(/WX) |
| endif() |
| endif() |
|
|
| if (GGML_ALL_WARNINGS) |
| if (NOT MSVC) |
| list(APPEND WARNING_FLAGS -Wall -Wextra -Wpedantic -Wcast-qual -Wno-unused-function) |
| list(APPEND C_FLAGS -Wshadow -Wstrict-prototypes -Wpointer-arith -Wmissing-prototypes |
| -Werror=implicit-int -Werror=implicit-function-declaration) |
| list(APPEND CXX_FLAGS -Wmissing-declarations -Wmissing-noreturn) |
|
|
| list(APPEND C_FLAGS ${WARNING_FLAGS}) |
| list(APPEND CXX_FLAGS ${WARNING_FLAGS}) |
|
|
| ggml_get_flags(${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}) |
|
|
| add_compile_options("$<$<COMPILE_LANGUAGE:C>:${C_FLAGS};${GF_C_FLAGS}>" |
| "$<$<COMPILE_LANGUAGE:CXX>:${CXX_FLAGS};${GF_CXX_FLAGS}>") |
| else() |
| # todo : msvc |
| set(C_FLAGS "") |
| set(CXX_FLAGS "") |
| endif() |
| endif() |
|
|
| if (GGML_LTO) |
| include(CheckIPOSupported) |
| check_ipo_supported(RESULT result OUTPUT output) |
| if (result) |
| set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) |
| else() |
| message(WARNING "IPO is not supported: ${output}") |
| endif() |
| endif() |
|
|
| if (GGML_CCACHE) |
| find_program(GGML_CCACHE_FOUND ccache) |
|
|
| if (GGML_CCACHE_FOUND) |
| # TODO: should not be set globally |
| set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache) |
| set(ENV{CCACHE_SLOPPINESS} time_macros) |
| message(STATUS "ccache found, compilation results will be cached. Disable with GGML_CCACHE=OFF.") |
| else() |
| message(STATUS "Warning: ccache not found - consider installing it for faster compilation or disable this warning with GGML_CCACHE=OFF") |
| endif () |
| endif() |
|
|
| # this version of Apple ld64 is buggy |
| execute_process( |
| COMMAND ${CMAKE_C_COMPILER} ${CMAKE_EXE_LINKER_FLAGS} -Wl,-v |
| ERROR_VARIABLE output |
| OUTPUT_QUIET |
| ) |
|
|
| if (output MATCHES "dyld-1015\.7") |
| add_compile_definitions(HAVE_BUGGY_APPLE_LINKER) |
| endif() |
|
|
| # architecture specific |
| # TODO: probably these flags need to be tweaked on some architectures |
| # feel free to update the Makefile for your architecture and send a pull request or issue |
| message(STATUS "CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}") |
| if (MSVC) |
| string(TOLOWER "${CMAKE_GENERATOR_PLATFORM}" CMAKE_GENERATOR_PLATFORM_LWR) |
| message(STATUS "CMAKE_GENERATOR_PLATFORM: ${CMAKE_GENERATOR_PLATFORM}") |
| else () |
| set(CMAKE_GENERATOR_PLATFORM_LWR "") |
| endif () |
|
|
| if (NOT MSVC) |
| if (GGML_STATIC) |
| add_link_options(-static) |
| if (MINGW) |
| add_link_options(-static-libgcc -static-libstdc++) |
| endif() |
| endif() |
| if (GGML_GPROF) |
| add_compile_options(-pg) |
| endif() |
| endif() |
|
|
| if (MINGW) |
| # Target Windows 8 for PrefetchVirtualMemory |
| add_compile_definitions(_WIN32_WINNT=${GGML_WIN_VER}) |
| endif() |
|
|
| # |
| # POSIX conformance |
| # |
|
|
| # clock_gettime came in POSIX.1b (1993) |
| # CLOCK_MONOTONIC came in POSIX.1-2001 / SUSv3 as optional |
| # posix_memalign came in POSIX.1-2001 / SUSv3 |
| # M_PI is an XSI extension since POSIX.1-2001 / SUSv3, came in XPG1 (1985) |
|
|
| # Somehow in OpenBSD whenever POSIX conformance is specified |
| # some string functions rely on locale_t availability, |
| # which was introduced in POSIX.1-2008, forcing us to go higher |
| if (CMAKE_SYSTEM_NAME MATCHES "OpenBSD") |
| add_compile_definitions(_XOPEN_SOURCE=700) |
| else() |
| add_compile_definitions(_XOPEN_SOURCE=600) |
| endif() |
|
|
| # Data types, macros and functions related to controlling CPU affinity and |
| # some memory allocation are available on Linux through GNU extensions in libc |
| if (CMAKE_SYSTEM_NAME MATCHES "Linux" OR CMAKE_SYSTEM_NAME MATCHES "Android") |
| add_compile_definitions(_GNU_SOURCE) |
| endif() |
|
|
| # RLIMIT_MEMLOCK came in BSD, is not specified in POSIX.1, |
| # and on macOS its availability depends on enabling Darwin extensions |
| # similarly on DragonFly, enabling BSD extensions is necessary |
| if ( |
| CMAKE_SYSTEM_NAME MATCHES "Darwin" OR |
| CMAKE_SYSTEM_NAME MATCHES "iOS" OR |
| CMAKE_SYSTEM_NAME MATCHES "tvOS" OR |
| CMAKE_SYSTEM_NAME MATCHES "DragonFly" |
| ) |
| add_compile_definitions(_DARWIN_C_SOURCE) |
| endif() |
|
|
| # alloca is a non-standard interface that is not visible on BSDs when |
| # POSIX conformance is specified, but not all of them provide a clean way |
| # to enable it in such cases |
| if (CMAKE_SYSTEM_NAME MATCHES "FreeBSD") |
| add_compile_definitions(__BSD_VISIBLE) |
| endif() |
| if (CMAKE_SYSTEM_NAME MATCHES "NetBSD") |
| add_compile_definitions(_NETBSD_SOURCE) |
| endif() |
| if (CMAKE_SYSTEM_NAME MATCHES "OpenBSD") |
| add_compile_definitions(_BSD_SOURCE) |
| endif() |
|
|
| if (WIN32) |
| add_compile_definitions(_CRT_SECURE_NO_WARNINGS) |
|
|
| if (BUILD_SHARED_LIBS) |
| # TODO: should not use this |
| set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) |
| endif() |
| endif() |
|
|
| # ggml |
|
|
| if (GGML_BACKEND_DL AND NOT BUILD_SHARED_LIBS) |
| message(FATAL_ERROR "GGML_BACKEND_DL requires BUILD_SHARED_LIBS") |
| endif() |
|
|
| add_library(ggml-base |
| ../include/ggml.h |
| ../include/ggml-alloc.h |
| ../include/ggml-backend.h |
| ../include/ggml-cpp.h |
| ../include/ggml-opt.h |
| ggml.c |
| ggml-alloc.c |
| ggml-backend.cpp |
| ggml-opt.cpp |
| ggml-threading.cpp |
| ggml-threading.h |
| ggml-quants.c |
| ggml-quants.h |
| ggml-aarch64.c |
| ggml-aarch64.h) |
|
|
| target_include_directories(ggml-base PRIVATE .) |
|
|
| add_library(ggml |
| ggml-backend-reg.cpp) |
|
|
| target_link_libraries(ggml PUBLIC ggml-base) |
|
|
| if (CMAKE_SYSTEM_NAME MATCHES "Linux") |
| target_link_libraries(ggml PRIVATE dl) |
| endif() |
|
|
| function(ggml_add_backend_library backend) |
| if (GGML_BACKEND_DL) |
| add_library(${backend} MODULE ${ARGN}) |
| # write the shared library to the output directory |
| set_target_properties(${backend} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) |
| target_compile_definitions(${backend} PRIVATE GGML_BACKEND_DL) |
| else() |
| add_library(${backend} ${ARGN}) |
| target_link_libraries(ggml PUBLIC ${backend}) |
| install(TARGETS ${backend} LIBRARY) |
| endif() |
|
|
| target_link_libraries(${backend} PRIVATE ggml-base) |
| target_include_directories(${backend} PRIVATE ..) |
|
|
| if (${BUILD_SHARED_LIBS}) |
| target_compile_definitions(${backend} PRIVATE GGML_BACKEND_BUILD) |
| target_compile_definitions(${backend} PUBLIC GGML_BACKEND_SHARED) |
| endif() |
| endfunction() |
|
|
| function(ggml_add_backend backend) |
| string(TOUPPER "GGML_${backend}" backend_id) |
| if (${backend_id}) |
| string(TOLOWER "ggml-${backend}" backend_target) |
| add_subdirectory(${backend_target}) |
| message(STATUS "Including ${backend} backend") |
| if (NOT GGML_BACKEND_DL) |
| string(TOUPPER "GGML_USE_${backend}" backend_use) |
| target_compile_definitions(ggml PUBLIC ${backend_use}) |
| endif() |
| endif() |
| endfunction() |
|
|
| ggml_add_backend(CPU) |
| ggml_add_backend(BLAS) |
| ggml_add_backend(CANN) |
| ggml_add_backend(CUDA) |
| ggml_add_backend(HIP) |
| ggml_add_backend(Kompute) |
| ggml_add_backend(METAL) |
| ggml_add_backend(MUSA) |
| ggml_add_backend(RPC) |
| ggml_add_backend(SYCL) |
| ggml_add_backend(Vulkan) |
|
|
| foreach (target ggml-base ggml) |
| target_include_directories(${target} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../include> $<INSTALL_INTERFACE:include>) |
| target_compile_features (${target} PRIVATE c_std_11 cxx_std_17) # don't bump |
| endforeach() |
|
|
| target_link_libraries(ggml-base PRIVATE Threads::Threads) |
|
|
| find_library(MATH_LIBRARY m) |
| if (MATH_LIBRARY) |
| if (NOT WIN32 OR NOT DEFINED ENV{ONEAPI_ROOT}) |
| target_link_libraries(ggml-base PRIVATE m) |
| endif() |
| endif() |
|
|
| if (CMAKE_SYSTEM_NAME MATCHES "Android") |
| target_link_libraries(ggml-base PRIVATE dl) |
| endif() |
|
|
| if (BUILD_SHARED_LIBS) |
| foreach (target ggml-base ggml) |
| set_target_properties(${target} PROPERTIES POSITION_INDEPENDENT_CODE ON) |
| target_compile_definitions(${target} PRIVATE GGML_BUILD) |
| target_compile_definitions(${target} PUBLIC GGML_SHARED) |
| endforeach() |
| endif() |
|
|