OpenCVCompilerOptions.cmake 16.8 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()

A
Andrey Kamaev 已提交
104
if(CMAKE_COMPILER_IS_GNUCXX)
105
  # High level of warnings.
106
  add_extra_compiler_option(-W)
A
Andrey Kamaev 已提交
107 108
  add_extra_compiler_option(-Wall)
  add_extra_compiler_option(-Werror=return-type)
109
  add_extra_compiler_option(-Werror=non-virtual-dtor)
A
Andrey Kamaev 已提交
110 111 112 113 114 115 116 117 118 119
  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)
120
  add_extra_compiler_option(-Wshadow)
121
  add_extra_compiler_option(-Wsign-promo)
122 123 124 125 126 127 128

  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)
129
    add_extra_compiler_option(-Wno-unnamed-type-template-args)
M
Maksim Shabunin 已提交
130
    add_extra_compiler_option(-Wno-comment)
131
  endif()
132
  add_extra_compiler_option(-fdiagnostics-show-option)
133

134 135
  # The -Wno-long-long is required in 64bit systems when including sytem headers.
  if(X86_64)
A
Andrey Kamaev 已提交
136
    add_extra_compiler_option(-Wno-long-long)
137 138 139
  endif()

  # We need pthread's
140
  if(UNIX AND NOT ANDROID AND NOT (APPLE AND CMAKE_COMPILER_IS_CLANGCXX))
A
Andrey Kamaev 已提交
141
    add_extra_compiler_option(-pthread)
142 143
  endif()

144 145 146 147
  if(CMAKE_COMPILER_IS_CLANGCXX)
    add_extra_compiler_option(-Qunused-arguments)
  endif()

148
  if(OPENCV_WARNINGS_ARE_ERRORS)
A
Andrey Kamaev 已提交
149
    add_extra_compiler_option(-Werror)
150 151 152
  endif()

  if(X86 AND NOT MINGW64 AND NOT X86_64 AND NOT APPLE)
A
Andrey Kamaev 已提交
153
    add_extra_compiler_option(-march=i686)
154 155
  endif()

156 157 158 159
  if(APPLE)
    add_extra_compiler_option(-Wno-semicolon-before-method-body)
  endif()

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

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

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

205 206 207 208
    # 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)
209 210
      elseif(X86 OR X86_64)
        add_extra_compiler_option(-mno-sse3)
211
      endif()
A
Andrey Kamaev 已提交
212

213
      if(ENABLE_SSSE3)
A
Andrey Kamaev 已提交
214
        add_extra_compiler_option(-mssse3)
215 216
      elseif(X86 OR X86_64)
        add_extra_compiler_option(-mno-ssse3)
217
      endif()
218 219 220

      if(ENABLE_SSE41)
        add_extra_compiler_option(-msse4.1)
221 222
      elseif(X86 OR X86_64)
        add_extra_compiler_option(-mno-sse4.1)
223 224 225 226
      endif()

      if(ENABLE_SSE42)
        add_extra_compiler_option(-msse4.2)
227 228
      elseif(X86 OR X86_64)
        add_extra_compiler_option(-mno-sse4.2)
229
      endif()
I
sqsum  
Ilya Lavrenov 已提交
230 231 232 233

      if(ENABLE_POPCNT)
        add_extra_compiler_option(-mpopcnt)
      endif()
A
Andrey Kamaev 已提交
234
    endif()
235
  endif(NOT MINGW)
A
Andrey Kamaev 已提交
236

237 238
  if(X86 OR X86_64)
    if(NOT APPLE AND CMAKE_SIZEOF_VOID_P EQUAL 4)
239
      if(OPENCV_EXTRA_CXX_FLAGS MATCHES "-m(sse2|avx)")
A
Andrey Kamaev 已提交
240 241 242 243
        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 已提交
244
    endif()
245
  endif()
A
Andrey Kamaev 已提交
246

247 248
  # Profiling?
  if(ENABLE_PROFILING)
A
Andrey Kamaev 已提交
249
    add_extra_compiler_option("-pg -g")
V
Vadim Pisarevsky 已提交
250
    # turn off incompatible options
A
Andrey Kamaev 已提交
251 252
    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 已提交
253 254 255
      string(REPLACE "-fomit-frame-pointer" "" ${flags} "${${flags}}")
      string(REPLACE "-ffunction-sections" "" ${flags} "${${flags}}")
    endforeach()
256 257
  elseif(NOT APPLE AND NOT ANDROID)
    # Remove unreferenced functions: function level linking
A
Andrey Kamaev 已提交
258
    add_extra_compiler_option(-ffunction-sections)
259 260
  endif()

A
Alexander Smorkalov 已提交
261 262 263 264 265
  if(ENABLE_COVERAGE)
    set(OPENCV_EXTRA_C_FLAGS "${OPENCV_EXTRA_C_FLAGS} --coverage")
    set(OPENCV_EXTRA_CXX_FLAGS "${OPENCV_EXTRA_CXX_FLAGS} --coverage")
  endif()

266 267 268 269 270
  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 已提交
271 272
  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 已提交
273 274 275
endif()

if(MSVC)
A
Andrey Kamaev 已提交
276
  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 已提交
277 278
  # 64-bit portability warnings, in MSVC80
  if(MSVC80)
A
Andrey Kamaev 已提交
279
    set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} /Wp64")
V
Vadim Pisarevsky 已提交
280 281 282 283 284 285 286
  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 已提交
287
  set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} /Gy")
V
Vadim Pisarevsky 已提交
288
  if(NOT MSVC_VERSION LESS 1400)
A
Andrey Kamaev 已提交
289
    set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} /bigobj")
V
Vadim Pisarevsky 已提交
290 291
  endif()
  if(BUILD_WITH_DEBUG_INFO)
A
Andrey Kamaev 已提交
292
    set(OPENCV_EXTRA_FLAGS_RELEASE "${OPENCV_EXTRA_FLAGS_RELEASE} /Zi")
V
Vadim Pisarevsky 已提交
293 294
  endif()

I
fixes  
Ilya Lavrenov 已提交
295
  if(ENABLE_AVX2 AND NOT MSVC_VERSION LESS 1800)
I
Ilya Lavrenov 已提交
296 297
    set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} /arch:AVX2")
  endif()
I
Ilya Lavrenov 已提交
298 299
  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 已提交
300
  endif()
301

302 303 304 305 306
  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 已提交
307
    set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} /arch:SSE3")
308
  endif()
309 310 311 312 313 314 315 316 317

  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()
318
  endif()
319

I
Ilya Lavrenov 已提交
320
  if(ENABLE_SSE OR ENABLE_SSE2 OR ENABLE_SSE3 OR ENABLE_SSE4_1 OR ENABLE_AVX OR ENABLE_AVX2)
A
Andrey Kamaev 已提交
321
    set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} /Oi")
V
Vadim Pisarevsky 已提交
322
  endif()
323

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

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

335 336 337 338 339
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()

340 341 342 343 344
# 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 已提交
345 346
# Extra link libs if the user selects building static libs:
if(NOT BUILD_SHARED_LIBS AND CMAKE_COMPILER_IS_GNUCXX AND NOT ANDROID)
347 348
  # 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 已提交
349
  set(OPENCV_EXTRA_FLAGS "-fPIC ${OPENCV_EXTRA_FLAGS}")
A
Andrey Kamaev 已提交
350 351 352 353
endif()

# Add user supplied extra options (optimization, etc...)
# ==========================================================
354 355 356
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 已提交
357
set(OPENCV_EXTRA_FLAGS_RELEASE "${OPENCV_EXTRA_FLAGS_RELEASE}" CACHE INTERNAL "Extra compiler options for Release build")
358 359
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 已提交
360
set(OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE "${OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE}" CACHE INTERNAL "Extra linker flags for Release build")
361
set(OPENCV_EXTRA_EXE_LINKER_FLAGS_DEBUG   "${OPENCV_EXTRA_EXE_LINKER_FLAGS_DEBUG}"   CACHE INTERNAL "Extra linker flags for Debug build")
A
Andrey Kamaev 已提交
362

363 364 365 366 367 368
# 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()

369
if(NOT OPENCV_FP16_DISABLE AND NOT IOS)
370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396
  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 已提交
397
#combine all "extra" options
398 399
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 已提交
400
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${OPENCV_EXTRA_FLAGS_RELEASE}")
401 402 403 404
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 已提交
405
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} ${OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE}")
406
set(CMAKE_EXE_LINKER_FLAGS_DEBUG   "${CMAKE_EXE_LINKER_FLAGS_DEBUG} ${OPENCV_EXTRA_EXE_LINKER_FLAGS_DEBUG}")
A
Andrey Kamaev 已提交
407

408 409 410 411 412
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.
413
  string(REPLACE "/W3" "/W4" CMAKE_CXX_FLAGS         "${CMAKE_CXX_FLAGS}")
414
  string(REPLACE "/W3" "/W4" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
415
  string(REPLACE "/W3" "/W4" CMAKE_CXX_FLAGS_DEBUG   "${CMAKE_CXX_FLAGS_DEBUG}")
416

417
  if(NOT ENABLE_NOISY_WARNINGS AND MSVC_VERSION EQUAL 1400)
I
fixes  
Ilya Lavrenov 已提交
418
    ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4510 /wd4610 /wd4312 /wd4201 /wd4244 /wd4328 /wd4267)
419 420
  endif()

421 422 423
  # 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}}")
424
    string(REPLACE "/EHsc"  "/EHs" ${flags} "${${flags}}")
425

426 427 428 429
    string(REPLACE "/Zm1000" "" ${flags} "${${flags}}")
  endforeach()

  if(NOT ENABLE_NOISY_WARNINGS)
I
fixes  
Ilya Lavrenov 已提交
430 431
    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())
432 433
    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'
434
  endif()
R
Roman Donchenko 已提交
435
endif()
A
Alexander Alekhin 已提交
436

437 438 439
if(APPLE AND NOT CMAKE_CROSSCOMPILING AND NOT DEFINED ENV{LDFLAGS} AND EXISTS "/usr/local/lib")
  link_directories("/usr/local/lib")
endif()