CMakeLists.txt 17 KB

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