@@ -49,6 +49,7 @@ include(FindPythonInterp REQUIRED)
4949option (MNN_USE_SYSTEM_LIB "For opencl and vulkan, use system lib or use dlopen" OFF )
5050option (MNN_BUILD_HARD "Build -mfloat-abi=hard or not" OFF )
5151option (MNN_BUILD_SHARED_LIBS "MNN build shared or static lib" ON )
52+ option (MNN_WIN_RUNTIME_MT "MNN use /MT on Windows dll" OFF )
5253option (MNN_FORBID_MULTI_THREAD "Disable Multi Thread" OFF )
5354option (MNN_OPENMP "Use OpenMP's thread pool implementation. Does not work on iOS or Mac OS" OFF )
5455option (MNN_USE_THREAD_POOL "Use MNN's own thread pool implementation" ON )
@@ -62,14 +63,14 @@ option(MNN_SUPPORT_TFLITE_QUAN "Enable MNN's tflite quantized op" ON)
6263option (MNN_DEBUG_MEMORY "MNN Debug Memory Access" OFF )
6364option (MNN_DEBUG_TENSOR_SIZE "Enable Tensor Size" OFF )
6465option (MNN_GPU_TRACE "Enable MNN Gpu Debug" OFF )
65- option (MNN_OPENCL_LWS_TUNE "Enable MNN OpenCL Lws Tuning" ON )
6666option (MNN_PORTABLE_BUILD "Link the static version of third party libraries where possible to improve the portability of built executables" OFF )
6767option (MNN_SEP_BUILD "Build MNN Backends and expression seperately. Only works with MNN_BUILD_SHARED_LIBS=ON" ON )
6868option (NATIVE_LIBRARY_OUTPUT "Native Library Path" OFF )
6969option (NATIVE_INCLUDE_OUTPUT "Native Include Path" OFF )
7070option (MNN_AAPL_FMWK "Build MNN.framework instead of traditional .a/.dylib" OFF )
71- option (MNN_FMA_ENABLE "x86 routine use fma extension" OFF )
7271option (MNN_WITH_PLUGIN "Build with plugin op support." OFF )
72+ option (MNN_BUILD_MINI "Build MNN-MINI that just supports fixed shape models." OFF )
73+ option (MNN_USE_SSE "Use SSE optimization for x86 if possiable" ON )
7374
7475IF (NOT MNN_BUILD_SHARED_LIBS)
7576 message (WARNING "Close MNN_SEP_BUILD for static library" )
@@ -79,27 +80,29 @@ IF(APPLE AND MNN_AAPL_FMWK AND MNN_SEP_BUILD)
7980 message (WARNING "MNN_SEP_BUILD AND MNN_AAPL_FMWK can't coexist. Turning off MNN_SEP_BUILD" )
8081 SET (MNN_SEP_BUILD OFF CACHE BOOL "<docstring>" FORCE)
8182ENDIF ()
82- IF (MSVC OR WIN32 )
83+ IF (WIN32 )
8384 IF (MNN_SEP_BUILD)
8485 message (WARNING "MNN_SEP_BUILD IS TROUBLESOME ON Windows. Forcing OFF..." )
8586 SET (MNN_SEP_BUILD OFF CACHE BOOL "<docstring>" FORCE)
8687 ENDIF ()
87- SET (MNN_USE_SYSTEM_LIB ON CACHE BOOL "<docstring>" FORCE )
88+ add_definitions (-D_CRT_SECURE_NO_WARNINGS )
8889
89- # generate optimized (release) exe and library with pdb debug file, https://stackoverflow.com/a/31264946
90- SET (CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF" )
91- SET (CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF" )
92- SET (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /Zi" )
93- SET (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi" )
90+ IF (MSVC )
91+ # generate optimized (release) exe and library with pdb debug file, https://stackoverflow.com/a/31264946
92+ SET (CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF" )
93+ SET (CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF" )
94+ SET (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /Zi" )
95+ SET (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi" )
9496
95- SET (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4267 /wd4018 /wd4251 /wd4996 /wd4244 /wd4146 /wd4129 /wd4305 /wd4275" )
96- SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4267 /wd4018 /wd4251 /wd4996 /wd4244 /wd4146 /wd4129 /wd4305 /wd4275" )
97+ SET (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4267 /wd4018 /wd4251 /wd4996 /wd4244 /wd4146 /wd4129 /wd4305 /wd4275" )
98+ SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4267 /wd4018 /wd4251 /wd4996 /wd4244 /wd4146 /wd4129 /wd4305 /wd4275" )
99+ ENDIF ()
97100ENDIF ()
98101
99102include (${CMAKE_CURRENT_LIST_DIR} /cmake/macros .cmake)
100103
101104IF (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND NOT MNN_BUILD_SHARED_LIBS AND NOT (MSVC OR WIN32 ))
102- SET (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static " )
105+ SET (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} " )
103106 SET (MNN_SEP_BUILD OFF CACHE BOOL "<docstring>" FORCE)
104107 IF (MNN_BUILD_CONVERTER)
105108 SET (MNN_PORTABLE_BUILD ON CACHE BOOL "<docstring>" FORCE)
@@ -117,6 +120,9 @@ endif()
117120if (MNN_SUPPORT_TFLITE_QUAN)
118121 add_definitions (-DMNN_SUPPORT_TFLITE_QUAN)
119122endif ()
123+ if (MNN_BUILD_MINI)
124+ add_definitions (-DMNN_BUILD_MINI)
125+ endif ()
120126
121127# debug options
122128if (MNN_DEBUG_MEMORY)
@@ -128,21 +134,15 @@ endif()
128134if (MNN_GPU_TRACE)
129135 add_definitions (-DMNN_GPU_FORCE_FINISH)
130136endif ()
131- if (MNN_OPENCL_LWS_TUNE)
132- add_definitions (-DMNN_OPENCL_LWS_TUNE)
133- endif ()
134137
135138# backend options
136139option (MNN_METAL "Enable Metal" OFF )
137140option (MNN_OPENCL "Enable OpenCL" OFF )
138141option (MNN_OPENGL "Enable OpenGL" OFF )
139142option (MNN_VULKAN "Enable Vulkan" OFF )
140143option (MNN_ARM82 "Enable ARM82" OFF )
141-
142- # codegen register ops
143- if (MNN_METAL)
144- add_definitions (-DMNN_CODEGEN_REGISTER)
145- endif ()
144+ option (MNN_CUDA "Enable CUDA" OFF )
145+ option (MNN_TENSORRT "Enable TensorRT" OFF )
146146
147147# target options
148148option (MNN_BUILD_BENCHMARK "Build benchmark or not" OFF )
@@ -165,11 +165,13 @@ message(STATUS "\tOpenCL: ${MNN_OPENCL}")
165165message (STATUS "\t OpenGL: ${MNN_OPENGL} " )
166166message (STATUS "\t Vulkan: ${MNN_VULKAN} " )
167167message (STATUS "\t ARM82: ${MNN_ARM82} " )
168+ message (STATUS "\t TensorRT: ${MNN_TENSORRT} " )
169+ message (STATUS "\t CUDA: ${MNN_CUDA} " )
168170message (STATUS "\t OpenMP: ${MNN_OPENMP} " )
169171message (STATUS "\t Hidden: ${MNN_HIDDEN} " )
170172message (STATUS "\t Build Path: ${CMAKE_CURRENT_BINARY_DIR} " )
171173
172- if (WIN32 )
174+ if (MSVC )
173175 if (${CMAKE_VERSION} VERSION_LESS "3.14.0" )
174176 message (FATAL_ERROR "MNN requires CMake 3.14+ to build on Windows!" )
175177 endif ()
@@ -178,14 +180,14 @@ if(WIN32)
178180 CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
179181 CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
180182 CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO )
181- if (MNN_BUILD_SHARED_LIBS)
182- if (${flag_var} MATCHES "/MT" )
183- string (REGEX REPLACE "/MT" "/MD" ${flag_var} "${${flag_var} }" )
184- endif ()
185- else ()
183+ if (MNN_WIN_RUNTIME_MT)
186184 if (${flag_var} MATCHES "/MD" )
187185 string (REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var} }" )
188186 endif ()
187+ else ()
188+ if (${flag_var} MATCHES "/MT" )
189+ string (REGEX REPLACE "/MT" "/MD" ${flag_var} "${${flag_var} }" )
190+ endif ()
189191 endif ()
190192 endforeach ()
191193elseif (CMAKE_SYSTEM_NAME MATCHES "^Android" OR CMAKE_SYSTEM_NAME MATCHES "^Linux" )
@@ -270,6 +272,8 @@ if(${CMAKE_SYSTEM_NAME} MATCHES "^Linux")
270272endif ()
271273include_directories (${CMAKE_CURRENT_LIST_DIR} /include /
272274 ${CMAKE_CURRENT_LIST_DIR} /source /
275+ ${CMAKE_CURRENT_LIST_DIR} /express/
276+ ${CMAKE_CURRENT_LIST_DIR} /tools/
273277 ${CMAKE_CURRENT_LIST_DIR} /schema/current/
274278 ${CMAKE_CURRENT_LIST_DIR} /3rd_party/
275279 ${CMAKE_CURRENT_LIST_DIR} /3rd_party/flatbuffers/include
@@ -293,12 +297,12 @@ FILE(GLOB MNN_CV_SRC ${CMAKE_CURRENT_LIST_DIR}/source/cv/*)
293297add_library (MNNCV OBJECT ${MNN_CV_SRC} )
294298list (APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:MNNCV>)
295299list (APPEND MNN_TARGETS MNNCV)
296- if ( CMAKE_SYSTEM_PROCESSOR MATCHES "(x86_64)|(X86_64)|(x64)|(X64)|(amd64)|(AMD64)|(i686)" )
297- if (WIN32 OR MSVC )
298- target_compile_options (MNNCV PRIVATE /arch:AVX )
299- else ( )
300- target_compile_options (MNNCV PRIVATE -msse3 )
301- target_compile_options (MNNCV PRIVATE -mavx )
300+ if (MNN_USE_SSE )
301+ if (CMAKE_SYSTEM_PROCESSOR MATCHES "(x86_64)|(X86_64)|(x64)|(X64)|(amd64)|(AMD64)|(i686)" )
302+ if ( NOT MSVC )
303+ target_compile_options (MNNCV PRIVATE -msse3 )
304+ target_compile_options (MNNCV PRIVATE -mavx )
305+ endif ( )
302306 endif ()
303307endif ()
304308
@@ -308,11 +312,19 @@ add_library(MNNMath OBJECT ${MNN_Math_SRC})
308312list (APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:MNNMath>)
309313list (APPEND MNN_TARGETS MNNMath)
310314
311- # Shape
312- FILE (GLOB MNN_Shape_SRC ${CMAKE_CURRENT_LIST_DIR} /source /shape/*)
313- add_library (MNNShape OBJECT ${MNN_Shape_SRC} )
314- list (APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:MNNShape>)
315- list (APPEND MNN_TARGETS MNNShape)
315+ # Transform
316+ FILE (GLOB MNN_Transform_SRC ${CMAKE_CURRENT_LIST_DIR} /source /shape/* ${CMAKE_CURRENT_LIST_DIR} /source /geometry/*)
317+ add_library (MNNTransform OBJECT ${MNN_Transform_SRC} )
318+ IF (NOT MNN_BUILD_MINI)
319+ list (APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:MNNTransform>)
320+ ENDIF ()
321+ list (APPEND MNN_TARGETS MNNTransform)
322+
323+ # Utils
324+ FILE (GLOB MNN_Utils_SRC ${CMAKE_CURRENT_LIST_DIR} /source /utils/*)
325+ add_library (MNNUtils OBJECT ${MNN_Utils_SRC} )
326+ list (APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:MNNUtils>)
327+ list (APPEND MNN_TARGETS MNNUtils)
316328
317329# Compute
318330FILE (GLOB MNN_Compute_SRC ${CMAKE_CURRENT_LIST_DIR} /source /backend/cpu/compute/*)
@@ -327,7 +339,9 @@ list(APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:MNNCPU>)
327339list (APPEND MNN_TARGETS MNNCPU)
328340
329341# X86_64 AVX/SSE
342+ if (MNN_USE_SSE)
330343include (${CMAKE_CURRENT_LIST_DIR} /source /backend/cpu/x86_x64/CMakeLists.txt)
344+ endif ()
331345
332346# AArch32/64 Assemblies
333347include (${CMAKE_CURRENT_LIST_DIR} /source /backend/cpu/arm/CMakeLists.txt)
@@ -377,7 +391,7 @@ if (NOT APPLE)
377391 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS} " )
378392 set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${OpenMP_SHARED_LINKER_FLAGS} " )
379393 set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS} " )
380- if (WIN32 )
394+ if (MSVC )
381395 set (OpenMP_C_FLAGS "/openmp ${OpenMP_C_FLAGS} " )
382396 set (OpenMP_CXX_FLAGS "/openmp ${OpenMP_CXX_FLAGS} " )
383397 endif ()
@@ -387,20 +401,22 @@ endif()
387401
388402set (CMAKE_CXX_FLAGS_ORIGIN ${CMAKE_CXX_FLAGS} )
389403set (CMAKE_C_FLAGS_ORIGIN ${CMAKE_C_FLAGS} )
390- if ((NOT ( MSVC OR WIN32 ) ) AND MNN_HIDDEN)
404+ if ((NOT MSVC ) AND MNN_HIDDEN)
391405 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility-inlines-hidden -fvisibility=hidden" )
392406 set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden" )
393- if (NOT APPLE )
407+ # Omit frame pointer may cause difficult debug
408+ if ((NOT APPLE ) AND (NOT WIN32 ))
394409 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fomit-frame-pointer" )
395410 endif ()
396411endif ()
397- if (NOT ( MSVC OR WIN32 ) )
412+ if (NOT MSVC )
398413 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstrict-aliasing -ffunction-sections -fdata-sections -ffast-math -fno-rtti -fno-exceptions " )
399414 set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstrict-aliasing -ffunction-sections -fdata-sections -ffast-math" )
400415endif ()
401416
402417# Metal
403- include (${CMAKE_CURRENT_LIST_DIR} /source /backend/metal/CMakeLists.txt)
418+ set (MNN_DEPS "" )
419+ set (MNN_EXTRA_DEPENDS "" )
404420list (APPEND MNN_DEPS MNN)
405421
406422# Plugin
@@ -409,6 +425,14 @@ if(MNN_WITH_PLUGIN)
409425 include (${CMAKE_CURRENT_LIST_DIR} /source /plugin/CMakeLists.txt)
410426endif ()
411427
428+ # Metal
429+ if (MNN_METAL AND APPLE )
430+ add_definitions (-DMNN_METAL_ENABLED=1)
431+ include (${CMAKE_CURRENT_LIST_DIR} /source /backend/metal/CMakeLists.txt)
432+ list (APPEND MNN_TARGETS MNNMetal)
433+ list (APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:MNNMetal>)
434+ endif ()
435+
412436# Vulkan
413437IF (MNN_VULKAN)
414438 add_subdirectory (${CMAKE_CURRENT_LIST_DIR} /source /backend/vulkan/)
@@ -446,22 +470,34 @@ IF(MNN_OPENGL)
446470 ENDIF ()
447471ENDIF ()
448472
473+ # CUDA
474+ IF (MNN_CUDA)
475+ add_subdirectory (${CMAKE_CURRENT_LIST_DIR} /source /backend/cuda/)
476+ list (APPEND MNN_TARGETS MNN_CUDA)
477+ list (APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:MNN_CUDA>)
478+ list (APPEND MNN_EXTRA_DEPENDS ${MNN_CUDA_LIBS} )
479+ ENDIF ()
480+
449481IF (CMAKE_SYSTEM_PROCESSOR MATCHES "^aarch64" OR IOS_ARCH STREQUAL "arm64" )
450482# ARM82 Assemblies
451483 IF (MNN_ARM82)
452484 add_definitions (-DENABLE_ARMV82)
453485 add_subdirectory (${CMAKE_CURRENT_LIST_DIR} /source /backend/arm82/)
454- IF (MNN_SEP_BUILD)
455- list (APPEND MNN_DEPS MNN_Arm82)
456- ELSE ()
457- list (APPEND MNN_TARGETS MNN_Arm82)
458- list (APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:MNN_Arm82>)
459- ENDIF ()
486+ list (APPEND MNN_TARGETS MNN_Arm82)
487+ list (APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:MNN_Arm82>)
460488 ENDIF ()
461489ENDIF ()
462490# Express
463491add_subdirectory (${CMAKE_CURRENT_LIST_DIR} /express/)
464492
493+ # TensorRT
494+ IF (MNN_TENSORRT)
495+ add_subdirectory (${CMAKE_CURRENT_LIST_DIR} /source /backend/tensorrt/)
496+ list (APPEND MNN_TARGETS MNN_TRT)
497+ list (APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:MNN_TRT>)
498+ list (APPEND MNN_EXTRA_DEPENDS ${MNN_TRT_LIBS} )
499+ ENDIF ()
500+
465501IF (MNN_SEP_BUILD)
466502 add_library (MNN SHARED ${CMAKE_CURRENT_LIST_DIR} /cmake/dummy.cpp ${MNN_OBJECTS_TO_LINK} ${MNN_PUB_HDRS} ${MNN_EXPR_PUB_HDRS} )
467503 target_link_libraries (MNN PUBLIC ${MNN_EXTRA_DEPENDS} )
@@ -471,7 +507,7 @@ ELSE()
471507 list (APPEND MNN_TARGETS MNNExpress)
472508 IF (MNN_BUILD_SHARED_LIBS)
473509 add_library (MNN SHARED ${CMAKE_CURRENT_LIST_DIR} /cmake/dummy.cpp ${MNN_OBJECTS_TO_LINK} ${MNN_PUB_HDRS} ${MNN_EXPR_PUB_HDRS} )
474- if (MSVC OR WIN32 )
510+ if (WIN32 )
475511 foreach (TARGET ${MNN_TARGETS} )
476512 target_compile_definitions (${TARGET} PRIVATE "-DBUILDING_MNN_DLL" )
477513 target_compile_definitions (${TARGET} INTERFACE "-DUSING_MNN_DLL" )
@@ -484,7 +520,7 @@ ELSE()
484520 ENDIF ()
485521 target_link_libraries (MNN PUBLIC ${MNN_EXTRA_DEPENDS} )
486522ENDIF ()
487- if (MSVC OR WIN32 )
523+ if (MSVC )
488524 target_link_options (MNN PRIVATE "/IGNORE:4049,4217" )
489525endif ()
490526
@@ -504,9 +540,11 @@ if(APPLE)
504540 target_link_libraries (MNN PUBLIC ${FOUNDATION} )
505541 find_library (METAL Metal REQUIRED)
506542 target_link_libraries (MNN PUBLIC ${METAL} )
543+ find_library (GRAPHIC CoreGraphics)
544+ target_link_libraries (MNN PUBLIC ${GRAPHIC} )
507545 ENDIF ()
508546endif ()
509- add_dependencies (MNN MNNCore MNNCV MNNShape MNNMath MNNCompute MNNCPU GenVCSHDR)
547+ add_dependencies (MNN MNNCore MNNCV MNNTransform MNNMath MNNCompute MNNCPU GenVCSHDR)
510548add_subdirectory (${CMAKE_CURRENT_LIST_DIR} /tools/converter)
511549
512550if (CMAKE_SYSTEM_NAME MATCHES "^Linux" )
@@ -532,12 +570,6 @@ if (NOT MNN_BUILD_SHARED_LIBS)
532570 endif ()
533571endif ()
534572list (APPEND MNN_TARGETS MNN)
535- FOREACH (TARGET ${MNN_TARGETS} )
536- IF ((NOT MSVC ) AND (NOT WIN32 ))
537- else ()
538- target_compile_definitions (${TARGET} PRIVATE _CRT_SECURE_NO_WARNINGS)
539- endif ()
540- ENDFOREACH ()
541573list (REMOVE_ITEM MNN_TARGETS MNN)
542574IF (MNN_BUILD_DEMO)
543575include (${CMAKE_CURRENT_LIST_DIR} /demo/exec/CMakeLists.txt)
0 commit comments