OpenCVCompilerOptions.cmake 15.5 KB
Newer Older
1
if(MINGW OR (X86 AND UNIX AND NOT APPLE))
A
Andrey Kamaev 已提交
2 3 4 5 6 7 8 9 10 11 12 13 14 15
  # 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()

16
if(MSVC)
17 18
  string(REGEX REPLACE "^  *| * $" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
  string(REGEX REPLACE "^  *| * $" "" CMAKE_CXX_FLAGS_INIT "${CMAKE_CXX_FLAGS_INIT}")
19 20 21 22 23
  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 已提交
24 25
endif()

A
Andrey Kamaev 已提交
26
set(OPENCV_EXTRA_FLAGS "")
A
Andrey Kamaev 已提交
27
set(OPENCV_EXTRA_C_FLAGS "")
A
Andrey Kamaev 已提交
28 29 30
set(OPENCV_EXTRA_CXX_FLAGS "")
set(OPENCV_EXTRA_FLAGS_RELEASE "")
set(OPENCV_EXTRA_FLAGS_DEBUG "")
A
Andrey Kamaev 已提交
31 32 33 34
set(OPENCV_EXTRA_EXE_LINKER_FLAGS "")
set(OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE "")
set(OPENCV_EXTRA_EXE_LINKER_FLAGS_DEBUG "")

A
Andrey Kamaev 已提交
35
macro(add_extra_compiler_option option)
A
Andrey Kamaev 已提交
36 37 38 39
  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 已提交
40 41 42 43
  if(${_varname})
    set(OPENCV_EXTRA_CXX_FLAGS "${OPENCV_EXTRA_CXX_FLAGS} ${option}")
  endif()

A
Andrey Kamaev 已提交
44
  ocv_check_flag_support(C "${option}" _varname "${OPENCV_EXTRA_C_FLAGS} ${ARGN}")
A
Andrey Kamaev 已提交
45 46 47 48 49
  if(${_varname})
    set(OPENCV_EXTRA_C_FLAGS "${OPENCV_EXTRA_C_FLAGS} ${option}")
  endif()
endmacro()

50 51 52 53 54 55 56 57 58 59 60 61
# 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()

62
# OpenCV fails some tests when 'char' is 'unsigned' by default
63 64
add_extra_compiler_option(-fsigned-char)

65
if(MINGW)
A
Andrey Kamaev 已提交
66
  # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40838
67
  # here we are trying to workaround the problem
68 69 70
  add_extra_compiler_option(-mstackrealign)
  if(NOT HAVE_CXX_MSTACKREALIGN)
    add_extra_compiler_option(-mpreferred-stack-boundary=2)
A
Andrey Kamaev 已提交
71
  endif()
72 73
endif()

A
Andrey Kamaev 已提交
74
if(CMAKE_COMPILER_IS_GNUCXX)
75
  # High level of warnings.
76
  add_extra_compiler_option(-W)
A
Andrey Kamaev 已提交
77 78
  add_extra_compiler_option(-Wall)
  add_extra_compiler_option(-Werror=return-type)
79
  add_extra_compiler_option(-Werror=non-virtual-dtor)
A
Andrey Kamaev 已提交
80 81 82 83 84 85 86 87 88 89
  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)
90
  add_extra_compiler_option(-Wshadow)
91
  add_extra_compiler_option(-Wsign-promo)
92 93 94 95 96 97 98

  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)
99
    add_extra_compiler_option(-Wno-unnamed-type-template-args)
M
Maksim Shabunin 已提交
100
    add_extra_compiler_option(-Wno-comment)
101
  endif()
102
  add_extra_compiler_option(-fdiagnostics-show-option)
103

104 105
  # The -Wno-long-long is required in 64bit systems when including sytem headers.
  if(X86_64)
A
Andrey Kamaev 已提交
106
    add_extra_compiler_option(-Wno-long-long)
107 108 109
  endif()

  # We need pthread's
110
  if(UNIX AND NOT ANDROID AND NOT (APPLE AND CMAKE_COMPILER_IS_CLANGCXX))
A
Andrey Kamaev 已提交
111
    add_extra_compiler_option(-pthread)
112 113
  endif()

114 115 116 117
  if(CMAKE_COMPILER_IS_CLANGCXX)
    add_extra_compiler_option(-Qunused-arguments)
  endif()

118
  if(OPENCV_WARNINGS_ARE_ERRORS)
A
Andrey Kamaev 已提交
119
    add_extra_compiler_option(-Werror)
120 121 122
  endif()

  if(X86 AND NOT MINGW64 AND NOT X86_64 AND NOT APPLE)
A
Andrey Kamaev 已提交
123
    add_extra_compiler_option(-march=i686)
124 125
  endif()

126 127 128 129
  if(APPLE)
    add_extra_compiler_option(-Wno-semicolon-before-method-body)
  endif()

130 131
  # Other optimizations
  if(ENABLE_OMIT_FRAME_POINTER)
A
Andrey Kamaev 已提交
132
    add_extra_compiler_option(-fomit-frame-pointer)
133
  else()
A
Andrey Kamaev 已提交
134
    add_extra_compiler_option(-fno-omit-frame-pointer)
135 136
  endif()
  if(ENABLE_FAST_MATH)
A
Andrey Kamaev 已提交
137
    add_extra_compiler_option(-ffast-math)
138 139
  endif()
  if(ENABLE_POWERPC)
A
Andrey Kamaev 已提交
140
    add_extra_compiler_option("-mcpu=G3 -mtune=G5")
141 142
  endif()
  if(ENABLE_SSE)
A
Andrey Kamaev 已提交
143
    add_extra_compiler_option(-msse)
144 145
  endif()
  if(ENABLE_SSE2)
A
Andrey Kamaev 已提交
146
    add_extra_compiler_option(-msse2)
147 148
  elseif(X86 OR X86_64)
    add_extra_compiler_option(-mno-sse2)
149
  endif()
150 151 152
  if(ARM)
    add_extra_compiler_option("-mfp16-format=ieee")
  endif(ARM)
I
Ilya Lavrenov 已提交
153
  if(ENABLE_NEON)
154
    add_extra_compiler_option("-mfpu=neon")
155
  endif()
I
Ilya Lavrenov 已提交
156
  if(ENABLE_VFPV3 AND NOT ENABLE_NEON)
157 158
    add_extra_compiler_option("-mfpu=vfpv3")
  endif()
159 160 161

  # SSE3 and further should be disabled under MingW because it generates compiler errors
  if(NOT MINGW)
162 163
    if(ENABLE_AVX)
      add_extra_compiler_option(-mavx)
164 165
    elseif(X86 OR X86_64)
      add_extra_compiler_option(-mno-avx)
A
Andrey Kamaev 已提交
166
    endif()
I
avx2  
Ilya Lavrenov 已提交
167 168
    if(ENABLE_AVX2)
      add_extra_compiler_option(-mavx2)
I
Ilya Lavrenov 已提交
169 170 171 172

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

175 176 177 178
    # 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)
179 180
      elseif(X86 OR X86_64)
        add_extra_compiler_option(-mno-sse3)
181
      endif()
A
Andrey Kamaev 已提交
182

183
      if(ENABLE_SSSE3)
A
Andrey Kamaev 已提交
184
        add_extra_compiler_option(-mssse3)
185 186
      elseif(X86 OR X86_64)
        add_extra_compiler_option(-mno-ssse3)
187
      endif()
188 189 190

      if(ENABLE_SSE41)
        add_extra_compiler_option(-msse4.1)
191 192
      elseif(X86 OR X86_64)
        add_extra_compiler_option(-mno-sse4.1)
193 194 195 196
      endif()

      if(ENABLE_SSE42)
        add_extra_compiler_option(-msse4.2)
197 198
      elseif(X86 OR X86_64)
        add_extra_compiler_option(-mno-sse4.2)
199
      endif()
I
sqsum  
Ilya Lavrenov 已提交
200 201 202 203

      if(ENABLE_POPCNT)
        add_extra_compiler_option(-mpopcnt)
      endif()
A
Andrey Kamaev 已提交
204
    endif()
205
  endif(NOT MINGW)
A
Andrey Kamaev 已提交
206

207 208
  if(X86 OR X86_64)
    if(NOT APPLE AND CMAKE_SIZEOF_VOID_P EQUAL 4)
209
      if(OPENCV_EXTRA_CXX_FLAGS MATCHES "-m(sse2|avx)")
A
Andrey Kamaev 已提交
210 211 212 213
        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 已提交
214
    endif()
215
  endif()
A
Andrey Kamaev 已提交
216

217 218
  # Profiling?
  if(ENABLE_PROFILING)
A
Andrey Kamaev 已提交
219
    add_extra_compiler_option("-pg -g")
V
Vadim Pisarevsky 已提交
220
    # turn off incompatible options
A
Andrey Kamaev 已提交
221 222
    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 已提交
223 224 225
      string(REPLACE "-fomit-frame-pointer" "" ${flags} "${${flags}}")
      string(REPLACE "-ffunction-sections" "" ${flags} "${${flags}}")
    endforeach()
226 227
  elseif(NOT APPLE AND NOT ANDROID)
    # Remove unreferenced functions: function level linking
A
Andrey Kamaev 已提交
228
    add_extra_compiler_option(-ffunction-sections)
229 230
  endif()

A
Alexander Smorkalov 已提交
231 232 233 234 235
  if(ENABLE_COVERAGE)
    set(OPENCV_EXTRA_C_FLAGS "${OPENCV_EXTRA_C_FLAGS} --coverage")
    set(OPENCV_EXTRA_CXX_FLAGS "${OPENCV_EXTRA_CXX_FLAGS} --coverage")
  endif()

236 237 238 239 240
  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 已提交
241 242
  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 已提交
243 244 245
endif()

if(MSVC)
A
Andrey Kamaev 已提交
246
  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 已提交
247 248
  # 64-bit portability warnings, in MSVC80
  if(MSVC80)
A
Andrey Kamaev 已提交
249
    set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} /Wp64")
V
Vadim Pisarevsky 已提交
250 251 252 253 254 255 256
  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 已提交
257
  set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} /Gy")
V
Vadim Pisarevsky 已提交
258
  if(NOT MSVC_VERSION LESS 1400)
A
Andrey Kamaev 已提交
259
    set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} /bigobj")
V
Vadim Pisarevsky 已提交
260 261
  endif()
  if(BUILD_WITH_DEBUG_INFO)
A
Andrey Kamaev 已提交
262
    set(OPENCV_EXTRA_FLAGS_RELEASE "${OPENCV_EXTRA_FLAGS_RELEASE} /Zi")
V
Vadim Pisarevsky 已提交
263 264
  endif()

I
fixes  
Ilya Lavrenov 已提交
265
  if(ENABLE_AVX2 AND NOT MSVC_VERSION LESS 1800)
I
Ilya Lavrenov 已提交
266 267
    set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} /arch:AVX2")
  endif()
I
Ilya Lavrenov 已提交
268 269
  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 已提交
270
  endif()
271

272 273 274 275 276
  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 已提交
277
    set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} /arch:SSE3")
278
  endif()
279 280 281 282 283 284 285 286 287

  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()
288
  endif()
289

I
Ilya Lavrenov 已提交
290
  if(ENABLE_SSE OR ENABLE_SSE2 OR ENABLE_SSE3 OR ENABLE_SSE4_1 OR ENABLE_AVX OR ENABLE_AVX2)
A
Andrey Kamaev 已提交
291
    set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} /Oi")
V
Vadim Pisarevsky 已提交
292
  endif()
293

V
Vadim Pisarevsky 已提交
294 295
  if(X86 OR X86_64)
    if(CMAKE_SIZEOF_VOID_P EQUAL 4 AND ENABLE_SSE2)
296
      set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} /fp:fast") # !! important - be on the same wave with x64 compilers
V
Vadim Pisarevsky 已提交
297
    endif()
298
  endif()
299 300 301 302

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

305 306 307 308 309
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()

310 311 312 313 314
# 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 已提交
315 316
# Extra link libs if the user selects building static libs:
if(NOT BUILD_SHARED_LIBS AND CMAKE_COMPILER_IS_GNUCXX AND NOT ANDROID)
317 318
  # 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 已提交
319
  set(OPENCV_EXTRA_FLAGS "-fPIC ${OPENCV_EXTRA_FLAGS}")
A
Andrey Kamaev 已提交
320 321 322 323
endif()

# Add user supplied extra options (optimization, etc...)
# ==========================================================
324 325 326
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 已提交
327
set(OPENCV_EXTRA_FLAGS_RELEASE "${OPENCV_EXTRA_FLAGS_RELEASE}" CACHE INTERNAL "Extra compiler options for Release build")
328 329
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 已提交
330
set(OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE "${OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE}" CACHE INTERNAL "Extra linker flags for Release build")
331
set(OPENCV_EXTRA_EXE_LINKER_FLAGS_DEBUG   "${OPENCV_EXTRA_EXE_LINKER_FLAGS_DEBUG}"   CACHE INTERNAL "Extra linker flags for Debug build")
A
Andrey Kamaev 已提交
332

333 334 335 336 337 338
# 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()

339
if(NOT OPENCV_FP16_DISABLE AND NOT IOS)
340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366
  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 已提交
367
#combine all "extra" options
368 369
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 已提交
370
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${OPENCV_EXTRA_FLAGS_RELEASE}")
371 372 373 374
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 已提交
375
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} ${OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE}")
376
set(CMAKE_EXE_LINKER_FLAGS_DEBUG   "${CMAKE_EXE_LINKER_FLAGS_DEBUG} ${OPENCV_EXTRA_EXE_LINKER_FLAGS_DEBUG}")
A
Andrey Kamaev 已提交
377

378 379 380 381 382
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.
383
  string(REPLACE "/W3" "/W4" CMAKE_CXX_FLAGS         "${CMAKE_CXX_FLAGS}")
384
  string(REPLACE "/W3" "/W4" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
385
  string(REPLACE "/W3" "/W4" CMAKE_CXX_FLAGS_DEBUG   "${CMAKE_CXX_FLAGS_DEBUG}")
386

387
  if(NOT ENABLE_NOISY_WARNINGS AND MSVC_VERSION EQUAL 1400)
I
fixes  
Ilya Lavrenov 已提交
388
    ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4510 /wd4610 /wd4312 /wd4201 /wd4244 /wd4328 /wd4267)
389 390
  endif()

391 392 393
  # 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}}")
394
    string(REPLACE "/EHsc"  "/EHs" ${flags} "${${flags}}")
395

396 397 398 399
    string(REPLACE "/Zm1000" "" ${flags} "${${flags}}")
  endforeach()

  if(NOT ENABLE_NOISY_WARNINGS)
I
fixes  
Ilya Lavrenov 已提交
400 401
    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())
402 403
    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'
404
  endif()
R
Roman Donchenko 已提交
405
endif()
A
Alexander Alekhin 已提交
406

407 408 409
if(APPLE AND NOT CMAKE_CROSSCOMPILING AND NOT DEFINED ENV{LDFLAGS} AND EXISTS "/usr/local/lib")
  link_directories("/usr/local/lib")
endif()