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