OpenCVCompilerOptions.cmake 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567
  1. if("${CMAKE_CXX_COMPILER};${CMAKE_C_COMPILER};${CMAKE_CXX_COMPILER_LAUNCHER}" MATCHES "ccache")
  2. set(OPENCV_COMPILER_IS_CCACHE 1)
  3. endif()
  4. if(ENABLE_CCACHE AND NOT OPENCV_COMPILER_IS_CCACHE)
  5. # This works fine with Unix Makefiles and Ninja generators
  6. find_host_program(CCACHE_PROGRAM ccache)
  7. if(CCACHE_PROGRAM)
  8. message(STATUS "Looking for ccache - found (${CCACHE_PROGRAM})")
  9. get_property(__OLD_RULE_LAUNCH_COMPILE GLOBAL PROPERTY RULE_LAUNCH_COMPILE)
  10. if(CMAKE_GENERATOR MATCHES "Xcode")
  11. configure_file("${CMAKE_CURRENT_LIST_DIR}/templates/xcode-launch-c.in" "${CMAKE_BINARY_DIR}/xcode-launch-c")
  12. configure_file("${CMAKE_CURRENT_LIST_DIR}/templates/xcode-launch-cxx.in" "${CMAKE_BINARY_DIR}/xcode-launch-cxx")
  13. execute_process(COMMAND chmod a+rx
  14. "${CMAKE_BINARY_DIR}/xcode-launch-c"
  15. "${CMAKE_BINARY_DIR}/xcode-launch-cxx"
  16. )
  17. # Xcode project attributes
  18. set(CMAKE_XCODE_ATTRIBUTE_CC "${CMAKE_BINARY_DIR}/xcode-launch-c")
  19. set(CMAKE_XCODE_ATTRIBUTE_CXX "${CMAKE_BINARY_DIR}/xcode-launch-cxx")
  20. set(CMAKE_XCODE_ATTRIBUTE_LD "${CMAKE_BINARY_DIR}/xcode-launch-c")
  21. set(CMAKE_XCODE_ATTRIBUTE_LDPLUSPLUS "${CMAKE_BINARY_DIR}/xcode-launch-cxx")
  22. set(OPENCV_COMPILER_IS_CCACHE 1)
  23. message(STATUS "ccache: enable support through Xcode project properties")
  24. elseif(__OLD_RULE_LAUNCH_COMPILE)
  25. message(STATUS "Can't replace CMake compiler launcher")
  26. else()
  27. set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}")
  28. # NOTE: Actually this check doesn't work as expected.
  29. # "RULE_LAUNCH_COMPILE" is ignored by CMake during try_compile() step.
  30. # ocv_check_compiler_flag(CXX "" IS_CCACHE_WORKS)
  31. set(IS_CCACHE_WORKS 1)
  32. if(IS_CCACHE_WORKS)
  33. set(OPENCV_COMPILER_IS_CCACHE 1)
  34. else()
  35. message(STATUS "Unable to compile program with enabled ccache, reverting...")
  36. set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${__OLD_RULE_LAUNCH_COMPILE}")
  37. endif()
  38. endif()
  39. else()
  40. message(STATUS "Looking for ccache - not found")
  41. endif()
  42. endif()
  43. if((CV_CLANG AND NOT CMAKE_GENERATOR MATCHES "Xcode") # PCH has no support for Clang
  44. OR OPENCV_COMPILER_IS_CCACHE
  45. )
  46. set(ENABLE_PRECOMPILED_HEADERS OFF CACHE BOOL "" FORCE)
  47. endif()
  48. macro(add_extra_compiler_option option)
  49. ocv_check_flag_support(CXX "${option}" _varname "${OPENCV_EXTRA_CXX_FLAGS} ${ARGN}")
  50. if(${_varname})
  51. set(OPENCV_EXTRA_CXX_FLAGS "${OPENCV_EXTRA_CXX_FLAGS} ${option}")
  52. endif()
  53. ocv_check_flag_support(C "${option}" _varname "${OPENCV_EXTRA_C_FLAGS} ${ARGN}")
  54. if(${_varname})
  55. set(OPENCV_EXTRA_C_FLAGS "${OPENCV_EXTRA_C_FLAGS} ${option}")
  56. endif()
  57. endmacro()
  58. macro(add_extra_compiler_option_force option)
  59. set(OPENCV_EXTRA_CXX_FLAGS "${OPENCV_EXTRA_CXX_FLAGS} ${option}")
  60. set(OPENCV_EXTRA_C_FLAGS "${OPENCV_EXTRA_C_FLAGS} ${option}")
  61. endmacro()
  62. # Gets environment variable and puts its value to the corresponding preprocessor definition
  63. # Useful for WINRT that has no access to environment variables
  64. macro(add_env_definitions option)
  65. set(value $ENV{${option}})
  66. if("${value}" STREQUAL "")
  67. message(WARNING "${option} environment variable is empty. Please set it to appropriate location to get correct results")
  68. else()
  69. string(REPLACE "\\" "\\\\" value ${value})
  70. endif()
  71. add_definitions("-D${option}=\"${value}\"")
  72. endmacro()
  73. # Use same flags for native AArch64 and RISC-V compilation as for cross-compile (Linux)
  74. if(NOT CMAKE_CROSSCOMPILING AND NOT CMAKE_TOOLCHAIN_FILE AND COMMAND ocv_set_platform_flags)
  75. unset(platform_flags)
  76. ocv_set_platform_flags(platform_flags)
  77. # externally-provided flags should have higher priority - prepend our flags
  78. if(platform_flags)
  79. set(CMAKE_CXX_FLAGS "${platform_flags} ${CMAKE_CXX_FLAGS}")
  80. set(CMAKE_C_FLAGS "${platform_flags} ${CMAKE_C_FLAGS}")
  81. endif()
  82. endif()
  83. if(NOT MSVC)
  84. # OpenCV fails some tests when 'char' is 'unsigned' by default
  85. add_extra_compiler_option(-fsigned-char)
  86. endif()
  87. if(MSVC)
  88. if(NOT " ${CMAKE_CXX_FLAGS} ${OPENCV_EXTRA_FLAGS} ${OPENCV_EXTRA_CXX_FLAGS}" MATCHES " /fp:")
  89. if(ENABLE_FAST_MATH)
  90. add_extra_compiler_option("/fp:fast")
  91. else()
  92. add_extra_compiler_option("/fp:precise")
  93. endif()
  94. endif()
  95. elseif(CV_ICC)
  96. if(NOT " ${CMAKE_CXX_FLAGS} ${OPENCV_EXTRA_FLAGS} ${OPENCV_EXTRA_CXX_FLAGS}" MATCHES " /fp:"
  97. AND NOT " ${CMAKE_CXX_FLAGS} ${OPENCV_EXTRA_FLAGS} ${OPENCV_EXTRA_CXX_FLAGS}" MATCHES " -fp-model"
  98. )
  99. if(NOT ENABLE_FAST_MATH)
  100. add_extra_compiler_option("-fp-model precise")
  101. endif()
  102. endif()
  103. elseif(CV_ICX)
  104. # ICX uses -ffast-math by default.
  105. # use own flags, if no one of the flags provided by user: -fp-model, -ffast-math -fno-fast-math
  106. if(NOT " ${CMAKE_CXX_FLAGS} ${OPENCV_EXTRA_FLAGS} ${OPENCV_EXTRA_CXX_FLAGS}" MATCHES " /fp:"
  107. AND NOT " ${CMAKE_CXX_FLAGS} ${OPENCV_EXTRA_FLAGS} ${OPENCV_EXTRA_CXX_FLAGS}" MATCHES " -fp-model"
  108. AND NOT " ${CMAKE_CXX_FLAGS} ${OPENCV_EXTRA_FLAGS} ${OPENCV_EXTRA_CXX_FLAGS}" MATCHES " -ffast-math"
  109. AND NOT " ${CMAKE_CXX_FLAGS} ${OPENCV_EXTRA_FLAGS} ${OPENCV_EXTRA_CXX_FLAGS}" MATCHES " -fno-fast-math"
  110. )
  111. if(NOT ENABLE_FAST_MATH)
  112. add_extra_compiler_option(-fno-fast-math)
  113. add_extra_compiler_option(-fp-model=precise)
  114. endif()
  115. endif()
  116. elseif(CV_GCC OR CV_CLANG)
  117. if(ENABLE_FAST_MATH)
  118. add_extra_compiler_option(-ffast-math)
  119. add_extra_compiler_option(-fno-finite-math-only)
  120. endif()
  121. endif()
  122. if(CV_GCC OR CV_CLANG OR CV_ICX)
  123. # High level of warnings.
  124. add_extra_compiler_option(-W)
  125. if (NOT MSVC)
  126. # clang-cl interprets -Wall as MSVC would: -Weverything, which is more than
  127. # we want.
  128. add_extra_compiler_option(-Wall)
  129. endif()
  130. add_extra_compiler_option(-Wreturn-type)
  131. add_extra_compiler_option(-Wnon-virtual-dtor)
  132. add_extra_compiler_option(-Waddress)
  133. add_extra_compiler_option(-Wsequence-point)
  134. add_extra_compiler_option(-Wformat)
  135. add_extra_compiler_option(-Wformat-security -Wformat)
  136. add_extra_compiler_option(-Wmissing-declarations)
  137. add_extra_compiler_option(-Wmissing-prototypes)
  138. add_extra_compiler_option(-Wstrict-prototypes)
  139. add_extra_compiler_option(-Wundef)
  140. add_extra_compiler_option(-Winit-self)
  141. add_extra_compiler_option(-Wpointer-arith)
  142. if(NOT (CV_GCC AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "5.0"))
  143. add_extra_compiler_option(-Wshadow) # old GCC emits warnings for variables + methods combination
  144. endif()
  145. add_extra_compiler_option(-Wsign-promo)
  146. add_extra_compiler_option(-Wuninitialized)
  147. if(CV_GCC AND (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 6.0) AND (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.0 OR ARM))
  148. add_extra_compiler_option(-Wno-psabi)
  149. endif()
  150. if(HAVE_CXX11)
  151. if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND NOT ENABLE_PRECOMPILED_HEADERS)
  152. add_extra_compiler_option(-Wsuggest-override)
  153. elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
  154. add_extra_compiler_option(-Winconsistent-missing-override)
  155. endif()
  156. endif()
  157. if(ENABLE_NOISY_WARNINGS)
  158. add_extra_compiler_option(-Wcast-align)
  159. add_extra_compiler_option(-Wstrict-aliasing=2)
  160. else()
  161. add_extra_compiler_option(-Wno-delete-non-virtual-dtor)
  162. add_extra_compiler_option(-Wno-unnamed-type-template-args)
  163. add_extra_compiler_option(-Wno-comment)
  164. if(NOT OPENCV_SKIP_IMPLICIT_FALLTHROUGH
  165. AND NOT " ${CMAKE_CXX_FLAGS} ${OPENCV_EXTRA_FLAGS} ${OPENCV_EXTRA_CXX_FLAGS}" MATCHES "implicit-fallthrough"
  166. AND (CV_GCC AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.0.0)
  167. )
  168. add_extra_compiler_option(-Wimplicit-fallthrough=3)
  169. endif()
  170. if(CV_GCC AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 7.0)
  171. add_extra_compiler_option(-Wno-strict-overflow) # Issue appears when compiling surf.cpp from opencv_contrib/modules/xfeatures2d
  172. endif()
  173. if(CV_GCC AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0)
  174. add_extra_compiler_option(-Wno-missing-field-initializers) # GCC 4.x emits warnings about {}, fixed in GCC 5+
  175. endif()
  176. if(CV_CLANG AND NOT CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10.0)
  177. add_extra_compiler_option(-Wno-deprecated-enum-enum-conversion)
  178. add_extra_compiler_option(-Wno-deprecated-anon-enum-enum-conversion)
  179. endif()
  180. endif()
  181. add_extra_compiler_option(-fdiagnostics-show-option)
  182. # We need pthread's, unless we have explicitly disabled multi-thread execution.
  183. if(NOT OPENCV_DISABLE_THREAD_SUPPORT
  184. AND (
  185. (UNIX
  186. AND NOT ANDROID
  187. AND NOT (APPLE AND CV_CLANG)
  188. AND NOT EMSCRIPTEN
  189. )
  190. OR (EMSCRIPTEN AND WITH_PTHREADS_PF) # https://github.com/opencv/opencv/issues/20285
  191. )
  192. ) # TODO
  193. add_extra_compiler_option(-pthread)
  194. endif()
  195. if(CV_CLANG)
  196. add_extra_compiler_option(-Qunused-arguments)
  197. endif()
  198. if(OPENCV_WARNINGS_ARE_ERRORS)
  199. add_extra_compiler_option(-Werror)
  200. endif()
  201. if(APPLE)
  202. add_extra_compiler_option(-Wno-semicolon-before-method-body)
  203. endif()
  204. # Other optimizations
  205. if(ENABLE_OMIT_FRAME_POINTER)
  206. add_extra_compiler_option(-fomit-frame-pointer)
  207. elseif(DEFINED ENABLE_OMIT_FRAME_POINTER)
  208. add_extra_compiler_option(-fno-omit-frame-pointer)
  209. endif()
  210. # Profiling?
  211. if(ENABLE_PROFILING)
  212. # turn off incompatible options
  213. foreach(flags CMAKE_CXX_FLAGS CMAKE_C_FLAGS CMAKE_CXX_FLAGS_RELEASE CMAKE_C_FLAGS_RELEASE CMAKE_CXX_FLAGS_DEBUG CMAKE_C_FLAGS_DEBUG
  214. OPENCV_EXTRA_FLAGS_RELEASE OPENCV_EXTRA_FLAGS_DEBUG OPENCV_EXTRA_C_FLAGS OPENCV_EXTRA_CXX_FLAGS)
  215. string(REPLACE "-fomit-frame-pointer" "" ${flags} "${${flags}}")
  216. string(REPLACE "-ffunction-sections" "" ${flags} "${${flags}}")
  217. string(REPLACE "-fdata-sections" "" ${flags} "${${flags}}")
  218. endforeach()
  219. # -pg should be placed both in the linker and in the compiler settings
  220. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg")
  221. add_extra_compiler_option("-pg -g")
  222. else()
  223. if(MSVC)
  224. # TODO: Clang/C2 is not supported
  225. elseif(((IOS OR ANDROID) AND NOT BUILD_SHARED_LIBS) AND NOT OPENCV_FORCE_FUNCTIONS_SECTIONS)
  226. # don't create separate sections for functions/data, reduce package size
  227. else()
  228. # Remove unreferenced functions: function level linking
  229. add_extra_compiler_option(-ffunction-sections)
  230. add_extra_compiler_option(-fdata-sections)
  231. if(NOT OPENCV_SKIP_GC_SECTIONS)
  232. if(APPLE)
  233. set(OPENCV_EXTRA_EXE_LINKER_FLAGS "${OPENCV_EXTRA_EXE_LINKER_FLAGS} -Wl,-dead_strip")
  234. set(OPENCV_EXTRA_SHARED_LINKER_FLAGS "${OPENCV_EXTRA_SHARED_LINKER_FLAGS} -Wl,-dead_strip")
  235. set(OPENCV_EXTRA_MODULE_LINKER_FLAGS "${OPENCV_EXTRA_MODULE_LINKER_FLAGS} -Wl,-dead_strip")
  236. else()
  237. set(OPENCV_EXTRA_EXE_LINKER_FLAGS "${OPENCV_EXTRA_EXE_LINKER_FLAGS} -Wl,--gc-sections")
  238. set(OPENCV_EXTRA_SHARED_LINKER_FLAGS "${OPENCV_EXTRA_SHARED_LINKER_FLAGS} -Wl,--gc-sections")
  239. set(OPENCV_EXTRA_MODULE_LINKER_FLAGS "${OPENCV_EXTRA_MODULE_LINKER_FLAGS} -Wl,--gc-sections")
  240. endif()
  241. endif()
  242. endif()
  243. endif()
  244. if(ENABLE_COVERAGE)
  245. set(OPENCV_EXTRA_C_FLAGS "${OPENCV_EXTRA_C_FLAGS} --coverage")
  246. set(OPENCV_EXTRA_CXX_FLAGS "${OPENCV_EXTRA_CXX_FLAGS} --coverage")
  247. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage")
  248. endif()
  249. if(ENABLE_INSTRUMENTATION)
  250. if(NOT HAVE_CXX11)
  251. message(WARNING "ENABLE_INSTRUMENTATION requires C++11 support")
  252. endif()
  253. set(WITH_VTK OFF) # There are issues with VTK 6.0
  254. endif()
  255. if(ENABLE_LTO)
  256. if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 12)
  257. add_extra_compiler_option(-flto=auto)
  258. else()
  259. add_extra_compiler_option(-flto)
  260. endif()
  261. endif()
  262. if(ENABLE_THIN_LTO)
  263. add_extra_compiler_option(-flto=thin)
  264. endif()
  265. set(OPENCV_EXTRA_FLAGS_RELEASE "${OPENCV_EXTRA_FLAGS_RELEASE} -DNDEBUG")
  266. if(NOT " ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG} ${OPENCV_EXTRA_FLAGS_DEBUG} " MATCHES "-O")
  267. set(OPENCV_EXTRA_FLAGS_DEBUG "${OPENCV_EXTRA_FLAGS_DEBUG} -O0")
  268. endif()
  269. set(OPENCV_EXTRA_FLAGS_DEBUG "${OPENCV_EXTRA_FLAGS_DEBUG} -DDEBUG -D_DEBUG")
  270. if(BUILD_WITH_DEBUG_INFO)
  271. # https://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html
  272. # '-g' is equal to '-g2', '-g1' produces minimal information, enough for making backtraces
  273. ocv_update(OPENCV_DEBUG_OPTION "-g1")
  274. if(NOT " ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE} ${OPENCV_EXTRA_CXX_FLAGS} ${OPENCV_EXTRA_FLAGS_RELEASE}" MATCHES " -g")
  275. set(OPENCV_EXTRA_FLAGS_RELEASE "${OPENCV_EXTRA_FLAGS_RELEASE} ${OPENCV_DEBUG_OPTION}")
  276. endif()
  277. endif()
  278. endif()
  279. if(MSVC)
  280. #TODO Code refactoring is required to resolve security warnings
  281. #if(NOT ENABLE_BUILD_HARDENING)
  282. set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS")
  283. #endif()
  284. if(BUILD_WITH_DEBUG_INFO)
  285. set(OPENCV_EXTRA_FLAGS_RELEASE "${OPENCV_EXTRA_FLAGS_RELEASE} /Zi")
  286. set(OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE "${OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE} /debug")
  287. set(OPENCV_EXTRA_SHARED_LINKER_FLAGS_RELEASE "${OPENCV_EXTRA_SHARED_LINKER_FLAGS_RELEASE} /debug")
  288. set(OPENCV_EXTRA_MODULE_LINKER_FLAGS_RELEASE "${OPENCV_EXTRA_MODULE_LINKER_FLAGS_RELEASE} /debug")
  289. endif()
  290. # Remove unreferenced functions: function level linking
  291. set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} /Gy")
  292. if(NOT MSVC_VERSION LESS 1400)
  293. set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} /bigobj")
  294. endif()
  295. if(OPENCV_WARNINGS_ARE_ERRORS)
  296. set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} /WX")
  297. endif()
  298. if(ENABLE_LTO)
  299. set(OPENCV_EXTRA_FLAGS_RELEASE "${OPENCV_EXTRA_FLAGS_RELEASE} /GL")
  300. set(OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE "${OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE} /LTCG")
  301. endif()
  302. if(NOT MSVC_VERSION LESS 1800 AND NOT CMAKE_GENERATOR MATCHES "Visual Studio")
  303. set(OPENCV_EXTRA_C_FLAGS "${OPENCV_EXTRA_C_FLAGS} /FS")
  304. set(OPENCV_EXTRA_CXX_FLAGS "${OPENCV_EXTRA_CXX_FLAGS} /FS")
  305. endif()
  306. if(AARCH64 AND NOT MSVC_VERSION LESS 1930)
  307. set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} /D _ARM64_DISTINCT_NEON_TYPES")
  308. endif()
  309. endif()
  310. if(PROJECT_NAME STREQUAL "OpenCV")
  311. include("${OpenCV_SOURCE_DIR}/cmake/OpenCVCompilerOptimizations.cmake")
  312. endif()
  313. if(COMMAND ocv_compiler_optimization_options)
  314. ocv_compiler_optimization_options()
  315. endif()
  316. if(COMMAND ocv_compiler_optimization_options_finalize)
  317. ocv_compiler_optimization_options_finalize()
  318. endif()
  319. # set default visibility to hidden
  320. if((CV_GCC OR CV_CLANG OR CV_ICX)
  321. AND NOT MSVC
  322. AND NOT OPENCV_SKIP_VISIBILITY_HIDDEN
  323. AND NOT " ${CMAKE_CXX_FLAGS} ${OPENCV_EXTRA_FLAGS} ${OPENCV_EXTRA_CXX_FLAGS}" MATCHES " -fvisibility")
  324. add_extra_compiler_option(-fvisibility=hidden)
  325. add_extra_compiler_option(-fvisibility-inlines-hidden)
  326. endif()
  327. # workaround gcc bug for aligned ld/st
  328. # https://github.com/opencv/opencv/issues/13211
  329. if((PPC64LE AND NOT CMAKE_CROSSCOMPILING) OR OPENCV_FORCE_COMPILER_CHECK_VSX_ALIGNED)
  330. ocv_check_runtime_flag("${CPU_BASELINE_FLAGS}" OPENCV_CHECK_VSX_ALIGNED "${OpenCV_SOURCE_DIR}/cmake/checks/runtime/cpu_vsx_aligned.cpp")
  331. if(NOT OPENCV_CHECK_VSX_ALIGNED)
  332. add_extra_compiler_option_force(-DCV_COMPILER_VSX_BROKEN_ALIGNED)
  333. endif()
  334. endif()
  335. # validate inline asm with fixes register number and constraints wa, wd, wf
  336. if(PPC64LE)
  337. ocv_check_compiler_flag(CXX "${CPU_BASELINE_FLAGS}" OPENCV_CHECK_VSX_ASM "${OpenCV_SOURCE_DIR}/cmake/checks/cpu_vsx_asm.cpp")
  338. if(NOT OPENCV_CHECK_VSX_ASM)
  339. add_extra_compiler_option_force(-DCV_COMPILER_VSX_BROKEN_ASM)
  340. endif()
  341. endif()
  342. # Apply "-Wl,--as-needed" linker flags: https://github.com/opencv/opencv/issues/7001
  343. if(NOT OPENCV_SKIP_LINK_AS_NEEDED)
  344. if(UNIX AND (NOT APPLE OR NOT CMAKE_VERSION VERSION_LESS "3.2"))
  345. set(_option "-Wl,--as-needed")
  346. set(_saved_CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
  347. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${_option}") # requires CMake 3.2+ and CMP0056
  348. ocv_check_compiler_flag(CXX "" HAVE_LINK_AS_NEEDED)
  349. set(CMAKE_EXE_LINKER_FLAGS "${_saved_CMAKE_EXE_LINKER_FLAGS}")
  350. if(HAVE_LINK_AS_NEEDED)
  351. set(OPENCV_EXTRA_EXE_LINKER_FLAGS "${OPENCV_EXTRA_EXE_LINKER_FLAGS} ${_option}")
  352. set(OPENCV_EXTRA_SHARED_LINKER_FLAGS "${OPENCV_EXTRA_SHARED_LINKER_FLAGS} ${_option}")
  353. set(OPENCV_EXTRA_MODULE_LINKER_FLAGS "${OPENCV_EXTRA_MODULE_LINKER_FLAGS} ${_option}")
  354. endif()
  355. endif()
  356. endif()
  357. # Apply "-Wl,--no-undefined" linker flags: https://github.com/opencv/opencv/pull/21347
  358. if(NOT OPENCV_SKIP_LINK_NO_UNDEFINED)
  359. if(UNIX AND ((NOT APPLE OR NOT CMAKE_VERSION VERSION_LESS "3.2") AND NOT CMAKE_SYSTEM_NAME MATCHES "OpenBSD"))
  360. set(_option "-Wl,--no-undefined")
  361. set(_saved_CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
  362. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${_option}") # requires CMake 3.2+ and CMP0056
  363. ocv_check_compiler_flag(CXX "" HAVE_LINK_NO_UNDEFINED)
  364. set(CMAKE_EXE_LINKER_FLAGS "${_saved_CMAKE_EXE_LINKER_FLAGS}")
  365. if(HAVE_LINK_NO_UNDEFINED)
  366. set(OPENCV_EXTRA_EXE_LINKER_FLAGS "${OPENCV_EXTRA_EXE_LINKER_FLAGS} ${_option}")
  367. set(OPENCV_EXTRA_SHARED_LINKER_FLAGS "${OPENCV_EXTRA_SHARED_LINKER_FLAGS} ${_option}")
  368. set(OPENCV_EXTRA_MODULE_LINKER_FLAGS "${OPENCV_EXTRA_MODULE_LINKER_FLAGS} ${_option}")
  369. endif()
  370. endif()
  371. endif()
  372. # For 16k pages support with NDK prior 27
  373. # Details: https://developer.android.com/guide/practices/page-sizes?hl=en
  374. if(ANDROID AND ANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES AND (ANDROID_ABI STREQUAL arm64-v8a OR ANDROID_ABI STREQUAL x86_64))
  375. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,max-page-size=16384")
  376. set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,max-page-size=16384")
  377. set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-z,max-page-size=16384")
  378. endif()
  379. # combine all "extra" options
  380. if(NOT OPENCV_SKIP_EXTRA_COMPILER_FLAGS)
  381. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OPENCV_EXTRA_FLAGS} ${OPENCV_EXTRA_C_FLAGS}")
  382. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OPENCV_EXTRA_FLAGS} ${OPENCV_EXTRA_CXX_FLAGS}")
  383. set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${OPENCV_EXTRA_FLAGS_RELEASE}")
  384. set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} ${OPENCV_EXTRA_FLAGS_RELEASE}")
  385. set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${OPENCV_EXTRA_FLAGS_DEBUG}")
  386. set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${OPENCV_EXTRA_FLAGS_DEBUG}")
  387. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OPENCV_EXTRA_EXE_LINKER_FLAGS}")
  388. set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} ${OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE}")
  389. set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} ${OPENCV_EXTRA_EXE_LINKER_FLAGS_DEBUG}")
  390. set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${OPENCV_EXTRA_SHARED_LINKER_FLAGS}")
  391. set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} ${OPENCV_EXTRA_SHARED_LINKER_FLAGS_RELEASE}")
  392. set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} ${OPENCV_EXTRA_SHARED_LINKER_FLAGS_DEBUG}")
  393. set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${OPENCV_EXTRA_MODULE_LINKER_FLAGS}")
  394. set(CMAKE_MODULE_LINKER_FLAGS_RELEASE "${CMAKE_MODULE_LINKER_FLAGS_RELEASE} ${OPENCV_EXTRA_MODULE_LINKER_FLAGS_RELEASE}")
  395. set(CMAKE_MODULE_LINKER_FLAGS_DEBUG "${CMAKE_MODULE_LINKER_FLAGS_DEBUG} ${OPENCV_EXTRA_MODULE_LINKER_FLAGS_DEBUG}")
  396. endif()
  397. if(MSVC)
  398. if(NOT ENABLE_NOISY_WARNINGS)
  399. if(MSVC_VERSION EQUAL 1400)
  400. ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4510 /wd4610 /wd4312 /wd4201 /wd4244 /wd4328 /wd4267)
  401. endif()
  402. endif()
  403. foreach(flags CMAKE_C_FLAGS CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_RELEASE CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_DEBUG)
  404. string(REPLACE "/Zm1000" "" ${flags} "${${flags}}")
  405. endforeach()
  406. # Enable 'extern "C"' and asynchronous (division by zero, access violation) exceptions
  407. if(NOT OPENCV_SKIP_MSVC_EXCEPTIONS_FLAG)
  408. foreach(flags CMAKE_C_FLAGS CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_RELEASE CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_DEBUG)
  409. string(REGEX REPLACE " /EH[^ ]* " " " ${flags} " ${${flags}}")
  410. endforeach()
  411. if(NOT " ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE} ${CMAKE_CXX_FLAGS_DEBUG}" MATCHES " /EH")
  412. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHa")
  413. endif()
  414. endif()
  415. # Enable [[attribute]] syntax checking to prevent silent failure: "attribute is ignored in this syntactic position"
  416. add_extra_compiler_option("/w15240")
  417. if(NOT ENABLE_NOISY_WARNINGS)
  418. ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4127) # conditional expression is constant
  419. ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4251) # class 'std::XXX' needs to have dll-interface to be used by clients of YYY
  420. ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4324) # 'struct_name' : structure was padded due to __declspec(align())
  421. ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4275) # non dll-interface class 'std::exception' used as base for dll-interface class 'cv::Exception'
  422. ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4512) # Assignment operator could not be generated
  423. ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4589) # Constructor of abstract class 'cv::ORB' ignores initializer for virtual base class 'cv::Algorithm'
  424. ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4819) # Symbols like delta or epsilon cannot be represented
  425. endif()
  426. if(CV_ICC AND NOT ENABLE_NOISY_WARNINGS)
  427. foreach(flags CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_DEBUG CMAKE_C_FLAGS CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_DEBUG)
  428. string(REGEX REPLACE "( |^)/W[0-9]+( |$)" "\\1\\2" ${flags} "${${flags}}")
  429. endforeach()
  430. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Qwd673") # PCH warning
  431. endif()
  432. endif()
  433. if(APPLE AND NOT CMAKE_CROSSCOMPILING AND NOT DEFINED ENV{LDFLAGS} AND EXISTS "/usr/local/lib")
  434. link_directories("/usr/local/lib")
  435. endif()
  436. if(ENABLE_BUILD_HARDENING)
  437. include("${CMAKE_CURRENT_LIST_DIR}/OpenCVCompilerDefenses.cmake")
  438. endif()
  439. if(MSVC)
  440. include("${CMAKE_CURRENT_LIST_DIR}/OpenCVCRTLinkage.cmake")
  441. add_definitions(-D_VARIADIC_MAX=10)
  442. endif()
  443. if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
  444. get_directory_property(__DIRECTORY_COMPILE_DEFINITIONS COMPILE_DEFINITIONS)
  445. if((NOT " ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE} ${OPENCV_EXTRA_CXX_FLAGS} ${OPENCV_EXTRA_FLAGS_RELEASE} ${__DIRECTORY_COMPILE_DEFINITIONS}" MATCHES "_WIN32_WINNT"
  446. AND NOT OPENCV_CMAKE_SKIP_MACRO_WIN32_WINNT)
  447. OR OPENCV_CMAKE_FORCE_MACRO_WIN32_WINNT
  448. )
  449. # https://docs.microsoft.com/en-us/cpp/porting/modifying-winver-and-win32-winnt
  450. # Target Windows 7 API
  451. set(OPENCV_CMAKE_MACRO_WIN32_WINNT "0x0601" CACHE STRING "Value of _WIN32_WINNT macro")
  452. add_definitions(-D_WIN32_WINNT=${OPENCV_CMAKE_MACRO_WIN32_WINNT})
  453. endif()
  454. endif()
  455. # Enable compiler options for OpenCV modules/apps/samples only (ignore 3rdparty)
  456. macro(ocv_add_modules_compiler_options)
  457. if(MSVC AND NOT OPENCV_SKIP_MSVC_W4_OPTION)
  458. foreach(flags CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_DEBUG)
  459. string(REPLACE "/W3" "/W4" ${flags} "${${flags}}")
  460. endforeach()
  461. endif()
  462. if(OPENCV_ENABLE_MEMORY_SANITIZER)
  463. add_definitions(-DOPENCV_ENABLE_MEMORY_SANITIZER=1)
  464. endif()
  465. endmacro()
  466. # adjust -Wl,-rpath-link
  467. if(CMAKE_SKIP_RPATH)
  468. if((NOT CMAKE_CROSSCOMPILING OR OPENCV_ENABLE_LINKER_RPATH_LINK_ORIGIN) AND NOT OPENCV_SKIP_LINKER_RPATH_LINK_ORIGIN)
  469. if(DEFINED CMAKE_SHARED_LIBRARY_RPATH_ORIGIN_TOKEN)
  470. list(APPEND CMAKE_PLATFORM_RUNTIME_PATH "${CMAKE_SHARED_LIBRARY_RPATH_ORIGIN_TOKEN}")
  471. else()
  472. list(APPEND CMAKE_PLATFORM_RUNTIME_PATH "\$ORIGIN")
  473. endif()
  474. elseif(NOT OPENCV_SKIP_LINKER_RPATH_LINK_BINARY_LIB)
  475. list(APPEND CMAKE_PLATFORM_RUNTIME_PATH "${LIBRARY_OUTPUT_PATH}")
  476. endif()
  477. endif()
  478. if(OPENCV_EXTRA_RPATH_LINK_PATH)
  479. string(REPLACE ":" ";" OPENCV_EXTRA_RPATH_LINK_PATH_ "${OPENCV_EXTRA_RPATH_LINK_PATH}")
  480. list(APPEND CMAKE_PLATFORM_RUNTIME_PATH ${OPENCV_EXTRA_RPATH_LINK_PATH_})
  481. if(NOT CMAKE_EXECUTABLE_RPATH_LINK_CXX_FLAG)
  482. message(WARNING "OPENCV_EXTRA_RPATH_LINK_PATH may not work properly because CMAKE_EXECUTABLE_RPATH_LINK_CXX_FLAG is not defined (not supported)")
  483. endif()
  484. endif()
  485. # Control MSVC /MP flag
  486. # Input variables: OPENCV_MSVC_PARALLEL (ON,1,2,3,...) + OPENCV_SKIP_MSVC_PARALLEL
  487. # Details:
  488. # - https://docs.microsoft.com/en-us/cpp/build/reference/mp-build-with-multiple-processes
  489. # - https://docs.microsoft.com/en-us/cpp/build/reference/cl-environment-variables
  490. # - https://gitlab.kitware.com/cmake/cmake/merge_requests/1718/diffs
  491. if(CMAKE_GENERATOR MATCHES "Visual Studio" AND CMAKE_CXX_COMPILER_ID MATCHES "MSVC|Intel")
  492. ocv_check_environment_variables(OPENCV_SKIP_MSVC_PARALLEL)
  493. if(OPENCV_SKIP_MSVC_PARALLEL)
  494. # nothing
  495. elseif(" ${CMAKE_CXX_FLAGS}" MATCHES "/MP")
  496. # nothing, already defined in compiler flags
  497. elseif(DEFINED ENV{CL} AND " $ENV{CL}" MATCHES "/MP")
  498. # nothing, compiler will use CL environment variable
  499. elseif(DEFINED ENV{_CL_} AND " $ENV{_CL_}" MATCHES "/MP")
  500. # nothing, compiler will use _CL_ environment variable
  501. else()
  502. ocv_check_environment_variables(OPENCV_MSVC_PARALLEL)
  503. set(_mp_value "ON")
  504. if(DEFINED OPENCV_MSVC_PARALLEL)
  505. set(_mp_value "${OPENCV_MSVC_PARALLEL}")
  506. endif()
  507. set(OPENCV_MSVC_PARALLEL "${_mp_value}" CACHE STRING "Control MSVC /MP flag")
  508. if(_mp_value)
  509. if(_mp_value GREATER 0)
  510. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /MP${_mp_value}")
  511. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP${_mp_value}")
  512. else()
  513. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /MP")
  514. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
  515. endif()
  516. endif()
  517. endif()
  518. endif()