OpenCVCompilerOptions.cmake 17.4 KB
Newer Older
A
Alexander Alekhin 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
if(ENABLE_CCACHE AND NOT CMAKE_COMPILER_IS_CCACHE)
  # This works fine with Unix Makefiles and Ninja generators
  find_host_program(CCACHE_PROGRAM ccache)
  if(CCACHE_PROGRAM)
    message(STATUS "Looking for ccache - found (${CCACHE_PROGRAM})")
    get_property(__OLD_RULE_LAUNCH_COMPILE GLOBAL PROPERTY RULE_LAUNCH_COMPILE)
    if(__OLD_RULE_LAUNCH_COMPILE)
      message(STATUS "Can't replace CMake compiler launcher")
    else()
      set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}")
      # NOTE: Actually this check doesn't work as expected.
      # "RULE_LAUNCH_COMPILE" is ignored by CMake during try_compile() step.
      # ocv_check_compiler_flag(CXX "" IS_CCACHE_WORKS)
      set(IS_CCACHE_WORKS 1)
      if(IS_CCACHE_WORKS)
        set(CMAKE_COMPILER_IS_CCACHE 1)
      else()
        message(STATUS "Unable to compile program with enabled ccache, reverting...")
        set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${__OLD_RULE_LAUNCH_COMPILE}")
      endif()
    else()
      message(STATUS "Looking for ccache - not found")
    endif()
  endif()
endif()

if((CMAKE_COMPILER_IS_CLANGCXX OR CMAKE_COMPILER_IS_CLANGCC OR CMAKE_COMPILER_IS_CCACHE) AND NOT CMAKE_GENERATOR MATCHES "Xcode")
  set(ENABLE_PRECOMPILED_HEADERS OFF CACHE BOOL "" FORCE)
endif()

31
if(MINGW OR (X86 AND UNIX AND NOT APPLE))
A
Andrey Kamaev 已提交
32 33 34 35 36 37 38 39 40 41 42 43 44 45
  # mingw compiler is known to produce unstable SSE code with -O3 hence we are trying to use -O2 instead
  if(CMAKE_COMPILER_IS_GNUCXX)
    foreach(flags CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_DEBUG)
      string(REPLACE "-O3" "-O2" ${flags} "${${flags}}")
    endforeach()
  endif()

  if(CMAKE_COMPILER_IS_GNUCC)
    foreach(flags CMAKE_C_FLAGS CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_DEBUG)
      string(REPLACE "-O3" "-O2" ${flags} "${${flags}}")
    endforeach()
  endif()
endif()

46
if(MSVC)
47 48
  string(REGEX REPLACE "^  *| * $" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
  string(REGEX REPLACE "^  *| * $" "" CMAKE_CXX_FLAGS_INIT "${CMAKE_CXX_FLAGS_INIT}")
49 50 51 52 53
  if(CMAKE_CXX_FLAGS STREQUAL CMAKE_CXX_FLAGS_INIT)
    # override cmake default exception handling option
    string(REPLACE "/EHsc" "/EHa" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}"  CACHE STRING "Flags used by the compiler during all build types." FORCE)
  endif()
A
Andrey Kamaev 已提交
54 55
endif()

A
Andrey Kamaev 已提交
56
set(OPENCV_EXTRA_FLAGS "")
A
Andrey Kamaev 已提交
57
set(OPENCV_EXTRA_C_FLAGS "")
A
Andrey Kamaev 已提交
58 59 60
set(OPENCV_EXTRA_CXX_FLAGS "")
set(OPENCV_EXTRA_FLAGS_RELEASE "")
set(OPENCV_EXTRA_FLAGS_DEBUG "")
A
Andrey Kamaev 已提交
61 62 63 64
set(OPENCV_EXTRA_EXE_LINKER_FLAGS "")
set(OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE "")
set(OPENCV_EXTRA_EXE_LINKER_FLAGS_DEBUG "")

A
Andrey Kamaev 已提交
65
macro(add_extra_compiler_option option)
A
Andrey Kamaev 已提交
66 67 68 69
  if(CMAKE_BUILD_TYPE)
    set(CMAKE_TRY_COMPILE_CONFIGURATION ${CMAKE_BUILD_TYPE})
  endif()
  ocv_check_flag_support(CXX "${option}" _varname "${OPENCV_EXTRA_CXX_FLAGS} ${ARGN}")
A
Andrey Kamaev 已提交
70 71 72 73
  if(${_varname})
    set(OPENCV_EXTRA_CXX_FLAGS "${OPENCV_EXTRA_CXX_FLAGS} ${option}")
  endif()

A
Andrey Kamaev 已提交
74
  ocv_check_flag_support(C "${option}" _varname "${OPENCV_EXTRA_C_FLAGS} ${ARGN}")
A
Andrey Kamaev 已提交
75 76 77 78 79
  if(${_varname})
    set(OPENCV_EXTRA_C_FLAGS "${OPENCV_EXTRA_C_FLAGS} ${option}")
  endif()
endmacro()

80 81 82 83 84 85 86 87 88 89 90 91
# Gets environment variable and puts its value to the corresponding preprocessor definition
# Useful for WINRT that has no access to environment variables
macro(add_env_definitions option)
  set(value $ENV{${option}})
  if("${value}" STREQUAL "")
    message(WARNING "${option} environment variable is empty. Please set it to appropriate location to get correct results")
  else()
    string(REPLACE "\\" "\\\\" value ${value})
  endif()
  add_definitions("-D${option}=\"${value}\"")
endmacro()

92
# OpenCV fails some tests when 'char' is 'unsigned' by default
93 94
add_extra_compiler_option(-fsigned-char)

95
if(MINGW)
A
Andrey Kamaev 已提交
96
  # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40838
97
  # here we are trying to workaround the problem
98 99 100
  add_extra_compiler_option(-mstackrealign)
  if(NOT HAVE_CXX_MSTACKREALIGN)
    add_extra_compiler_option(-mpreferred-stack-boundary=2)
A
Andrey Kamaev 已提交
101
  endif()
102 103
endif()

104 105 106 107
if(CV_ICC AND NOT ENABLE_FAST_MATH)
  add_extra_compiler_option("-fp-model precise")
endif()

A
Andrey Kamaev 已提交
108
if(CMAKE_COMPILER_IS_GNUCXX)
109
  # High level of warnings.
110
  add_extra_compiler_option(-W)
A
Andrey Kamaev 已提交
111 112
  add_extra_compiler_option(-Wall)
  add_extra_compiler_option(-Werror=return-type)
113
  add_extra_compiler_option(-Werror=non-virtual-dtor)
A
Andrey Kamaev 已提交
114 115 116 117 118 119 120 121 122 123
  add_extra_compiler_option(-Werror=address)
  add_extra_compiler_option(-Werror=sequence-point)
  add_extra_compiler_option(-Wformat)
  add_extra_compiler_option(-Werror=format-security -Wformat)
  add_extra_compiler_option(-Wmissing-declarations)
  add_extra_compiler_option(-Wmissing-prototypes)
  add_extra_compiler_option(-Wstrict-prototypes)
  add_extra_compiler_option(-Wundef)
  add_extra_compiler_option(-Winit-self)
  add_extra_compiler_option(-Wpointer-arith)
124
  add_extra_compiler_option(-Wshadow)
125
  add_extra_compiler_option(-Wsign-promo)
126 127 128 129 130 131 132

  if(ENABLE_NOISY_WARNINGS)
    add_extra_compiler_option(-Wcast-align)
    add_extra_compiler_option(-Wstrict-aliasing=2)
  else()
    add_extra_compiler_option(-Wno-narrowing)
    add_extra_compiler_option(-Wno-delete-non-virtual-dtor)
133
    add_extra_compiler_option(-Wno-unnamed-type-template-args)
M
Maksim Shabunin 已提交
134
    add_extra_compiler_option(-Wno-comment)
135
  endif()
136
  add_extra_compiler_option(-fdiagnostics-show-option)
137

138 139
  # The -Wno-long-long is required in 64bit systems when including sytem headers.
  if(X86_64)
A
Andrey Kamaev 已提交
140
    add_extra_compiler_option(-Wno-long-long)
141 142 143
  endif()

  # We need pthread's
144
  if(UNIX AND NOT ANDROID AND NOT (APPLE AND CMAKE_COMPILER_IS_CLANGCXX))
A
Andrey Kamaev 已提交
145
    add_extra_compiler_option(-pthread)
146 147
  endif()

148 149 150 151
  if(CMAKE_COMPILER_IS_CLANGCXX)
    add_extra_compiler_option(-Qunused-arguments)
  endif()

152
  if(OPENCV_WARNINGS_ARE_ERRORS)
A
Andrey Kamaev 已提交
153
    add_extra_compiler_option(-Werror)
154 155 156
  endif()

  if(X86 AND NOT MINGW64 AND NOT X86_64 AND NOT APPLE)
A
Andrey Kamaev 已提交
157
    add_extra_compiler_option(-march=i686)
158 159
  endif()

160 161 162 163
  if(APPLE)
    add_extra_compiler_option(-Wno-semicolon-before-method-body)
  endif()

164 165
  # Other optimizations
  if(ENABLE_OMIT_FRAME_POINTER)
A
Andrey Kamaev 已提交
166
    add_extra_compiler_option(-fomit-frame-pointer)
167
  else()
A
Andrey Kamaev 已提交
168
    add_extra_compiler_option(-fno-omit-frame-pointer)
169 170
  endif()
  if(ENABLE_FAST_MATH)
A
Andrey Kamaev 已提交
171
    add_extra_compiler_option(-ffast-math)
172 173
  endif()
  if(ENABLE_POWERPC)
A
Andrey Kamaev 已提交
174
    add_extra_compiler_option("-mcpu=G3 -mtune=G5")
175 176
  endif()
  if(ENABLE_SSE)
A
Andrey Kamaev 已提交
177
    add_extra_compiler_option(-msse)
178 179
  endif()
  if(ENABLE_SSE2)
A
Andrey Kamaev 已提交
180
    add_extra_compiler_option(-msse2)
181 182
  elseif(X86 OR X86_64)
    add_extra_compiler_option(-mno-sse2)
183
  endif()
184 185 186
  if(ARM)
    add_extra_compiler_option("-mfp16-format=ieee")
  endif(ARM)
I
Ilya Lavrenov 已提交
187
  if(ENABLE_NEON)
188
    add_extra_compiler_option("-mfpu=neon")
189
  endif()
I
Ilya Lavrenov 已提交
190
  if(ENABLE_VFPV3 AND NOT ENABLE_NEON)
191 192
    add_extra_compiler_option("-mfpu=vfpv3")
  endif()
193 194 195

  # SSE3 and further should be disabled under MingW because it generates compiler errors
  if(NOT MINGW)
196 197
    if(ENABLE_AVX)
      add_extra_compiler_option(-mavx)
198 199
    elseif(X86 OR X86_64)
      add_extra_compiler_option(-mno-avx)
A
Andrey Kamaev 已提交
200
    endif()
I
avx2  
Ilya Lavrenov 已提交
201 202
    if(ENABLE_AVX2)
      add_extra_compiler_option(-mavx2)
I
Ilya Lavrenov 已提交
203 204 205 206

      if(ENABLE_FMA3)
        add_extra_compiler_option(-mfma)
      endif()
I
avx2  
Ilya Lavrenov 已提交
207
    endif()
A
Andrey Kamaev 已提交
208

209 210 211 212
    # GCC depresses SSEx instructions when -mavx is used. Instead, it generates new AVX instructions or AVX equivalence for all SSEx instructions when needed.
    if(NOT OPENCV_EXTRA_CXX_FLAGS MATCHES "-mavx")
      if(ENABLE_SSE3)
        add_extra_compiler_option(-msse3)
213 214
      elseif(X86 OR X86_64)
        add_extra_compiler_option(-mno-sse3)
215
      endif()
A
Andrey Kamaev 已提交
216

217
      if(ENABLE_SSSE3)
A
Andrey Kamaev 已提交
218
        add_extra_compiler_option(-mssse3)
219 220
      elseif(X86 OR X86_64)
        add_extra_compiler_option(-mno-ssse3)
221
      endif()
222 223 224

      if(ENABLE_SSE41)
        add_extra_compiler_option(-msse4.1)
225 226
      elseif(X86 OR X86_64)
        add_extra_compiler_option(-mno-sse4.1)
227 228 229 230
      endif()

      if(ENABLE_SSE42)
        add_extra_compiler_option(-msse4.2)
231 232
      elseif(X86 OR X86_64)
        add_extra_compiler_option(-mno-sse4.2)
233
      endif()
I
sqsum  
Ilya Lavrenov 已提交
234 235 236 237

      if(ENABLE_POPCNT)
        add_extra_compiler_option(-mpopcnt)
      endif()
A
Andrey Kamaev 已提交
238
    endif()
239
  endif(NOT MINGW)
A
Andrey Kamaev 已提交
240

241 242
  if(X86 OR X86_64)
    if(NOT APPLE AND CMAKE_SIZEOF_VOID_P EQUAL 4)
243
      if(OPENCV_EXTRA_CXX_FLAGS MATCHES "-m(sse2|avx)")
A
Andrey Kamaev 已提交
244 245 246 247
        add_extra_compiler_option(-mfpmath=sse)# !! important - be on the same wave with x64 compilers
      else()
        add_extra_compiler_option(-mfpmath=387)
      endif()
A
Andrey Kamaev 已提交
248
    endif()
249
  endif()
A
Andrey Kamaev 已提交
250

251 252
  # Profiling?
  if(ENABLE_PROFILING)
A
Andrey Kamaev 已提交
253
    add_extra_compiler_option("-pg -g")
V
Vadim Pisarevsky 已提交
254
    # turn off incompatible options
A
Andrey Kamaev 已提交
255 256
    foreach(flags CMAKE_CXX_FLAGS CMAKE_C_FLAGS CMAKE_CXX_FLAGS_RELEASE CMAKE_C_FLAGS_RELEASE CMAKE_CXX_FLAGS_DEBUG CMAKE_C_FLAGS_DEBUG
                  OPENCV_EXTRA_FLAGS_RELEASE OPENCV_EXTRA_FLAGS_DEBUG OPENCV_EXTRA_C_FLAGS OPENCV_EXTRA_CXX_FLAGS)
V
Vadim Pisarevsky 已提交
257 258 259
      string(REPLACE "-fomit-frame-pointer" "" ${flags} "${${flags}}")
      string(REPLACE "-ffunction-sections" "" ${flags} "${${flags}}")
    endforeach()
260 261
  elseif(NOT APPLE AND NOT ANDROID)
    # Remove unreferenced functions: function level linking
A
Andrey Kamaev 已提交
262
    add_extra_compiler_option(-ffunction-sections)
263 264
  endif()

A
Alexander Smorkalov 已提交
265 266 267 268 269
  if(ENABLE_COVERAGE)
    set(OPENCV_EXTRA_C_FLAGS "${OPENCV_EXTRA_C_FLAGS} --coverage")
    set(OPENCV_EXTRA_CXX_FLAGS "${OPENCV_EXTRA_CXX_FLAGS} --coverage")
  endif()

270 271 272 273 274
  if(ENABLE_INSTRUMENTATION)
    set(OPENCV_EXTRA_CXX_FLAGS "${OPENCV_EXTRA_CXX_FLAGS} --std=c++11")
    set(WITH_VTK OFF) # There are issues with VTK 6.0
  endif()

A
Andrey Kamaev 已提交
275 276
  set(OPENCV_EXTRA_FLAGS_RELEASE "${OPENCV_EXTRA_FLAGS_RELEASE} -DNDEBUG")
  set(OPENCV_EXTRA_FLAGS_DEBUG "${OPENCV_EXTRA_FLAGS_DEBUG} -O0 -DDEBUG -D_DEBUG")
A
Andrey Kamaev 已提交
277 278 279
endif()

if(MSVC)
A
Andrey Kamaev 已提交
280
  set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS")
V
Vadim Pisarevsky 已提交
281 282
  # 64-bit portability warnings, in MSVC80
  if(MSVC80)
A
Andrey Kamaev 已提交
283
    set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} /Wp64")
V
Vadim Pisarevsky 已提交
284 285 286 287 288 289 290
  endif()

  if(BUILD_WITH_DEBUG_INFO)
    set(OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE "${OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE} /debug")
  endif()

  # Remove unreferenced functions: function level linking
A
Andrey Kamaev 已提交
291
  set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} /Gy")
V
Vadim Pisarevsky 已提交
292
  if(NOT MSVC_VERSION LESS 1400)
A
Andrey Kamaev 已提交
293
    set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} /bigobj")
V
Vadim Pisarevsky 已提交
294 295
  endif()
  if(BUILD_WITH_DEBUG_INFO)
A
Andrey Kamaev 已提交
296
    set(OPENCV_EXTRA_FLAGS_RELEASE "${OPENCV_EXTRA_FLAGS_RELEASE} /Zi")
V
Vadim Pisarevsky 已提交
297 298
  endif()

I
fixes  
Ilya Lavrenov 已提交
299
  if(ENABLE_AVX2 AND NOT MSVC_VERSION LESS 1800)
I
Ilya Lavrenov 已提交
300 301
    set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} /arch:AVX2")
  endif()
I
Ilya Lavrenov 已提交
302 303
  if(ENABLE_AVX AND NOT MSVC_VERSION LESS 1600 AND NOT OPENCV_EXTRA_FLAGS MATCHES "/arch:")
    set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} /arch:AVX")
I
Ilya Lavrenov 已提交
304
  endif()
305

306 307 308 309 310
  if(ENABLE_SSE4_1 AND CV_ICC AND NOT OPENCV_EXTRA_FLAGS MATCHES "/arch:")
    set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} /arch:SSE4.1")
  endif()

  if(ENABLE_SSE3 AND CV_ICC AND NOT OPENCV_EXTRA_FLAGS MATCHES "/arch:")
A
Andrey Kamaev 已提交
311
    set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} /arch:SSE3")
312
  endif()
313 314 315 316 317 318 319 320 321

  if(NOT MSVC64)
    # 64-bit MSVC compiler uses SSE/SSE2 by default
    if(ENABLE_SSE2 AND NOT OPENCV_EXTRA_FLAGS MATCHES "/arch:")
      set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} /arch:SSE2")
    endif()
    if(ENABLE_SSE AND NOT OPENCV_EXTRA_FLAGS MATCHES "/arch:")
      set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} /arch:SSE")
    endif()
322
  endif()
323

I
Ilya Lavrenov 已提交
324
  if(ENABLE_SSE OR ENABLE_SSE2 OR ENABLE_SSE3 OR ENABLE_SSE4_1 OR ENABLE_AVX OR ENABLE_AVX2)
A
Andrey Kamaev 已提交
325
    set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} /Oi")
V
Vadim Pisarevsky 已提交
326
  endif()
327

V
Vadim Pisarevsky 已提交
328 329
  if(X86 OR X86_64)
    if(CMAKE_SIZEOF_VOID_P EQUAL 4 AND ENABLE_SSE2)
330
      set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} /fp:fast") # !! important - be on the same wave with x64 compilers
V
Vadim Pisarevsky 已提交
331
    endif()
332
  endif()
333 334 335 336

  if(OPENCV_WARNINGS_ARE_ERRORS)
    set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} /WX")
  endif()
A
Andrey Kamaev 已提交
337 338
endif()

339 340 341 342 343
if(MSVC12 AND NOT CMAKE_GENERATOR MATCHES "Visual Studio")
  set(OPENCV_EXTRA_C_FLAGS "${OPENCV_EXTRA_C_FLAGS} /FS")
  set(OPENCV_EXTRA_CXX_FLAGS "${OPENCV_EXTRA_CXX_FLAGS} /FS")
endif()

344 345 346 347 348
# Adding additional using directory for WindowsPhone 8.0 to get Windows.winmd properly
if(WINRT_PHONE AND WINRT_8_0)
  set(OPENCV_EXTRA_CXX_FLAGS "${OPENCV_EXTRA_CXX_FLAGS} /AI\$(WindowsSDK_MetadataPath)")
endif()

A
Andrey Kamaev 已提交
349 350
# Extra link libs if the user selects building static libs:
if(NOT BUILD_SHARED_LIBS AND CMAKE_COMPILER_IS_GNUCXX AND NOT ANDROID)
351 352
  # Android does not need these settings because they are already set by toolchain file
  set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} stdc++)
A
Andrey Kamaev 已提交
353
  set(OPENCV_EXTRA_FLAGS "-fPIC ${OPENCV_EXTRA_FLAGS}")
A
Andrey Kamaev 已提交
354 355 356 357
endif()

# Add user supplied extra options (optimization, etc...)
# ==========================================================
358 359 360
set(OPENCV_EXTRA_FLAGS         "${OPENCV_EXTRA_FLAGS}"         CACHE INTERNAL "Extra compiler options")
set(OPENCV_EXTRA_C_FLAGS       "${OPENCV_EXTRA_C_FLAGS}"       CACHE INTERNAL "Extra compiler options for C sources")
set(OPENCV_EXTRA_CXX_FLAGS     "${OPENCV_EXTRA_CXX_FLAGS}"     CACHE INTERNAL "Extra compiler options for C++ sources")
A
Andrey Kamaev 已提交
361
set(OPENCV_EXTRA_FLAGS_RELEASE "${OPENCV_EXTRA_FLAGS_RELEASE}" CACHE INTERNAL "Extra compiler options for Release build")
362 363
set(OPENCV_EXTRA_FLAGS_DEBUG   "${OPENCV_EXTRA_FLAGS_DEBUG}"   CACHE INTERNAL "Extra compiler options for Debug build")
set(OPENCV_EXTRA_EXE_LINKER_FLAGS         "${OPENCV_EXTRA_EXE_LINKER_FLAGS}"         CACHE INTERNAL "Extra linker flags")
A
Andrey Kamaev 已提交
364
set(OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE "${OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE}" CACHE INTERNAL "Extra linker flags for Release build")
365
set(OPENCV_EXTRA_EXE_LINKER_FLAGS_DEBUG   "${OPENCV_EXTRA_EXE_LINKER_FLAGS_DEBUG}"   CACHE INTERNAL "Extra linker flags for Debug build")
A
Andrey Kamaev 已提交
366

367 368 369 370 371 372
# set default visibility to hidden
if(CMAKE_COMPILER_IS_GNUCXX AND CMAKE_OPENCV_GCC_VERSION_NUM GREATER 399)
  add_extra_compiler_option(-fvisibility=hidden)
  add_extra_compiler_option(-fvisibility-inlines-hidden)
endif()

373
if(NOT OPENCV_FP16_DISABLE AND NOT IOS)
374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400
  if(ARM AND ENABLE_NEON)
    set(FP16_OPTION "-mfpu=neon-fp16")
  elseif((X86 OR X86_64) AND NOT MSVC AND ENABLE_AVX)
    set(FP16_OPTION "-mf16c")
  endif()
  try_compile(__VALID_FP16
    "${OpenCV_BINARY_DIR}"
    "${OpenCV_SOURCE_DIR}/cmake/checks/fp16.cpp"
    COMPILE_DEFINITIONS "-DCHECK_FP16" "${FP16_OPTION}"
    OUTPUT_VARIABLE TRY_OUT
    )
  if(NOT __VALID_FP16)
    if((X86 OR X86_64) AND NOT MSVC AND NOT ENABLE_AVX)
      # GCC enables AVX when mf16c is passed
      message(STATUS "FP16: Feature disabled")
    else()
      message(STATUS "FP16: Compiler support is not available")
    endif()
  else()
    message(STATUS "FP16: Compiler support is available")
    set(HAVE_FP16 1)
    if(NOT ${FP16_OPTION} STREQUAL "")
      add_extra_compiler_option(${FP16_OPTION})
    endif()
  endif()
endif()

A
Andrey Kamaev 已提交
401
#combine all "extra" options
402 403
set(CMAKE_C_FLAGS           "${CMAKE_C_FLAGS} ${OPENCV_EXTRA_FLAGS} ${OPENCV_EXTRA_C_FLAGS}")
set(CMAKE_CXX_FLAGS         "${CMAKE_CXX_FLAGS} ${OPENCV_EXTRA_FLAGS} ${OPENCV_EXTRA_CXX_FLAGS}")
A
Andrey Kamaev 已提交
404
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${OPENCV_EXTRA_FLAGS_RELEASE}")
405 406 407 408
set(CMAKE_C_FLAGS_RELEASE   "${CMAKE_C_FLAGS_RELEASE} ${OPENCV_EXTRA_FLAGS_RELEASE}")
set(CMAKE_CXX_FLAGS_DEBUG   "${CMAKE_CXX_FLAGS_DEBUG} ${OPENCV_EXTRA_FLAGS_DEBUG}")
set(CMAKE_C_FLAGS_DEBUG     "${CMAKE_C_FLAGS_DEBUG} ${OPENCV_EXTRA_FLAGS_DEBUG}")
set(CMAKE_EXE_LINKER_FLAGS         "${CMAKE_EXE_LINKER_FLAGS} ${OPENCV_EXTRA_EXE_LINKER_FLAGS}")
A
Andrey Kamaev 已提交
409
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} ${OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE}")
410
set(CMAKE_EXE_LINKER_FLAGS_DEBUG   "${CMAKE_EXE_LINKER_FLAGS_DEBUG} ${OPENCV_EXTRA_EXE_LINKER_FLAGS_DEBUG}")
A
Andrey Kamaev 已提交
411

412 413 414 415 416
if(MSVC)
  # avoid warnings from MSVC about overriding the /W* option
  # we replace /W3 with /W4 only for C++ files,
  # since all the 3rd-party libraries OpenCV uses are in C,
  # and we do not care about their warnings.
417
  string(REPLACE "/W3" "/W4" CMAKE_CXX_FLAGS         "${CMAKE_CXX_FLAGS}")
418
  string(REPLACE "/W3" "/W4" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
419
  string(REPLACE "/W3" "/W4" CMAKE_CXX_FLAGS_DEBUG   "${CMAKE_CXX_FLAGS_DEBUG}")
420

421 422 423 424 425 426 427
  if(NOT ENABLE_NOISY_WARNINGS)
    if(MSVC_VERSION EQUAL 1400)
      ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4510 /wd4610 /wd4312 /wd4201 /wd4244 /wd4328 /wd4267)
    endif()
    if(MSVC_VERSION LESS 1900) # MSVS2015
      ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4127) # warning C4127: conditional expression is constant
    endif()
428 429
  endif()

430 431 432
  # allow extern "C" functions throw exceptions
  foreach(flags CMAKE_C_FLAGS CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_RELEASE CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_DEBUG)
    string(REPLACE "/EHsc-" "/EHs" ${flags} "${${flags}}")
433
    string(REPLACE "/EHsc"  "/EHs" ${flags} "${${flags}}")
434

435 436 437 438
    string(REPLACE "/Zm1000" "" ${flags} "${${flags}}")
  endforeach()

  if(NOT ENABLE_NOISY_WARNINGS)
I
fixes  
Ilya Lavrenov 已提交
439 440
    ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4251) # class 'std::XXX' needs to have dll-interface to be used by clients of YYY
    ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4324) # 'struct_name' : structure was padded due to __declspec(align())
441 442
    ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4275) # non dll-interface class 'std::exception' used as base for dll-interface class 'cv::Exception'
    ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4589) # Constructor of abstract class 'cv::ORB' ignores initializer for virtual base class 'cv::Algorithm'
443
  endif()
A
Alexander Alekhin 已提交
444 445 446 447 448

  if(CV_ICC AND NOT ENABLE_NOISY_WARNINGS)
    foreach(flags CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_DEBUG CMAKE_C_FLAGS CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_DEBUG)
      string(REGEX REPLACE "( |^)/W[0-9]+( |$)" "\\1\\2" ${flags} "${${flags}}")
    endforeach()
449
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Qwd673") # PCH warning
A
Alexander Alekhin 已提交
450
  endif()
R
Roman Donchenko 已提交
451
endif()
A
Alexander Alekhin 已提交
452

453 454 455
if(APPLE AND NOT CMAKE_CROSSCOMPILING AND NOT DEFINED ENV{LDFLAGS} AND EXISTS "/usr/local/lib")
  link_directories("/usr/local/lib")
endif()