|
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() |
|
|