CMakeLists.txt 39 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015
  1. cmake_minimum_required(VERSION 3.6)
  2. # Versioning stuff
  3. file(STRINGS "${CMAKE_CURRENT_LIST_DIR}/include/MNN/MNNDefine.h" MNN_DEFINE)
  4. string(REGEX MATCH "MNN_VERSION_MAJOR [0-9]+" MNN_VERSION_MAJOR_DEFINE ${MNN_DEFINE})
  5. string(REGEX MATCH "[0-9]+" MNN_VERSION_MAJOR ${MNN_VERSION_MAJOR_DEFINE})
  6. string(REGEX MATCH "MNN_VERSION_MINOR [0-9]+" MNN_VERSION_MINOR_DEFINE ${MNN_DEFINE})
  7. string(REGEX MATCH "[0-9]+" MNN_VERSION_MINOR ${MNN_VERSION_MINOR_DEFINE})
  8. string(REGEX MATCH "MNN_VERSION_PATCH [0-9]+" MNN_VERSION_PATCH_DEFINE ${MNN_DEFINE})
  9. string(REGEX MATCH "[0-9]+" MNN_VERSION_PATCH ${MNN_VERSION_PATCH_DEFINE})
  10. set(MNN_VERSION ${MNN_VERSION_MAJOR}.${MNN_VERSION_MINOR}.${MNN_VERSION_PATCH})
  11. # Clear VERSION variables when no VERSION is given to project()
  12. if(POLICY CMP0048)
  13. cmake_policy(SET CMP0048 NEW)
  14. endif()
  15. # MSVC runtime library flags are selected by an abstraction.
  16. if(POLICY CMP0091)
  17. cmake_policy(SET CMP0091 NEW)
  18. endif()
  19. project(MNN VERSION ${MNN_VERSION} LANGUAGES C CXX ASM)
  20. # complier options
  21. set(CMAKE_C_STANDARD 99)
  22. IF (NOT (CMAKE_CXX_STANDARD EQUAL 17))
  23. set(CMAKE_CXX_STANDARD 11)
  24. ENDIF()
  25. set(CMAKE_MODULE_PATH
  26. ${CMAKE_MODULE_PATH}
  27. "${CMAKE_CURRENT_LIST_DIR}/cmake"
  28. )
  29. if(WIN32)
  30. if(NOT MSVC)
  31. set(CMAKE_MSVC_RUNTIME_LIBRARY "")
  32. set(MSVC_RUNTIME_LIBRARY "")
  33. endif()
  34. endif()
  35. # build options
  36. option(MNN_USE_SYSTEM_LIB "For opencl and vulkan, use system lib or use dlopen" OFF)
  37. option(MNN_BUILD_HARD "Build -mfloat-abi=hard or not" OFF)
  38. option(MNN_BUILD_SHARED_LIBS "MNN build shared or static lib" ON)
  39. option(MNN_WIN_RUNTIME_MT "MNN use /MT on Windows dll" OFF)
  40. option(MNN_FORBID_MULTI_THREAD "Disable Multi Thread" OFF)
  41. option(MNN_OPENMP "Use OpenMP's thread pool implementation. Does not work on iOS or Mac OS" OFF)
  42. option(MNN_USE_THREAD_POOL "Use MNN's own thread pool implementation" ON)
  43. option(MNN_BUILD_TRAIN "Build MNN's training framework" OFF)
  44. option(MNN_BUILD_DEMO "Build demo/exec or not" OFF)
  45. option(MNN_BUILD_TOOLS "Build tools/cpp or not" ON)
  46. option(MNN_BUILD_QUANTOOLS "Build Quantized Tools or not" OFF)
  47. option(MNN_EVALUATION "Build Evaluation Tools or not" OFF)
  48. option(MNN_BUILD_CONVERTER "Build Converter" OFF)
  49. option(MNN_REDUCE_SIZE "Remove not common op and optimize code" OFF)
  50. option(MNN_SUPPORT_QUANT_EXTEND "Add int8 op for layernorm, binary, unary, scale, softmax, interp" ON)
  51. option(MNN_SUPPORT_DEPRECATED_OP "Enable MNN's tflite quantized op" OFF)
  52. option(MNN_SUPPORT_DEPRECATED_OPV2 "Enable MNN's DEPRECATED op's geometry such as conv3d / deconv3d, which has been treated in converter" ON)
  53. option(MNN_DEBUG_MEMORY "MNN Debug Memory Access" OFF)
  54. option(MNN_DEBUG_TENSOR_SIZE "Enable Tensor Size" OFF)
  55. option(MNN_GPU_TRACE "Enable MNN Gpu Debug" OFF)
  56. option(MNN_SUPPORT_RENDER "Enable MNN Render Ops" OFF)
  57. option(MNN_SUPPORT_TRANSFORMER_FUSE "Enable MNN transformer Fuse Ops" OFF)
  58. option(MNN_SEP_BUILD "Build MNN Backends and expression separately. Only works with MNN_BUILD_SHARED_LIBS=ON" ON)
  59. option(NATIVE_LIBRARY_OUTPUT "Native Library Path" OFF)
  60. option(NATIVE_INCLUDE_OUTPUT "Native Include Path" OFF)
  61. option(MNN_AAPL_FMWK "Build MNN.framework instead of traditional .a/.dylib" OFF)
  62. option(MNN_WITH_PLUGIN "Build with plugin op support." OFF)
  63. option(MNN_SKIPBUILD_GEOMETRY "Skip Build MNN-Geometry, then only supports fixed shape models." OFF)
  64. option(MNN_BUILD_MINI "Build minimal MNN so, set MNN_SKIPBUILD_GEOMETRY and MNN_REDUCE_SIZE ON" OFF)
  65. option(MNN_USE_SSE "Use SSE optimization for x86 if possiable" ON)
  66. option(MNN_BUILD_CODEGEN "Build with codegen" OFF)
  67. option(MNN_ENABLE_COVERAGE "Build with coverage enable" OFF)
  68. option(MNN_BUILD_PROTOBUFFER "Build with protobuffer in MNN" ON)
  69. option(MNN_BUILD_OPENCV "Build OpenCV api in MNN." OFF)
  70. option(MNN_BUILD_LLM "Build llm library based MNN." OFF)
  71. option(MNN_BUILD_DIFFUSION "Build diffusion demo based MNN." OFF)
  72. option(MNN_INTERNAL "Build with MNN internal features, such as model authentication, metrics logging" OFF)
  73. option(MNN_JNI "Build MNN Jni for java to use" OFF)
  74. option(MNN_SUPPORT_BF16 "Enable MNN's bf16 op" OFF)
  75. option(MNN_LOW_MEMORY "Build MNN support low memory for weight quant model." OFF)
  76. option(MNN_CPU_WEIGHT_DEQUANT_GEMM "Build MNN CPU weight dequant related gemm kernels." OFF)
  77. option(MNN_BUILD_AUDIO "Build audio api in MNN." OFF)
  78. if (MNN_BUILD_MINI)
  79. set(MNN_SKIPBUILD_GEOMETRY ON)
  80. set(MNN_REDUCE_SIZE ON)
  81. endif()
  82. if (MNN_REDUCE_SIZE)
  83. set(MNN_SUPPORT_DEPRECATED_OP OFF)
  84. set(MNN_SUPPORT_DEPRECATED_OPV2 OFF)
  85. set(MNN_SUPPORT_QUANT_EXTEND OFF)
  86. set(MNN_USE_SPARSE_COMPUTE OFF)
  87. endif()
  88. IF (OHOS AND MNN_INTERNAL)
  89. include($ENV{NODE_PATH}/@ali/tcpkg/tcpkg.cmake)
  90. export_headers(DIR ${CMAKE_SOURCE_DIR}/include/MNN)
  91. IF (MNN_BUILD_OPENCV)
  92. export_headers(DIR ${CMAKE_SOURCE_DIR}/tools/cv/include/cv)
  93. ENDIF()
  94. ENDIF()
  95. IF (NOT DEFINED MNN_USE_SPARSE_COMPUTE)
  96. set(MNN_USE_SPARSE_COMPUTE ON)
  97. ENDIF()
  98. IF(NOT MNN_BUILD_SHARED_LIBS AND MNN_SEP_BUILD)
  99. message(WARNING "Close MNN_SEP_BUILD for static library")
  100. SET(MNN_SEP_BUILD OFF CACHE BOOL "<docstring>" FORCE)
  101. ENDIF()
  102. IF(APPLE AND MNN_AAPL_FMWK AND MNN_SEP_BUILD)
  103. message(WARNING "MNN_SEP_BUILD AND MNN_AAPL_FMWK can't coexist. Turning off MNN_SEP_BUILD")
  104. SET(MNN_SEP_BUILD OFF CACHE BOOL "<docstring>" FORCE)
  105. ENDIF()
  106. IF(WIN32)
  107. IF(MNN_SEP_BUILD)
  108. message(WARNING "MNN_SEP_BUILD IS TROUBLESOME ON Windows. Forcing OFF...")
  109. SET(MNN_SEP_BUILD OFF CACHE BOOL "<docstring>" FORCE)
  110. ENDIF()
  111. add_definitions(-D_CRT_SECURE_NO_WARNINGS)
  112. IF(MSVC)
  113. # generate optimized (release) exe and library with pdb debug file, https://stackoverflow.com/a/31264946
  114. SET(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF")
  115. SET(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF")
  116. SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /Zi")
  117. SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi")
  118. SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4267 /wd4018 /wd4251 /wd4996 /wd4244 /wd4146 /wd4129 /wd4305 /wd4275 /wd4101")
  119. SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4267 /wd4018 /wd4251 /wd4996 /wd4244 /wd4146 /wd4129 /wd4305 /wd4275 /wd4101")
  120. ENDIF()
  121. ENDIF()
  122. # for coverage test
  123. IF( MNN_ENABLE_COVERAGE)
  124. SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
  125. SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage")
  126. ENDIF()
  127. if ((CMAKE_SYSTEM_NAME STREQUAL "Darwin") AND CMAKE_OSX_ARCHITECTURES)
  128. set(CMAKE_SYSTEM_PROCESSOR ${CMAKE_OSX_ARCHITECTURES})
  129. endif()
  130. # do this before protobuf, make sure wincrt config of protobuf and MNN is same
  131. if(MSVC)
  132. # same as protobuf, otherwise config is inconsistent
  133. if(CMAKE_VERSION VERSION_GREATER 3.15 OR CMAKE_VERSION VERSION_EQUAL 3.15)
  134. set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded$<$<CONFIG:Debug>:Debug>)
  135. if(NOT MNN_WIN_RUNTIME_MT)
  136. set(CMAKE_MSVC_RUNTIME_LIBRARY ${CMAKE_MSVC_RUNTIME_LIBRARY}DLL)
  137. endif()
  138. else()
  139. foreach(flag_var
  140. CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
  141. CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
  142. CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
  143. CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
  144. if (MNN_WIN_RUNTIME_MT)
  145. if(${flag_var} MATCHES "/MD")
  146. string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
  147. endif()
  148. else ()
  149. if(${flag_var} MATCHES "/MT")
  150. string(REGEX REPLACE "/MT" "/MD" ${flag_var} "${${flag_var}}")
  151. endif()
  152. endif ()
  153. endforeach()
  154. endif()
  155. set(protobuf_BUILD_SHARED_LIBS ${MNN_BUILD_SHARED_LIBS})
  156. endif()
  157. include(${CMAKE_CURRENT_LIST_DIR}/cmake/macros.cmake)
  158. IF(MNN_BUILD_PROTOBUFFER)
  159. IF(MNN_BUILD_CONVERTER)
  160. IF(MSVC)
  161. set(protobuf_BUILD_SHARED_LIBS ${MNN_BUILD_SHARED_LIBS})
  162. IF((NOT MNN_BUILD_SHARED_LIBS) AND (NOT MNN_WIN_RUNTIME_MT))
  163. message(FATAL_ERROR "When MNN_BUILD_CONVERTER=ON and MNN_BUILD_SHARED_LIBS=OFF, MNN_WIN_RUNTIME_MT must be ON. Because protobuf not support the config(static /MD)")
  164. ENDIF()
  165. ENDIF()
  166. add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/3rd_party/protobuf/cmake)
  167. ENDIF()
  168. ENDIF()
  169. # specify source file encoding explicitly, fix cross-platform garbled output issue
  170. # we need do this after protobuf which set different execution-charset
  171. IF(MSVC)
  172. set(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS} /source-charset:utf-8")
  173. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /source-charset:utf-8")
  174. ENDIF()
  175. IF(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND NOT MNN_BUILD_SHARED_LIBS AND NOT (MSVC OR WIN32))
  176. SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
  177. SET(MNN_SEP_BUILD OFF CACHE BOOL "<docstring>" FORCE)
  178. ENDIF()
  179. if(MNN_FORBID_MULTI_THREAD)
  180. add_definitions(-DMNN_FORBIT_MULTI_THREADS)
  181. endif()
  182. if(MNN_SUPPORT_DEPRECATED_OP)
  183. add_definitions(-DMNN_SUPPORT_DEPRECATED_OP)
  184. endif()
  185. if(MNN_SUPPORT_DEPRECATED_OPV2)
  186. add_definitions(-DMNN_SUPPORT_DEPRECATED_OPV2)
  187. endif()
  188. if (MNN_REDUCE_SIZE)
  189. add_definitions(-DMNN_REDUCE_SIZE)
  190. endif()
  191. if(MNN_SUPPORT_QUANT_EXTEND)
  192. add_definitions(-DMNN_SUPPORT_QUANT_EXTEND)
  193. endif()
  194. if(MNN_LOW_MEMORY)
  195. add_definitions(-DMNN_LOW_MEMORY)
  196. endif()
  197. if(MNN_SUPPORT_RENDER)
  198. add_definitions(-DMNN_SUPPORT_RENDER)
  199. endif()
  200. if(MNN_SUPPORT_TRANSFORMER_FUSE)
  201. add_definitions(-DMNN_SUPPORT_TRANSFORMER_FUSE)
  202. endif()
  203. # debug options
  204. if(MNN_DEBUG_MEMORY)
  205. add_definitions(-DMNN_DEBUG_MEMORY)
  206. endif()
  207. if(MNN_DEBUG_TENSOR_SIZE)
  208. add_definitions(-DMNN_DEBUG_TENSOR_SIZE)
  209. endif()
  210. if(MNN_GPU_TRACE)
  211. add_definitions(-DMNN_GPU_FORCE_FINISH)
  212. endif()
  213. # backend options
  214. option(MNN_METAL "Enable Metal" OFF)
  215. option(MNN_OPENCL "Enable OpenCL" OFF)
  216. option(MNN_OPENGL "Enable OpenGL" OFF)
  217. option(MNN_VULKAN "Enable Vulkan" OFF)
  218. option(MNN_ARM82 "Enable ARMv8.2's FP16 Compute" ON)
  219. option(MNN_SUPPORT_FP16_ARMV7 "Enable ARMv8.2's FP16 Compute for armv7 arch, may cause library not valid for 32 bit cpu" OFF)
  220. option(MNN_KLEIDIAI "Enable KLEIDIAI" OFF)
  221. option(MNN_ONEDNN "Enable oneDNN" OFF)
  222. option(MNN_AVX2 "Open AVX2 Compile for x86 if possible" ON)
  223. option(MNN_AVX512 "Enable AVX512" OFF)
  224. option(MNN_CUDA "Enable CUDA" OFF)
  225. option(MNN_TENSORRT "Enable TensorRT" OFF)
  226. option(MNN_COREML "Enable CoreML" OFF)
  227. option(MNN_NNAPI "Enable NNAPI" OFF)
  228. option(MNN_GPU_TIME_PROFILE "Enable time profiling for the OpenCL backend and Vulkan backend." OFF)
  229. option(MNN_CUDA_PROFILE "Enable CUDA profile" OFF)
  230. if (NOT MNN_CUDA OR NOT CMAKE_SYSTEM_NAME MATCHES "^Linux")
  231. set(MNN_CUDA_PROFILE OFF)
  232. endif()
  233. if (MNN_USE_THREAD_POOL)
  234. message(STATUS "Use Threadpool, forbid openmp")
  235. set(MNN_OPENMP OFF)
  236. add_definitions(-DMNN_USE_THREAD_POOL)
  237. endif()
  238. # When build Android based on arm32 by MTL, force turn off MNN_ARM82
  239. if(CMAKE_SYSTEM_PROCESSOR MATCHES "^armv7" OR ARCHS MATCHES "^armv7(;armv7s)?")
  240. if (NOT MNN_SUPPORT_FP16_ARMV7)
  241. message(STATUS "force turn off MNN_ARM82 when build for Android based on arm32 by MTL")
  242. SET(MNN_ARM82 OFF CACHE BOOL "Enable ARM82" FORCE)
  243. endif()
  244. endif()
  245. # target options
  246. option(MNN_BUILD_BENCHMARK "Build benchmark or not" OFF)
  247. option(MNN_BUILD_TEST "Build tests or not" OFF)
  248. option(MNN_BUILD_FOR_ANDROID_COMMAND "Build from command" OFF)
  249. option(MNN_USE_LOGCAT "Use Logcat intead of print for info" ON)
  250. set (MNN_HIDDEN FALSE)
  251. IF(CMAKE_BUILD_TYPE MATCHES Debug)
  252. ELSE()
  253. set(MNN_HIDDEN TRUE)
  254. ENDIF(CMAKE_BUILD_TYPE MATCHES Debug)
  255. message(STATUS ">>>>>>>>>>>>>")
  256. message(STATUS "MNN BUILD INFO:")
  257. message(STATUS "\tSystem: ${CMAKE_SYSTEM_NAME}")
  258. message(STATUS "\tProcessor: ${CMAKE_SYSTEM_PROCESSOR}")
  259. message(STATUS "\tVersion: ${MNN_VERSION}")
  260. message(STATUS "\tMetal: ${MNN_METAL}")
  261. message(STATUS "\tOpenCL: ${MNN_OPENCL}")
  262. message(STATUS "\tOpenGL: ${MNN_OPENGL}")
  263. message(STATUS "\tVulkan: ${MNN_VULKAN}")
  264. message(STATUS "\tARM82: ${MNN_ARM82}")
  265. message(STATUS "\tKleidiAI: ${MNN_KLEIDIAI}")
  266. message(STATUS "\toneDNN: ${MNN_ONEDNN}")
  267. message(STATUS "\tTensorRT: ${MNN_TENSORRT}")
  268. message(STATUS "\tCoreML: ${MNN_COREML}")
  269. message(STATUS "\tNNAPI: ${MNN_NNAPI}")
  270. message(STATUS "\tCUDA: ${MNN_CUDA}")
  271. message(STATUS "\tOpenMP: ${MNN_OPENMP}")
  272. message(STATUS "\tBF16: ${MNN_SUPPORT_BF16}")
  273. message(STATUS "\tThreadPool: ${MNN_USE_THREAD_POOL}")
  274. message(STATUS "\tHidden: ${MNN_HIDDEN}")
  275. message(STATUS "\tBuild Path: ${CMAKE_CURRENT_BINARY_DIR}")
  276. message(STATUS "\tCUDA PROFILE: ${MNN_CUDA_PROFILE}")
  277. if(CMAKE_SYSTEM_NAME MATCHES "^Android" OR CMAKE_SYSTEM_NAME MATCHES "^Linux")
  278. add_definitions(-fPIC)
  279. endif()
  280. # Raspberry Pi 32-bit fix
  281. if(CMAKE_SYSTEM_NAME MATCHES "^Linux" AND CMAKE_SYSTEM_PROCESSOR MATCHES "^armv7")
  282. add_definitions(-march=armv7-a -mfpu=neon-vfpv4)
  283. endif()
  284. if(CMAKE_SYSTEM_NAME MATCHES "^Android")
  285. add_definitions(-DMNN_BUILD_FOR_ANDROID)
  286. if(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm")
  287. add_definitions(-mfloat-abi=softfp -mfpu=neon)
  288. endif()
  289. endif()
  290. option(MNN_USE_CPP11 "Enable MNN use c++11" ON)
  291. if (NOT MSVC)
  292. if((MNN_CUDA AND MNN_SUPPORT_TRANSFORMER_FUSE) OR (CMAKE_CXX_STANDARD EQUAL 17))
  293. set(CMAKE_CXX_STANDARD 17)
  294. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99")
  295. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
  296. elseif(MNN_USE_CPP11)
  297. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99")
  298. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
  299. else()
  300. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99")
  301. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
  302. endif()
  303. endif()
  304. if(CMAKE_SYSTEM_NAME MATCHES "^Linux")
  305. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__STRICT_ANSI__")
  306. if(CMAKE_SYSTEM_PROCESSOR MATCHES "^armv7")
  307. add_definitions(-mfpu=neon) #please define in project/cross-compile/arm.toolchain.cmake
  308. endif()
  309. if(MNN_BUILD_HARD)
  310. add_definitions(-mfloat-abi=hard) #better define in project/cross-compile/arm.toolchain.cmake
  311. endif()
  312. endif()
  313. IF(MNN_DEBUG_MEMORY)
  314. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
  315. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")
  316. endif()
  317. set(MNN_DEPS "")
  318. set(MNN_EXTRA_DEPENDS "")
  319. IF(CMAKE_BUILD_TYPE MATCHES Debug)
  320. add_definitions(-DMNN_DEBUG -DDEBUG)
  321. if(MSVC)
  322. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /DEBUG")
  323. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /DEBUG")
  324. else()
  325. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g")
  326. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
  327. endif()
  328. else()
  329. if (MSVC)
  330. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /O2")
  331. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /O2")
  332. else()
  333. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3")
  334. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3")
  335. if(CMAKE_SYSTEM_NAME MATCHES "^Android")
  336. if(MNN_BUILD_FOR_ANDROID_COMMAND)
  337. set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -s")
  338. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pie -fPIE -s")
  339. set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--gc-sections")
  340. endif()
  341. endif()
  342. endif()
  343. ENDIF(CMAKE_BUILD_TYPE MATCHES Debug)
  344. if(OHOS)
  345. IF(MNN_USE_LOGCAT)
  346. add_definitions(-DMNN_USE_LOGCAT)
  347. add_definitions(-Wno-format-security)
  348. list(APPEND MNN_EXTRA_DEPENDS libhilog_ndk.z.so)
  349. ENDIF()
  350. endif()
  351. if(CMAKE_SYSTEM_NAME MATCHES "^Android")
  352. IF(MNN_USE_LOGCAT)
  353. add_definitions(-DMNN_USE_LOGCAT)
  354. ENDIF()
  355. IF (NOT MNN_BUILD_FOR_ANDROID_COMMAND)
  356. set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${NATIVE_LIBRARY_OUTPUT}/${ANDROID_ABI})
  357. ENDIF()
  358. endif()
  359. if(${CMAKE_SYSTEM_NAME} MATCHES "^Linux")
  360. if((CMAKE_SYSTEM_PROCESSOR MATCHES "^arm") OR (CMAKE_SYSTEM_PROCESSOR MATCHES "^aarch64"))
  361. set(aarch64_linux_include
  362. #/usr/include/c++/4.9
  363. #/usr/lib/gcc/x86_64-linux-gnu/4.9
  364. #/usr/lib/gcc/x86_64-linux-gnu/4.9/include
  365. #/usr/include/x86_64-linux-gnu/c++/4.9
  366. )
  367. include_directories(${aarch64_linux_include})
  368. endif()
  369. endif()
  370. include_directories(${CMAKE_CURRENT_LIST_DIR}/include/
  371. ${CMAKE_CURRENT_LIST_DIR}/source/
  372. ${CMAKE_CURRENT_LIST_DIR}/express/
  373. ${CMAKE_CURRENT_LIST_DIR}/tools/
  374. ${CMAKE_CURRENT_LIST_DIR}/codegen/
  375. ${CMAKE_CURRENT_LIST_DIR}/schema/current/
  376. ${CMAKE_CURRENT_LIST_DIR}/3rd_party/
  377. ${CMAKE_CURRENT_LIST_DIR}/3rd_party/flatbuffers/include
  378. ${CMAKE_CURRENT_LIST_DIR}/3rd_party/half
  379. ${CMAKE_CURRENT_LIST_DIR}/3rd_party/imageHelper
  380. ${CMAKE_CURRENT_LIST_DIR}/3rd_party/OpenCLHeaders/
  381. )
  382. list(APPEND MNN_INCLUDES
  383. ${CMAKE_CURRENT_LIST_DIR}/include/
  384. ${CMAKE_CURRENT_LIST_DIR}/source/
  385. ${CMAKE_CURRENT_LIST_DIR}/express/
  386. ${CMAKE_CURRENT_LIST_DIR}/tools/
  387. ${CMAKE_CURRENT_LIST_DIR}/codegen/
  388. ${CMAKE_CURRENT_LIST_DIR}/schema/current/
  389. ${CMAKE_CURRENT_LIST_DIR}/3rd_party/
  390. ${CMAKE_CURRENT_LIST_DIR}/3rd_party/flatbuffers/include
  391. ${CMAKE_CURRENT_LIST_DIR}/3rd_party/half
  392. ${CMAKE_CURRENT_LIST_DIR}/3rd_party/imageHelper
  393. ${CMAKE_CURRENT_LIST_DIR}/3rd_party/OpenCLHeaders/
  394. )
  395. include_directories(${MNN_INCLUDES})
  396. set(MNN_OBJECTS_TO_LINK "")
  397. set(MNN_TARGETS "")
  398. # Core
  399. FILE(GLOB MNN_Core_SRC ${CMAKE_CURRENT_LIST_DIR}/source/core/*)
  400. add_library(MNNCore OBJECT ${MNN_Core_SRC})
  401. list(APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:MNNCore>)
  402. list(APPEND MNN_TARGETS MNNCore)
  403. if(MNN_SKIPBUILD_GEOMETRY)
  404. target_compile_options(MNNCore PRIVATE -DMNN_SKIPBUILD_GEOMETRY)
  405. endif()
  406. # CV
  407. FILE(GLOB MNN_CV_SRC ${CMAKE_CURRENT_LIST_DIR}/source/cv/*)
  408. add_library(MNNCV OBJECT ${MNN_CV_SRC})
  409. list(APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:MNNCV>)
  410. list(APPEND MNN_TARGETS MNNCV)
  411. if(CMAKE_SYSTEM_PROCESSOR MATCHES "(x86_64)|(X86_64)|(x64)|(X64)|(amd64)|(AMD64)|(i686)")
  412. if (APPLE)
  413. add_definitions(-fno-stack-check) # Workaround a Xcode 11.X bug
  414. endif()
  415. endif()
  416. # Math
  417. FILE(GLOB MNN_Math_SRC ${CMAKE_CURRENT_LIST_DIR}/source/math/*)
  418. add_library(MNNMath OBJECT ${MNN_Math_SRC})
  419. list(APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:MNNMath>)
  420. list(APPEND MNN_TARGETS MNNMath)
  421. # Transform
  422. IF (NOT MNN_SKIPBUILD_GEOMETRY)
  423. FILE(GLOB_RECURSE MNN_Transform_SRC ${CMAKE_CURRENT_LIST_DIR}/source/shape/* ${CMAKE_CURRENT_LIST_DIR}/source/geometry/*)
  424. add_library(MNNTransform OBJECT ${MNN_Transform_SRC})
  425. list(APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:MNNTransform>)
  426. list(APPEND MNN_TARGETS MNNTransform)
  427. ENDIF()
  428. # Utils
  429. FILE(GLOB MNN_Utils_SRC ${CMAKE_CURRENT_LIST_DIR}/source/utils/*)
  430. add_library(MNNUtils OBJECT ${MNN_Utils_SRC})
  431. list(APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:MNNUtils>)
  432. list(APPEND MNN_TARGETS MNNUtils)
  433. include(${CMAKE_CURRENT_LIST_DIR}/source/backend/cpu/CMakeLists.txt)
  434. SET(MNN_PUB_HDRS "")
  435. SET(MNN_EXPR_PUB_HDRS "")
  436. set(MNN_EXTRA_HEADERS "")
  437. list(APPEND MNN_PUB_HDRS "${CMAKE_CURRENT_SOURCE_DIR}/include/MNN/MNNDefine.h")
  438. list(APPEND MNN_PUB_HDRS "${CMAKE_CURRENT_SOURCE_DIR}/include/MNN/Interpreter.hpp")
  439. list(APPEND MNN_PUB_HDRS "${CMAKE_CURRENT_SOURCE_DIR}/include/MNN/HalideRuntime.h")
  440. list(APPEND MNN_PUB_HDRS "${CMAKE_CURRENT_SOURCE_DIR}/include/MNN/Tensor.hpp")
  441. list(APPEND MNN_PUB_HDRS "${CMAKE_CURRENT_SOURCE_DIR}/include/MNN/ErrorCode.hpp")
  442. list(APPEND MNN_PUB_HDRS "${CMAKE_CURRENT_SOURCE_DIR}/include/MNN/ImageProcess.hpp")
  443. list(APPEND MNN_PUB_HDRS "${CMAKE_CURRENT_SOURCE_DIR}/include/MNN/Matrix.h")
  444. list(APPEND MNN_PUB_HDRS "${CMAKE_CURRENT_SOURCE_DIR}/include/MNN/Rect.h")
  445. list(APPEND MNN_PUB_HDRS "${CMAKE_CURRENT_SOURCE_DIR}/include/MNN/MNNForwardType.h")
  446. list(APPEND MNN_PUB_HDRS "${CMAKE_CURRENT_SOURCE_DIR}/include/MNN/AutoTime.hpp")
  447. list(APPEND MNN_PUB_HDRS "${CMAKE_CURRENT_SOURCE_DIR}/include/MNN/MNNSharedContext.h")
  448. list(APPEND MNN_EXPR_PUB_HDRS "${CMAKE_CURRENT_SOURCE_DIR}/include/MNN/expr/Expr.hpp")
  449. list(APPEND MNN_EXPR_PUB_HDRS "${CMAKE_CURRENT_SOURCE_DIR}/include/MNN/expr/ExprCreator.hpp")
  450. list(APPEND MNN_EXPR_PUB_HDRS "${CMAKE_CURRENT_SOURCE_DIR}/include/MNN/expr/MathOp.hpp")
  451. list(APPEND MNN_EXPR_PUB_HDRS "${CMAKE_CURRENT_SOURCE_DIR}/include/MNN/expr/NeuralNetWorkOp.hpp")
  452. list(APPEND MNN_EXPR_PUB_HDRS "${CMAKE_CURRENT_SOURCE_DIR}/include/MNN/expr/Optimizer.hpp")
  453. list(APPEND MNN_EXPR_PUB_HDRS "${CMAKE_CURRENT_SOURCE_DIR}/include/MNN/expr/Executor.hpp")
  454. list(APPEND MNN_EXPR_PUB_HDRS "${CMAKE_CURRENT_SOURCE_DIR}/include/MNN/expr/Module.hpp")
  455. list(APPEND MNN_EXPR_PUB_HDRS "${CMAKE_CURRENT_SOURCE_DIR}/include/MNN/expr/NeuralNetWorkOp.hpp")
  456. list(APPEND MNN_EXPR_PUB_HDRS "${CMAKE_CURRENT_SOURCE_DIR}/include/MNN/expr/ExecutorScope.hpp")
  457. list(APPEND MNN_EXPR_PUB_HDRS "${CMAKE_CURRENT_SOURCE_DIR}/include/MNN/expr/Scope.hpp")
  458. # Add Extra Header
  459. IF(MNN_BUILD_OPENCV)
  460. file(GLOB MNN_CV_HDRS ${CMAKE_CURRENT_SOURCE_DIR}/tools/cv/include/cv/*.hpp PARENT_SCOPE)
  461. file(GLOB MNN_CV_IMGHDRS ${CMAKE_CURRENT_SOURCE_DIR}/tools/cv/include/cv/imgproc/*.hpp PARENT_SCOPE)
  462. list(APPEND MNN_EXTRA_HEADERS ${MNN_CV_HDRS})
  463. list(APPEND MNN_EXTRA_HEADERS ${MNN_CV_IMGHDRS})
  464. ENDIF()
  465. IF(MNN_BUILD_AUDIO)
  466. file(GLOB MNN_AUDIO_HDRS ${CMAKE_CURRENT_SOURCE_DIR}/tools/audio/include/audio/*.hpp PARENT_SCOPE)
  467. list(APPEND MNN_EXTRA_HEADERS ${MNN_AUDIO_HDRS})
  468. ENDIF()
  469. IF(MNN_BUILD_LLM)
  470. file(GLOB MNN_LLM_HDRS ${CMAKE_CURRENT_SOURCE_DIR}/transformers/llm/engine/include/llm/*)
  471. list(APPEND MNN_EXTRA_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/transformers/llm/engine/include/llm/llm.hpp)
  472. ENDIF()
  473. IF(MNN_BUILD_DIFFUSION)
  474. file(GLOB MNN_DIFFUSION_HDRS ${CMAKE_CURRENT_SOURCE_DIR}/transformers/diffusion/engine/include/diffusion/*)
  475. list(APPEND MNN_EXTRA_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/transformers/diffusion/engine/include/diffusion/diffusion.hpp)
  476. ENDIF()
  477. # Add Thread dependency
  478. find_package(Threads)
  479. list(APPEND MNN_EXTRA_DEPENDS ${CMAKE_THREAD_LIBS_INIT})
  480. if(WIN32)
  481. if(NOT MSVC)
  482. set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fuse-ld=lld-link -lmsvcrt")
  483. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=lld-link -lmsvcrt")
  484. else()
  485. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:8388608")
  486. endif()
  487. endif()
  488. if (NOT APPLE)
  489. if(MNN_OPENMP)
  490. message(STATUS "[*] Checking OpenMP")
  491. find_package(OpenMP)
  492. # For CMake < 3.9, we need to make the target ourselves
  493. if(NOT TARGET OpenMP::OpenMP_CXX)
  494. add_library(OpenMP::OpenMP_CXX IMPORTED INTERFACE)
  495. set_property(TARGET OpenMP::OpenMP_CXX
  496. PROPERTY INTERFACE_COMPILE_OPTIONS ${OpenMP_CXX_FLAGS})
  497. # Only works if the same flag is passed to the linker; use CMake 3.9+ otherwise (Intel, AppleClang)
  498. set_property(TARGET OpenMP::OpenMP_CXX
  499. PROPERTY INTERFACE_LINK_LIBRARIES ${OpenMP_CXX_FLAGS} Threads::Threads)
  500. endif()
  501. # TODO: Don't pollute global CFLAGS
  502. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
  503. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
  504. set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${OpenMP_SHARED_LINKER_FLAGS}")
  505. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
  506. if (MSVC)
  507. set(OpenMP_C_FLAGS "/openmp ${OpenMP_C_FLAGS}")
  508. set(OpenMP_CXX_FLAGS "/openmp ${OpenMP_CXX_FLAGS}")
  509. endif()
  510. list(APPEND MNN_EXTRA_DEPENDS OpenMP::OpenMP_CXX)
  511. endif()
  512. endif()
  513. if ((NOT MSVC) AND MNN_HIDDEN)
  514. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility-inlines-hidden -fvisibility=hidden")
  515. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
  516. set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -fvisibility=hidden")
  517. # Omit frame pointer may cause difficult debug
  518. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fomit-frame-pointer")
  519. endif()
  520. if (NOT MSVC)
  521. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstrict-aliasing -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions ")
  522. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstrict-aliasing -ffunction-sections -fdata-sections ")
  523. else()
  524. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /fp:precise")
  525. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /fp:precise")
  526. endif()
  527. # Metal
  528. list(APPEND MNN_DEPS MNN)
  529. # Plugin
  530. if(MNN_WITH_PLUGIN)
  531. add_definitions(-DMNN_WITH_PLUGIN)
  532. include(${CMAKE_CURRENT_LIST_DIR}/source/plugin/CMakeLists.txt)
  533. endif()
  534. # Metal
  535. if(MNN_METAL AND APPLE)
  536. target_compile_options(MNNCore PRIVATE -DMNN_METAL_ENABLED=1)
  537. include(${CMAKE_CURRENT_LIST_DIR}/source/backend/metal/CMakeLists.txt)
  538. list(APPEND MNN_TARGETS MNNMetal)
  539. list(APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:MNNMetal>)
  540. endif()
  541. # CoreML
  542. IF(MNN_COREML)
  543. add_definitions(-DMNN_COREML_ENABLED=1)
  544. include(${CMAKE_CURRENT_LIST_DIR}/source/backend/coreml/CMakeLists.txt)
  545. list(APPEND MNN_TARGETS MNNCoreML)
  546. list(APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:MNNCoreML>)
  547. find_library(COREML CoreML)
  548. find_library(FOUNDATION Foundation)
  549. find_library(METAL Metal)
  550. find_library(VIDEO CoreVideo)
  551. list(APPEND MNN_EXTRA_DEPENDS ${COREML})
  552. list(APPEND MNN_EXTRA_DEPENDS ${FOUNDATION})
  553. list(APPEND MNN_EXTRA_DEPENDS ${METAL})
  554. list(APPEND MNN_EXTRA_DEPENDS ${VIDEO})
  555. ENDIF()
  556. # NNAPI
  557. IF(MNN_NNAPI)
  558. add_definitions(-DMNN_NNAPI_ENABLED=1)
  559. add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/source/backend/nnapi/)
  560. list(APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:MNN_NNAPI>)
  561. ENDIF()
  562. # QNN
  563. IF(MNN_QNN)
  564. add_definitions(-DMNN_QNN_ENABLED=1)
  565. add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/source/backend/qnn/)
  566. list(APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:MNN_QNN>)
  567. ENDIF()
  568. # Vulkan
  569. IF(MNN_VULKAN)
  570. add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/source/backend/vulkan/)
  571. IF(MNN_SEP_BUILD)
  572. list(APPEND MNN_DEPS MNN_Vulkan)
  573. ELSE()
  574. list(APPEND MNN_TARGETS MNN_Vulkan)
  575. list(APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:MNN_Vulkan>)
  576. list(APPEND MNN_EXTRA_DEPENDS ${MNN_VULKAN_LIBS})
  577. ENDIF()
  578. ENDIF()
  579. # oneDNN
  580. IF(MNN_ONEDNN)
  581. target_compile_definitions(MNNCPU PRIVATE "-DMNN_USE_ONEDNN")
  582. add_dependencies(MNNCPU oneDNN)
  583. include(cmake/oneDNN.cmake)
  584. set(ONEDNN_DIR ${CMAKE_CURRENT_LIST_DIR}/3rd_party/oneDNN)
  585. add_library(ONEDNN_COMMON OBJECT IMPORTED)
  586. file(GLOB_RECURSE OBJECT_FILES ${ONEDNN_DIR}/src/common/CMakeFiles/dnnl_common.dir/*.o)
  587. set_property(TARGET ONEDNN_COMMON PROPERTY IMPORTED_OBJECTS ${OBJECT_FILES})
  588. add_library(ONEDNN_CPU OBJECT IMPORTED)
  589. file(GLOB_RECURSE OBJECT_FILES ${ONEDNN_DIR}/src/cpu/CMakeFiles/dnnl_cpu.dir/*.o)
  590. set_property(TARGET ONEDNN_CPU PROPERTY IMPORTED_OBJECTS ${OBJECT_FILES})
  591. add_library(ONEDNN_CPU_X64 OBJECT IMPORTED)
  592. file(GLOB_RECURSE OBJECT_FILES ${ONEDNN_DIR}/src/cpu/x64/CMakeFiles/dnnl_cpu_x64.dir/*.o)
  593. set_property(TARGET ONEDNN_CPU_X64 PROPERTY IMPORTED_OBJECTS ${OBJECT_FILES})
  594. include_directories(${ONEDNN_DIR}/include)
  595. list(APPEND MNN_TARGETS ${ONEDNN_COMMON})
  596. list(APPEND MNN_TARGETS ${ONEDNN_CPU})
  597. list(APPEND MNN_TARGETS ${ONEDNN_CPU_X64})
  598. list(APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:ONEDNN_COMMON>)
  599. list(APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:ONEDNN_CPU>)
  600. list(APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:ONEDNN_CPU_X64>)
  601. ENDIF()
  602. # OpenCL
  603. IF(MNN_OPENCL)
  604. add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/source/backend/opencl/)
  605. IF(MNN_SEP_BUILD)
  606. list(APPEND MNN_DEPS MNN_CL)
  607. ELSE()
  608. add_definitions(-DMNN_OPENCL_ENABLED=1)
  609. list(APPEND MNN_TARGETS MNN_CL)
  610. list(APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:MNN_CL>)
  611. list(APPEND MNN_EXTRA_DEPENDS ${MNN_OCL_LIBS})
  612. ENDIF()
  613. ENDIF()
  614. # OpenGL
  615. IF(MNN_OPENGL)
  616. add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/source/backend/opengl/)
  617. IF(MNN_SEP_BUILD)
  618. list(APPEND MNN_DEPS MNN_GL)
  619. ELSE()
  620. list(APPEND MNN_TARGETS MNN_GL)
  621. list(APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:MNN_GL>)
  622. list(APPEND MNN_EXTRA_DEPENDS GLESv3)
  623. list(APPEND MNN_EXTRA_DEPENDS EGL)
  624. ENDIF()
  625. ENDIF()
  626. # CUDA
  627. IF(MNN_CUDA)
  628. add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/source/backend/cuda/)
  629. list(APPEND MNN_TARGETS MNN_CUDA)
  630. if (NOT MSVC)
  631. list(APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:MNN_CUDA>)
  632. endif()
  633. list(APPEND MNN_EXTRA_DEPENDS ${MNN_CUDA_LIBS})
  634. ENDIF()
  635. # Express
  636. if(NOT MNN_SKIPBUILD_GEOMETRY)
  637. add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/express/)
  638. IF(MNN_SEP_BUILD)
  639. list(APPEND MNN_DEPS MNN_Express)
  640. ELSE()
  641. list(APPEND MNN_TARGETS MNN_Express)
  642. list(APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:MNN_Express>)
  643. ENDIF()
  644. endif()
  645. # Model Internal. Enable MNN internal features such as model authentication and metrics logging.
  646. if (MNN_INTERNAL AND NOT OHOS) # TODO: support OHOS logging
  647. target_compile_options(MNNCore PRIVATE -DMNN_INTERNAL_ENABLED)
  648. target_compile_options(MNN_Express PRIVATE -DMNN_INTERNAL_ENABLED)
  649. include(${CMAKE_CURRENT_LIST_DIR}/source/internal/logging/CMakeLists.txt)
  650. if(CMAKE_SYSTEM_NAME MATCHES "^Linux")
  651. list(APPEND MNN_EXTRA_DEPENDS "-lcurl -lssl -lcrypto")
  652. endif()
  653. endif()
  654. # Train
  655. IF(MNN_BUILD_TRAIN OR MNN_BUILD_QUANTOOLS)
  656. add_subdirectory(tools/train)
  657. IF(MNN_SEP_BUILD)
  658. list(APPEND MNN_DEPS MNNTrain)
  659. list(APPEND MNN_DEPS MNNTrainUtils)
  660. ELSE()
  661. list(APPEND MNN_TARGETS MNNTrain)
  662. list(APPEND MNN_TARGETS MNNTrainUtils)
  663. list(APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:MNNTrain>)
  664. list(APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:MNNTrainUtils>)
  665. ENDIF()
  666. ENDIF()
  667. #CodeGen
  668. IF(MNN_BUILD_CODEGEN)
  669. add_definitions(-DMNN_BUILD_CODEGEN)
  670. include(${CMAKE_CURRENT_LIST_DIR}/codegen/CMakeLists.txt)
  671. ENDIF()
  672. # NPU
  673. IF(MNN_NPU)
  674. if (CMAKE_SYSTEM_NAME MATCHES "^Android")
  675. set(HIAI_PATH ${ANDROID_ABI})
  676. endif()
  677. if (OHOS)
  678. set(HIAI_PATH ${OHOS_ARCH})
  679. endif()
  680. add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/source/backend/hiai/)
  681. IF(MNN_SEP_BUILD)
  682. list(APPEND MNN_DEPS MNN_NPU)
  683. ELSE()
  684. list(APPEND MNN_TARGETS MNN_NPU)
  685. list(APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:MNN_NPU>)
  686. list(APPEND MNN_EXTRA_DEPENDS ${CMAKE_CURRENT_LIST_DIR}/source/backend/hiai/3rdParty/${HIAI_PATH}/libhiai.so)
  687. list(APPEND MNN_EXTRA_DEPENDS ${CMAKE_CURRENT_LIST_DIR}/source/backend/hiai/3rdParty/${HIAI_PATH}/libhiai_ir_build.so)
  688. list(APPEND MNN_EXTRA_DEPENDS ${CMAKE_CURRENT_LIST_DIR}/source/backend/hiai/3rdParty/${HIAI_PATH}/libhiai_ir.so)
  689. ENDIF()
  690. ENDIF()
  691. # TensorRT
  692. IF(MNN_TENSORRT)
  693. add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/source/backend/tensorrt/)
  694. list(APPEND MNN_TARGETS MNN_TRT)
  695. list(APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:MNN_TRT>)
  696. list(APPEND MNN_EXTRA_DEPENDS ${MNN_TRT_LIBS})
  697. ENDIF()
  698. IF(MNN_BUILD_OPENCV)
  699. add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/tools/cv)
  700. IF(MNN_SEP_BUILD)
  701. list(APPEND MNN_DEPS MNNOpenCV)
  702. ELSE()
  703. list(APPEND MNN_TARGETS MNNOpenCV)
  704. list(APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:MNNOpenCV>)
  705. ENDIF()
  706. ENDIF()
  707. IF(MNN_BUILD_LLM)
  708. # add_definitions(-DMNN_BUILD_LLM)
  709. include(${CMAKE_CURRENT_LIST_DIR}/transformers/llm/engine/CMakeLists.txt)
  710. IF(NOT MNN_SEP_BUILD)
  711. list(APPEND MNN_TARGETS llm)
  712. list(APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:llm>)
  713. ENDIF()
  714. ENDIF()
  715. IF(MNN_BUILD_DIFFUSION AND MNN_BUILD_OPENCV AND MNN_IMGCODECS)
  716. include(${CMAKE_CURRENT_LIST_DIR}/transformers/diffusion/engine/CMakeLists.txt)
  717. IF(NOT MNN_SEP_BUILD)
  718. list(APPEND MNN_TARGETS diffusion)
  719. list(APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:diffusion>)
  720. ENDIF()
  721. ENDIF()
  722. IF(MNN_SEP_BUILD)
  723. add_library(MNN SHARED ${CMAKE_CURRENT_LIST_DIR}/cmake/dummy.cpp ${MNN_OBJECTS_TO_LINK} ${MNN_PUB_HDRS} ${MNN_EXPR_PUB_HDRS} ${MNN_EXTRA_HEADERS})
  724. target_link_libraries(MNN PUBLIC ${MNN_EXTRA_DEPENDS})
  725. ELSE()
  726. IF(MNN_BUILD_SHARED_LIBS)
  727. add_library(MNN SHARED ${CMAKE_CURRENT_LIST_DIR}/cmake/dummy.cpp ${MNN_OBJECTS_TO_LINK} ${MNN_PUB_HDRS} ${MNN_EXPR_PUB_HDRS} ${MNN_EXTRA_HEADERS})
  728. if (WIN32)
  729. foreach(TARGET ${MNN_TARGETS})
  730. target_compile_definitions(${TARGET} PRIVATE "-DBUILDING_MNN_DLL")
  731. target_compile_definitions(${TARGET} INTERFACE "-DUSING_MNN_DLL")
  732. endforeach()
  733. target_compile_definitions(MNN PRIVATE "-DBUILDING_MNN_DLL")
  734. target_compile_definitions(MNN INTERFACE "-DUSING_MNN_DLL")
  735. endif()
  736. ELSE()
  737. add_library(MNN STATIC ${CMAKE_CURRENT_LIST_DIR}/cmake/dummy.cpp ${MNN_OBJECTS_TO_LINK} ${MNN_PUB_HDRS} ${MNN_EXPR_PUB_HDRS} ${MNN_EXTRA_HEADERS})
  738. ENDIF()
  739. target_link_libraries(MNN PUBLIC ${MNN_EXTRA_DEPENDS})
  740. ENDIF()
  741. if (MSVC)
  742. target_link_options(MNN PRIVATE "/IGNORE:4049,4217")
  743. if (MNN_CUDA)
  744. if (MNN_BUILD_SHARED_LIBS)
  745. target_link_options(MNN PRIVATE "/WHOLEARCHIVE:$<TARGET_FILE:MNN_CUDA>")
  746. else()
  747. add_custom_command(
  748. TARGET MNN
  749. POST_BUILD
  750. COMMAND lib.exe ARGS /OUT:$<TARGET_FILE:MNN> $<TARGET_FILE:MNN> $<TARGET_FILE:MNN_CUDA>
  751. )
  752. endif()
  753. endif()
  754. endif()
  755. if (MNN_ONEDNN)
  756. add_dependencies(MNN ONEDNN_COMMON ONEDNN_CPU ONEDNN_CPU_X64)
  757. endif()
  758. if(APPLE)
  759. IF(MNN_AAPL_FMWK)
  760. set_target_properties(MNN PROPERTIES FRAMEWORK TRUE)
  761. set_target_properties(MNN PROPERTIES
  762. MACOSX_FRAMEWORK_IDENTIFIER com.alibaba.MNN
  763. MACOSX_FRAMEWORK_SHORT_VERSION_STRING ${MNN_VERSION}
  764. MACOSX_FRAMEWORK_BUNDLE_VERSION ${MNN_VERSION}
  765. XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer"
  766. )
  767. ENDIF()
  768. IF(MNN_METAL)
  769. find_library(FOUNDATION Foundation REQUIRED)
  770. target_link_libraries(MNN PUBLIC ${FOUNDATION})
  771. find_library(METAL Metal REQUIRED)
  772. target_link_libraries(MNN PUBLIC ${METAL})
  773. find_library(GRAPHIC CoreGraphics)
  774. target_link_libraries(MNN PUBLIC ${GRAPHIC})
  775. ENDIF()
  776. endif()
  777. if (NOT MNN_SKIPBUILD_GEOMETRY)
  778. add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/tools/converter)
  779. endif()
  780. IF(WIN32 AND MNN_BUILD_CONVERTER AND MNN_BUILD_SHARED_LIBS)
  781. # Because of dllimport/dllexport, we merge MNN and MNNConvertDeps together, which depend protobuf
  782. target_link_libraries(MNN PUBLIC ${Protobuf_LIBRARIES})
  783. ENDIF()
  784. # Merge MNN/MNNExpress/MNNOpenCV and other backends into one .lib/.dll on Windows
  785. add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/tools/audio)
  786. IF(MNN_BUILD_AUDIO AND NOT MNN_SEP_BUILD)
  787. IF(MSVC)
  788. target_compile_definitions(MNNAudio PRIVATE "-DBUILDING_MNN_DLL" INTERFACE "-DUSING_MNN_DLL")
  789. ENDIF()
  790. target_sources(MNN PRIVATE $<TARGET_OBJECTS:MNNAudio>)
  791. ENDIF()
  792. if(CMAKE_SYSTEM_NAME MATCHES "^Linux")
  793. # Using -pthread, needed by thread-safe implemention of glibc, is better than only using -lpthread
  794. # https://stackoverflow.com/questions/23250863/difference-between-pthread-and-lpthread-while-compiling
  795. target_link_libraries(MNN PUBLIC -pthread dl)
  796. elseif(CMAKE_SYSTEM_NAME MATCHES "^Android")
  797. target_link_libraries(MNN PUBLIC log m)
  798. else()
  799. endif()
  800. if (NOT MNN_BUILD_SHARED_LIBS)
  801. if (CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  802. # Static-link will not replace thread-related weak symbol in glibc with strong symbol
  803. # in pthread library, so we need use --whole-archive to pthread
  804. # https://stackoverflow.com/questions/35116327/when-g-static-link-pthread-cause-segmentation-fault-why
  805. if(CMAKE_SYSTEM_NAME MATCHES "^Linux")
  806. set(MNN_DEPS -Wl,--whole-archive ${MNN_DEPS} -lpthread -Wl,--no-whole-archive)
  807. else()
  808. if(APPLE)
  809. set(MNN_DEPS -Wl,-force_load ${MNN_DEPS})
  810. else()
  811. set(MNN_DEPS -Wl,--whole-archive ${MNN_DEPS} -Wl,--no-whole-archive)
  812. endif()
  813. endif()
  814. endif()
  815. endif()
  816. list(APPEND MNN_TARGETS MNN)
  817. list(REMOVE_ITEM MNN_TARGETS MNN)
  818. IF(MNN_BUILD_DEMO)
  819. include(${CMAKE_CURRENT_LIST_DIR}/demo/exec/CMakeLists.txt)
  820. ENDIF()
  821. IF(MNN_BUILD_TOOLS)
  822. include(${CMAKE_CURRENT_LIST_DIR}/tools/cpp/CMakeLists.txt)
  823. ENDIF()
  824. IF(MNN_BUILD_TEST)
  825. include(${CMAKE_CURRENT_LIST_DIR}/test/CMakeLists.txt)
  826. ENDIF()
  827. IF(MNN_BUILD_BENCHMARK)
  828. include(${CMAKE_CURRENT_LIST_DIR}/benchmark/CMakeLists.txt)
  829. ENDIF()
  830. IF(MNN_BUILD_QUANTOOLS)
  831. include(${CMAKE_CURRENT_LIST_DIR}/tools/quantization/CMakeLists.txt)
  832. ENDIF()
  833. IF(MNN_EVALUATION)
  834. include(${CMAKE_CURRENT_LIST_DIR}/tools/evaluation/CMakeLists.txt)
  835. ENDIF()
  836. # Install headers
  837. IF(CMAKE_SYSTEM_NAME MATCHES "^Android" AND NOT MNN_BUILD_FOR_ANDROID_COMMAND)
  838. IF(NOT NATIVE_INCLUDE_OUTPUT)
  839. set(NATIVE_INCLUDE_OUTPUT ".")
  840. ENDIF()
  841. set(MNN_INCLUDE_OUTPUT ${NATIVE_INCLUDE_OUTPUT}/MNN)
  842. add_custom_command(
  843. TARGET MNN
  844. POST_BUILD
  845. COMMAND ${CMAKE_COMMAND}
  846. -E make_directory "${MNN_INCLUDE_OUTPUT}/"
  847. )
  848. add_custom_command(
  849. TARGET MNN
  850. POST_BUILD
  851. COMMAND ${CMAKE_COMMAND}
  852. -E make_directory "${MNN_INCLUDE_OUTPUT}/expr/"
  853. )
  854. FOREACH(header ${MNN_PUB_HDRS})
  855. add_custom_command(
  856. TARGET MNN
  857. POST_BUILD
  858. COMMAND ${CMAKE_COMMAND}
  859. ARGS -E copy ${header} "${MNN_INCLUDE_OUTPUT}/"
  860. )
  861. ENDFOREACH()
  862. FOREACH(header ${MNN_EXPR_PUB_HDRS})
  863. add_custom_command(
  864. TARGET MNN
  865. POST_BUILD
  866. COMMAND ${CMAKE_COMMAND}
  867. ARGS -E copy ${header} "${MNN_INCLUDE_OUTPUT}/expr/"
  868. )
  869. ENDFOREACH()
  870. ELSEIF(NOT APPLE)
  871. INSTALL(FILES ${MNN_PUB_HDRS} DESTINATION include/MNN/)
  872. INSTALL(FILES ${MNN_EXPR_PUB_HDRS} DESTINATION include/MNN/expr/)
  873. install(TARGETS MNN
  874. LIBRARY DESTINATION lib
  875. ARCHIVE DESTINATION lib
  876. )
  877. ELSE()
  878. install(TARGETS MNN
  879. LIBRARY DESTINATION lib
  880. ARCHIVE DESTINATION lib
  881. FRAMEWORK DESTINATION /Library/Frameworks/
  882. )
  883. IF(MNN_BUILD_OPENCV)
  884. if (NOT MNN_AAPL_FMWK)
  885. INSTALL(FILES ${MNN_CV_HDRS} DESTINATION include/MNN/cv)
  886. INSTALL(FILES ${MNN_CV_IMGHDRS} DESTINATION include/MNN/cv/imgproc)
  887. endif()
  888. FOREACH(HDR ${MNN_CV_HDRS})
  889. SET_SOURCE_FILES_PROPERTIES(${HDR} PROPERTIES MACOSX_PACKAGE_LOCATION Headers/cv/ )
  890. ENDFOREACH()
  891. FOREACH(HDR ${MNN_CV_IMGHDRS})
  892. SET_SOURCE_FILES_PROPERTIES(${HDR} PROPERTIES MACOSX_PACKAGE_LOCATION Headers/cv/imgproc )
  893. ENDFOREACH()
  894. ENDIF()
  895. IF(MNN_BUILD_AUDIO)
  896. if (NOT MNN_AAPL_FMWK)
  897. INSTALL(FILES ${MNN_AUDIO_HDRS} DESTINATION include/MNN/audio)
  898. endif()
  899. FOREACH(HDR ${MNN_AUDIO_HDRS})
  900. SET_SOURCE_FILES_PROPERTIES(${HDR} PROPERTIES MACOSX_PACKAGE_LOCATION Headers/audio/ )
  901. ENDFOREACH()
  902. ENDIF()
  903. IF(MNN_BUILD_LLM)
  904. if (NOT MNN_AAPL_FMWK)
  905. INSTALL(FILES ${MNN_LLM_HDRS} DESTINATION include/MNN/llm)
  906. endif()
  907. FOREACH(HDR ${MNN_LLM_HDRS})
  908. SET_SOURCE_FILES_PROPERTIES(${HDR} PROPERTIES MACOSX_PACKAGE_LOCATION Headers/llm )
  909. ENDFOREACH()
  910. ENDIF()
  911. IF(MNN_BUILD_DIFFUSION)
  912. if (NOT MNN_AAPL_FMWK)
  913. INSTALL(FILES ${MNN_DIFFUSION_HDRS} DESTINATION include/MNN/diffusion)
  914. endif()
  915. FOREACH(HDR ${MNN_DIFFUSION_HDRS})
  916. SET_SOURCE_FILES_PROPERTIES(${HDR} PROPERTIES MACOSX_PACKAGE_LOCATION Headers/diffusion )
  917. ENDFOREACH()
  918. ENDIF()
  919. if (NOT MNN_AAPL_FMWK)
  920. INSTALL(FILES ${MNN_PUB_HDRS} DESTINATION include/MNN/)
  921. INSTALL(FILES ${MNN_EXPR_PUB_HDRS} DESTINATION include/MNN/expr/)
  922. endif()
  923. FOREACH(HDR ${MNN_EXPR_PUB_HDRS})
  924. SET_SOURCE_FILES_PROPERTIES(${HDR} PROPERTIES MACOSX_PACKAGE_LOCATION Headers/expr/ )
  925. ENDFOREACH()
  926. FOREACH(HDR ${MNN_PUB_HDRS})
  927. SET_SOURCE_FILES_PROPERTIES(${HDR} PROPERTIES MACOSX_PACKAGE_LOCATION Headers/ )
  928. ENDFOREACH()
  929. IF(MNN_METAL)
  930. SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_BINARY_DIR}/mnn.metallib PROPERTIES MACOSX_PACKAGE_LOCATION Resources/)
  931. ENDIF()
  932. ENDIF()
  933. if (MNN_JNI)
  934. add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/source/jni/)
  935. endif()