1include(CheckCXXCompilerFlag)
  2include("../cmake/common.cmake")
  3
  4add_compile_definitions(GGML_SCHED_MAX_COPIES=${GGML_SCHED_MAX_COPIES})
  5
  6# enable libstdc++ assertions for debug builds
  7if (CMAKE_SYSTEM_NAME MATCHES "Linux")
  8    add_compile_definitions($<$<CONFIG:Debug>:_GLIBCXX_ASSERTIONS>)
  9endif()
 10
 11if (NOT MSVC)
 12    if (GGML_SANITIZE_THREAD)
 13        add_compile_options(-fsanitize=thread)
 14        link_libraries     (-fsanitize=thread)
 15    endif()
 16
 17    if (GGML_SANITIZE_ADDRESS)
 18        add_compile_options(-fsanitize=address -fno-omit-frame-pointer)
 19        link_libraries     (-fsanitize=address)
 20    endif()
 21
 22    if (GGML_SANITIZE_UNDEFINED)
 23        add_compile_options(-fsanitize=undefined)
 24        link_libraries     (-fsanitize=undefined)
 25    endif()
 26endif()
 27
 28if (GGML_FATAL_WARNINGS)
 29    if (CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
 30        list(APPEND C_FLAGS   -Werror)
 31        list(APPEND CXX_FLAGS -Werror)
 32    elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
 33        add_compile_options(/WX)
 34    endif()
 35endif()
 36
 37if (GGML_ALL_WARNINGS)
 38    if (NOT MSVC)
 39        list(APPEND WARNING_FLAGS -Wall -Wextra -Wpedantic -Wcast-qual -Wno-unused-function)
 40        list(APPEND C_FLAGS       -Wshadow -Wstrict-prototypes -Wpointer-arith -Wmissing-prototypes
 41                                  -Werror=implicit-int -Werror=implicit-function-declaration)
 42        list(APPEND CXX_FLAGS     -Wmissing-declarations -Wmissing-noreturn)
 43
 44        list(APPEND C_FLAGS   ${WARNING_FLAGS})
 45        list(APPEND CXX_FLAGS ${WARNING_FLAGS})
 46
 47        ggml_get_flags(${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION})
 48
 49        add_compile_options("$<$<COMPILE_LANGUAGE:C>:${C_FLAGS};${GF_C_FLAGS}>"
 50                            "$<$<COMPILE_LANGUAGE:CXX>:${CXX_FLAGS};${GF_CXX_FLAGS}>")
 51    else()
 52        # todo : msvc
 53        set(C_FLAGS   "")
 54        set(CXX_FLAGS "")
 55    endif()
 56endif()
 57
 58if (GGML_LTO)
 59    include(CheckIPOSupported)
 60    check_ipo_supported(RESULT result OUTPUT output)
 61    if (result)
 62        set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
 63    else()
 64        message(WARNING "IPO is not supported: ${output}")
 65    endif()
 66endif()
 67
 68if (GGML_CCACHE AND NOT CMAKE_C_COMPILER_LAUNCHER AND NOT CMAKE_CXX_COMPILER_LAUNCHER)
 69    find_program(GGML_CCACHE_FOUND ccache)
 70    find_program(GGML_SCCACHE_FOUND sccache)
 71
 72    if (GGML_CCACHE_FOUND OR GGML_SCCACHE_FOUND)
 73        if(GGML_CCACHE_FOUND)
 74            set(GGML_CCACHE_VARIANT ccache)
 75        else()
 76            set(GGML_CCACHE_VARIANT sccache)
 77        endif()
 78        # TODO: should not be set globally
 79        if (GGML_SYCL AND GGML_CCACHE_FOUND AND WIN32)
 80            set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "ccache compiler_type=icl")
 81        else ()
 82            set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${GGML_CCACHE_VARIANT}")
 83        endif ()
 84        set(ENV{CCACHE_SLOPPINESS} time_macros)
 85        message(STATUS "${GGML_CCACHE_VARIANT} found, compilation results will be cached. Disable with GGML_CCACHE=OFF.")
 86    else()
 87        message(STATUS "Warning: ccache not found - consider installing it for faster compilation or disable this warning with GGML_CCACHE=OFF")
 88    endif ()
 89endif()
 90
 91# this version of Apple ld64 is buggy
 92execute_process(
 93    COMMAND ${CMAKE_C_COMPILER} ${CMAKE_EXE_LINKER_FLAGS} -Wl,-v
 94    ERROR_VARIABLE output
 95    OUTPUT_QUIET
 96)
 97
 98if (output MATCHES "dyld-1015\.7")
 99    add_compile_definitions(HAVE_BUGGY_APPLE_LINKER)
100endif()
101
102# architecture specific
103# TODO: probably these flags need to be tweaked on some architectures
104#       feel free to update the Makefile for your architecture and send a pull request or issue
105message(STATUS "CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}")
106if (MSVC)
107    string(TOLOWER "${CMAKE_GENERATOR_PLATFORM}" CMAKE_GENERATOR_PLATFORM_LWR)
108    message(STATUS "CMAKE_GENERATOR_PLATFORM: ${CMAKE_GENERATOR_PLATFORM}")
109else ()
110    set(CMAKE_GENERATOR_PLATFORM_LWR "")
111endif ()
112ggml_get_system_arch()
113message(STATUS "GGML_SYSTEM_ARCH: ${GGML_SYSTEM_ARCH}")
114
115if (NOT MSVC)
116    if (GGML_STATIC)
117        if (UNIX AND NOT APPLE)
118            set(CMAKE_FIND_LIBRARY_SUFFIXES ".a;.so")
119        endif()
120        add_link_options(-static)
121        if (MINGW)
122            add_link_options(-static-libgcc -static-libstdc++)
123        endif()
124    endif()
125    if (GGML_GPROF)
126        add_compile_options(-pg)
127    endif()
128endif()
129
130#
131# POSIX conformance
132#
133
134# clock_gettime came in POSIX.1b (1993)
135# CLOCK_MONOTONIC came in POSIX.1-2001 / SUSv3 as optional
136# posix_memalign came in POSIX.1-2001 / SUSv3
137# M_PI is an XSI extension since POSIX.1-2001 / SUSv3, came in XPG1 (1985)
138
139# Somehow in OpenBSD whenever POSIX conformance is specified
140# some string functions rely on locale_t availability,
141# which was introduced in POSIX.1-2008, forcing us to go higher
142if (CMAKE_SYSTEM_NAME MATCHES "OpenBSD")
143    add_compile_definitions(_XOPEN_SOURCE=700)
144elseif (CMAKE_SYSTEM_NAME MATCHES "AIX")
145    # Don't define _XOPEN_SOURCE.  We need _ALL_SOURCE, which is the default,
146    # in order to define _SC_PHYS_PAGES.
147else()
148    add_compile_definitions(_XOPEN_SOURCE=600)
149endif()
150
151# Data types, macros and functions related to controlling CPU affinity and
152# some memory allocation are available on Linux through GNU extensions in libc
153if (CMAKE_SYSTEM_NAME MATCHES "Linux" OR CMAKE_SYSTEM_NAME MATCHES "Android")
154    add_compile_definitions(_GNU_SOURCE)
155endif()
156
157# RLIMIT_MEMLOCK came in BSD, is not specified in POSIX.1,
158# and on macOS its availability depends on enabling Darwin extensions
159# similarly on DragonFly, enabling BSD extensions is necessary
160if (
161    CMAKE_SYSTEM_NAME MATCHES "Darwin" OR
162    CMAKE_SYSTEM_NAME MATCHES "iOS"    OR
163    CMAKE_SYSTEM_NAME MATCHES "tvOS"   OR
164    CMAKE_SYSTEM_NAME MATCHES "DragonFly"
165)
166    add_compile_definitions(_DARWIN_C_SOURCE)
167endif()
168
169# alloca is a non-standard interface that is not visible on BSDs when
170# POSIX conformance is specified, but not all of them provide a clean way
171# to enable it in such cases
172if (CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
173    add_compile_definitions(__BSD_VISIBLE)
174endif()
175if (CMAKE_SYSTEM_NAME MATCHES "NetBSD")
176    add_compile_definitions(_NETBSD_SOURCE)
177endif()
178if (CMAKE_SYSTEM_NAME MATCHES "OpenBSD")
179    add_compile_definitions(_BSD_SOURCE)
180endif()
181
182if (WIN32)
183    add_compile_definitions(_CRT_SECURE_NO_WARNINGS)
184endif()
185
186# ggml
187
188if (GGML_BACKEND_DL AND NOT BUILD_SHARED_LIBS)
189    message(FATAL_ERROR "GGML_BACKEND_DL requires BUILD_SHARED_LIBS")
190endif()
191
192add_library(ggml-base
193            ../include/ggml.h
194            ../include/ggml-alloc.h
195            ../include/ggml-backend.h
196            ../include/ggml-cpp.h
197            ../include/ggml-opt.h
198            ../include/gguf.h
199            ggml.c
200            ggml.cpp
201            ggml-alloc.c
202            ggml-backend.cpp
203            ggml-opt.cpp
204            ggml-threading.cpp
205            ggml-threading.h
206            ggml-quants.c
207            ggml-quants.h
208            gguf.cpp)
209
210set_target_properties(ggml-base PROPERTIES
211    VERSION ${GGML_VERSION}
212    SOVERSION ${GGML_VERSION_MAJOR}
213)
214
215target_include_directories(ggml-base PRIVATE .)
216if (GGML_BACKEND_DL)
217    target_compile_definitions(ggml-base PUBLIC GGML_BACKEND_DL)
218endif()
219
220if (GGML_SCHED_NO_REALLOC)
221    target_compile_definitions(ggml-base PUBLIC GGML_SCHED_NO_REALLOC)
222endif()
223
224add_library(ggml
225            ggml-backend-dl.cpp
226            ggml-backend-reg.cpp)
227add_library(ggml::ggml ALIAS ggml)
228
229set_target_properties(ggml PROPERTIES
230    VERSION ${GGML_VERSION}
231    SOVERSION ${GGML_VERSION_MAJOR}
232)
233
234if (GGML_BACKEND_DIR)
235    if (NOT GGML_BACKEND_DL)
236        message(FATAL_ERROR "GGML_BACKEND_DIR requires GGML_BACKEND_DL")
237    endif()
238    target_compile_definitions(ggml PUBLIC GGML_BACKEND_DIR="${GGML_BACKEND_DIR}")
239endif()
240
241target_link_libraries(ggml PUBLIC ggml-base)
242
243if (CMAKE_SYSTEM_NAME MATCHES "Linux")
244    target_link_libraries(ggml PRIVATE dl)
245endif()
246
247function(ggml_add_backend_library backend)
248    if (GGML_BACKEND_DL)
249        add_library(${backend} MODULE ${ARGN})
250        # write the shared library to the output directory
251        set_target_properties(${backend} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
252        target_compile_definitions(${backend} PRIVATE GGML_BACKEND_DL)
253        add_dependencies(ggml ${backend})
254        if (GGML_BACKEND_DIR)
255            install(TARGETS ${backend} LIBRARY DESTINATION ${GGML_BACKEND_DIR})
256        else()
257            install(TARGETS ${backend} LIBRARY DESTINATION ${CMAKE_INSTALL_BINDIR})
258        endif()
259    else()
260        add_library(${backend} ${ARGN})
261        target_link_libraries(ggml PUBLIC ${backend})
262        install(TARGETS ${backend} LIBRARY)
263    endif()
264
265    target_link_libraries(${backend} PRIVATE ggml-base)
266    target_include_directories(${backend} PRIVATE ..)
267
268    if (${BUILD_SHARED_LIBS})
269        target_compile_definitions(${backend} PRIVATE GGML_BACKEND_BUILD)
270        target_compile_definitions(${backend} PUBLIC  GGML_BACKEND_SHARED)
271    endif()
272
273    # Set versioning properties for all backend libraries
274    # Building a MODULE library with a version is not supported on macOS (https://gitlab.kitware.com/cmake/cmake/-/issues/20782)
275    if (NOT (APPLE AND GGML_BACKEND_DL))
276        set_target_properties(${backend} PROPERTIES
277            VERSION ${GGML_VERSION}
278            SOVERSION ${GGML_VERSION_MAJOR}
279        )
280    endif()
281
282    if(NOT GGML_AVAILABLE_BACKENDS)
283        set(GGML_AVAILABLE_BACKENDS "${backend}"
284            CACHE INTERNAL "List of backends for cmake package")
285    else()
286        list(FIND GGML_AVAILABLE_BACKENDS "${backend}" has_backend)
287        if(has_backend EQUAL -1)
288            set(GGML_AVAILABLE_BACKENDS "${GGML_AVAILABLE_BACKENDS};${backend}"
289                CACHE INTERNAL "List of backends for cmake package")
290        endif()
291    endif()
292endfunction()
293
294function(ggml_add_backend backend)
295    string(TOUPPER "GGML_${backend}" backend_id)
296    if (${backend_id})
297        string(TOLOWER "ggml-${backend}" backend_target)
298        add_subdirectory(${backend_target})
299        message(STATUS "Including ${backend} backend")
300        if (NOT GGML_BACKEND_DL)
301            string(TOUPPER "GGML_USE_${backend}" backend_use)
302            target_compile_definitions(ggml PUBLIC ${backend_use})
303        endif()
304    endif()
305endfunction()
306
307function(ggml_add_cpu_backend_variant tag_name)
308    set(GGML_CPU_TAG_NAME ${tag_name})
309    # other: OPENMP LLAMAFILE CPU_HBM
310    if (GGML_SYSTEM_ARCH STREQUAL "x86")
311        foreach (feat NATIVE
312                      SSE42
313                      AVX AVX2 BMI2 AVX_VNNI FMA F16C
314                      AVX512 AVX512_VBMI AVX512_VNNI AVX512_BF16
315                      AMX_TILE AMX_INT8 AMX_BF16)
316            set(GGML_${feat} OFF)
317        endforeach()
318
319        foreach (feat ${ARGN})
320            set(GGML_${feat} ON)
321        endforeach()
322    elseif (GGML_SYSTEM_ARCH STREQUAL "ARM")
323        foreach (feat ${ARGN})
324            set(GGML_INTERNAL_${feat} ON)
325        endforeach()
326    elseif (GGML_SYSTEM_ARCH STREQUAL "PowerPC")
327        foreach (feat ${ARGN})
328            set(GGML_INTERNAL_${feat} ON)
329        endforeach()
330    elseif (GGML_SYSTEM_ARCH STREQUAL "s390x")
331        foreach (feat VXE2 NNPA)
332            set(GGML_INTERNAL_${feat} OFF)
333        endforeach()
334
335        foreach (feat ${ARGN})
336            set(GGML_INTERNAL_${feat} ON)
337        endforeach()
338    elseif (GGML_SYSTEM_ARCH STREQUAL "riscv64")
339        foreach (feat RVV)
340            set(GGML_INTERNAL_${feat} OFF)
341        endforeach()
342
343        foreach (feat ${ARGN})
344            set(GGML_INTERNAL_${feat} ON)
345        endforeach()
346    endif()
347
348    ggml_add_cpu_backend_variant_impl(${tag_name})
349endfunction()
350
351ggml_add_backend(CPU)
352
353if (GGML_CPU_ALL_VARIANTS)
354    if (NOT GGML_BACKEND_DL)
355        message(FATAL_ERROR "GGML_CPU_ALL_VARIANTS requires GGML_BACKEND_DL")
356    elseif (GGML_CPU_ARM_ARCH)
357        message(FATAL_ERROR "Cannot use both GGML_CPU_ARM_ARCH and GGML_CPU_ALL_VARIANTS")
358    endif()
359    if (GGML_SYSTEM_ARCH STREQUAL "x86")
360        ggml_add_cpu_backend_variant(x64)
361        ggml_add_cpu_backend_variant(sse42              SSE42)
362        ggml_add_cpu_backend_variant(sandybridge        SSE42 AVX)
363        if (NOT MSVC)
364            # __FMA__ and __F16C__ are not defined in MSVC, however they are implied with AVX2/AVX512
365            ggml_add_cpu_backend_variant(ivybridge      SSE42 AVX F16C)
366            ggml_add_cpu_backend_variant(piledriver     SSE42 AVX F16C FMA)
367        endif()
368        ggml_add_cpu_backend_variant(haswell            SSE42 AVX F16C FMA AVX2 BMI2)
369        ggml_add_cpu_backend_variant(skylakex           SSE42 AVX F16C FMA AVX2 BMI2 AVX512)
370        ggml_add_cpu_backend_variant(cannonlake         SSE42 AVX F16C FMA AVX2 BMI2 AVX512 AVX512_VBMI)
371        ggml_add_cpu_backend_variant(cascadelake        SSE42 AVX F16C FMA AVX2 BMI2 AVX512 AVX512_VNNI)
372        ggml_add_cpu_backend_variant(icelake            SSE42 AVX F16C FMA AVX2 BMI2 AVX512 AVX512_VBMI AVX512_VNNI)
373        if (NOT MSVC)
374            # MSVC 2022 doesn't support BF16 intrinsics without `/arch:AVX10.1` ?!
375            # https://learn.microsoft.com/en-us/cpp/intrinsics/x64-amd64-intrinsics-list?view=msvc-170
376            # https://learn.microsoft.com/en-us/cpp/build/reference/arch-x64?view=msvc-170
377            ggml_add_cpu_backend_variant(cooperlake     SSE42 AVX F16C FMA AVX2 BMI2 AVX512 AVX512_VNNI AVX512_BF16)
378            ggml_add_cpu_backend_variant(zen4           SSE42 AVX F16C FMA AVX2 BMI2 AVX512 AVX512_VBMI AVX512_VNNI AVX512_BF16)
379        endif()
380        ggml_add_cpu_backend_variant(alderlake          SSE42 AVX F16C FMA AVX2 BMI2 AVX_VNNI)
381        if (NOT MSVC)
382            # MSVC doesn't support AMX
383            ggml_add_cpu_backend_variant(sapphirerapids SSE42 AVX F16C FMA AVX2 BMI2 AVX512 AVX512_VBMI AVX512_VNNI AVX512_BF16 AMX_TILE AMX_INT8)
384        endif()
385    elseif(GGML_SYSTEM_ARCH STREQUAL "ARM")
386        if (CMAKE_SYSTEM_NAME MATCHES "Linux")
387            # Many of these features are optional so we build versions with popular
388            # combinations and name the backends based on the version they were
389            # first released with
390            ggml_add_cpu_backend_variant(armv8.0_1)
391            ggml_add_cpu_backend_variant(armv8.2_1    DOTPROD)
392            ggml_add_cpu_backend_variant(armv8.2_2    DOTPROD FP16_VECTOR_ARITHMETIC)
393            ggml_add_cpu_backend_variant(armv8.2_3    DOTPROD FP16_VECTOR_ARITHMETIC SVE)
394            ggml_add_cpu_backend_variant(armv8.6_1    DOTPROD FP16_VECTOR_ARITHMETIC SVE MATMUL_INT8)
395            ggml_add_cpu_backend_variant(armv8.6_2    DOTPROD FP16_VECTOR_ARITHMETIC SVE MATMUL_INT8 SVE2)
396            ggml_add_cpu_backend_variant(armv9.2_1    DOTPROD FP16_VECTOR_ARITHMETIC SVE MATMUL_INT8 SME)
397            ggml_add_cpu_backend_variant(armv9.2_2    DOTPROD FP16_VECTOR_ARITHMETIC SVE MATMUL_INT8 SVE2 SME)
398        elseif (CMAKE_SYSTEM_NAME MATCHES "Android")
399            # Android-specific backends with SoC-compatible feature sets
400            ggml_add_cpu_backend_variant(android_armv8.0_1)
401            ggml_add_cpu_backend_variant(android_armv8.2_1    DOTPROD)
402            ggml_add_cpu_backend_variant(android_armv8.2_2    DOTPROD FP16_VECTOR_ARITHMETIC)
403            ggml_add_cpu_backend_variant(android_armv8.6_1    DOTPROD FP16_VECTOR_ARITHMETIC MATMUL_INT8)
404            ggml_add_cpu_backend_variant(android_armv9.0_1    DOTPROD MATMUL_INT8 FP16_VECTOR_ARITHMETIC SVE2)
405            ggml_add_cpu_backend_variant(android_armv9.2_1    DOTPROD MATMUL_INT8 FP16_VECTOR_ARITHMETIC SVE SME)
406            ggml_add_cpu_backend_variant(android_armv9.2_2    DOTPROD MATMUL_INT8 FP16_VECTOR_ARITHMETIC SVE SVE2 SME)
407        elseif (APPLE)
408            ggml_add_cpu_backend_variant(apple_m1             DOTPROD)
409            ggml_add_cpu_backend_variant(apple_m2_m3          DOTPROD MATMUL_INT8)
410            ggml_add_cpu_backend_variant(apple_m4             DOTPROD MATMUL_INT8 NOSVE SME)
411        else()
412            message(FATAL_ERROR "Unsupported ARM target OS: ${CMAKE_SYSTEM_NAME}")
413        endif()
414    elseif (GGML_SYSTEM_ARCH STREQUAL "PowerPC")
415        if (CMAKE_SYSTEM_NAME MATCHES "Linux")
416            ggml_add_cpu_backend_variant(power0)
417            ggml_add_cpu_backend_variant(power7_1       POWER7)
418            ggml_add_cpu_backend_variant(power7_2       POWER7  VSX)
419            ggml_add_cpu_backend_variant(power8_1       POWER8)
420            ggml_add_cpu_backend_variant(power8_2       POWER8  VSX)
421            ggml_add_cpu_backend_variant(power9         POWER9  VSX)
422            ggml_add_cpu_backend_variant(power10        POWER10 VSX)
423            ggml_add_cpu_backend_variant(power11        POWER11 VSX)
424        else()
425            message(FATAL_ERROR "Unsupported PowerPC target OS: ${CMAKE_SYSTEM_NAME}")
426        endif()
427    elseif (GGML_SYSTEM_ARCH STREQUAL "s390x")
428        if (CMAKE_SYSTEM_NAME MATCHES "Linux")
429            ggml_add_cpu_backend_variant(z15    Z15 VXE2)
430            ggml_add_cpu_backend_variant(z16    Z16 VXE2 NNPA)
431        else()
432            message(FATAL_ERROR "Unsupported s390x target OS: ${CMAKE_SYSTEM_NAME}")
433        endif()
434    elseif (GGML_SYSTEM_ARCH STREQUAL "riscv64")
435        if (CMAKE_SYSTEM_NAME MATCHES "Linux")
436            ggml_add_cpu_backend_variant(riscv64_0)
437            ggml_add_cpu_backend_variant(riscv64_v   RVV)
438        else()
439            message(FATAL_ERROR "Unsupported RISC-V target OS: ${CMAKE_SYSTEM_NAME}")
440        endif()
441    else()
442        message(FATAL_ERROR "GGML_CPU_ALL_VARIANTS not yet supported with ${GGML_SYSTEM_ARCH} on ${CMAKE_SYSTEM_NAME}")
443    endif()
444elseif (GGML_CPU)
445    ggml_add_cpu_backend_variant_impl("")
446endif()
447
448ggml_add_backend(BLAS)
449ggml_add_backend(CANN)
450ggml_add_backend(CUDA)
451ggml_add_backend(HIP)
452ggml_add_backend(METAL)
453ggml_add_backend(MUSA)
454ggml_add_backend(RPC)
455ggml_add_backend(VirtGPU)
456ggml_add_backend(SYCL)
457ggml_add_backend(Vulkan)
458ggml_add_backend(WebGPU)
459ggml_add_backend(zDNN)
460ggml_add_backend(OpenCL)
461ggml_add_backend(Hexagon)
462ggml_add_backend(ZenDNN)
463
464foreach (target ggml-base ggml)
465    target_include_directories(${target} PUBLIC    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../include> $<INSTALL_INTERFACE:include>)
466    target_compile_features   (${target} PRIVATE c_std_11 cxx_std_17) # don't bump
467endforeach()
468
469target_link_libraries(ggml-base PRIVATE Threads::Threads)
470
471find_library(MATH_LIBRARY m)
472if (MATH_LIBRARY)
473    if (NOT WIN32 OR NOT DEFINED ENV{ONEAPI_ROOT})
474        target_link_libraries(ggml-base PRIVATE m)
475    endif()
476endif()
477
478if (CMAKE_SYSTEM_NAME MATCHES "Android")
479    target_link_libraries(ggml-base PRIVATE dl)
480endif()
481
482if(CMAKE_SYSTEM_NAME MATCHES "visionOS")
483    target_compile_definitions(ggml-base PUBLIC _DARWIN_C_SOURCE)
484endif()
485
486if (BUILD_SHARED_LIBS)
487    foreach (target ggml-base ggml)
488        set_target_properties(${target} PROPERTIES POSITION_INDEPENDENT_CODE ON)
489        target_compile_definitions(${target} PRIVATE GGML_BUILD)
490        target_compile_definitions(${target} PUBLIC  GGML_SHARED)
491    endforeach()
492endif()