Skip to content

Commit e2a99d2

Browse files
committed
Merge pull request opencv#10813 from alalek:cmake_cxx_flags
2 parents 601e3aa + 9e298ea commit e2a99d2

File tree

4 files changed

+65
-100
lines changed

4 files changed

+65
-100
lines changed

CMakeLists.txt

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ OCV_OPTION(BUILD_EXAMPLES "Build all examples"
280280
OCV_OPTION(BUILD_PACKAGE "Enables 'make package_source' command" ON IF NOT WINRT)
281281
OCV_OPTION(BUILD_PERF_TESTS "Build performance tests" ON IF (NOT APPLE_FRAMEWORK) )
282282
OCV_OPTION(BUILD_TESTS "Build accuracy & regression tests" ON IF (NOT APPLE_FRAMEWORK) )
283-
OCV_OPTION(BUILD_WITH_DEBUG_INFO "Include debug info into debug libs (not MSCV only)" ON )
283+
OCV_OPTION(BUILD_WITH_DEBUG_INFO "Include debug info into debug libs (not MSVC only)" ON )
284284
OCV_OPTION(BUILD_WITH_STATIC_CRT "Enables use of statically linked CRT for statically linked OpenCV" ON IF MSVC )
285285
OCV_OPTION(BUILD_WITH_DYNAMIC_IPP "Enables dynamic linking of IPP (only for standalone IPP)" OFF )
286286
OCV_OPTION(BUILD_FAT_JAVA_LIB "Create Java wrapper exporting all functions of OpenCV library (requires static build of OpenCV modules)" ANDROID IF NOT BUILD_SHARED_LIBS)
@@ -538,20 +538,6 @@ endif()
538538

539539
include(cmake/OpenCVCompilerOptions.cmake)
540540

541-
542-
# ----------------------------------------------------------------------------
543-
# Use statically or dynamically linked CRT?
544-
# Default: dynamic
545-
# ----------------------------------------------------------------------------
546-
if(MSVC)
547-
include(cmake/OpenCVCRTLinkage.cmake)
548-
endif(MSVC)
549-
550-
if(WIN32 AND NOT MINGW)
551-
add_definitions(-D_VARIADIC_MAX=10)
552-
endif(WIN32 AND NOT MINGW)
553-
554-
555541
# ----------------------------------------------------------------------------
556542
# CHECK FOR SYSTEM LIBRARIES, OPTIONS, ETC..
557543
# ----------------------------------------------------------------------------
@@ -800,6 +786,9 @@ include(cmake/OpenCVExtraTargets.cmake)
800786
# opencv.hpp and legacy headers
801787
add_subdirectory(include)
802788

789+
# Enable compiler options for OpenCV modules/apps/samples only (ignore 3rdparty)
790+
ocv_add_modules_compiler_options()
791+
803792
# OpenCV modules
804793
add_subdirectory(modules)
805794

cmake/OpenCVCRTLinkage.cmake

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# Use statically or dynamically linked CRT?
2+
13
if(NOT MSVC)
24
message(FATAL_ERROR "CRT options are available only for MSVC")
35
endif()

cmake/OpenCVCompilerOptions.cmake

Lines changed: 54 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -28,26 +28,6 @@ if((CMAKE_COMPILER_IS_CLANGCXX OR CMAKE_COMPILER_IS_CLANGCC OR CMAKE_COMPILER_IS
2828
set(ENABLE_PRECOMPILED_HEADERS OFF CACHE BOOL "" FORCE)
2929
endif()
3030

31-
if(MSVC)
32-
string(STRIP "${CMAKE_CXX_FLAGS}" CMAKE_CXX_FLAGS)
33-
string(STRIP "${CMAKE_CXX_FLAGS_INIT}" CMAKE_CXX_FLAGS_INIT)
34-
if(CMAKE_CXX_FLAGS STREQUAL CMAKE_CXX_FLAGS_INIT)
35-
# override cmake default exception handling option
36-
string(REPLACE "/EHsc" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
37-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHa")
38-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" CACHE STRING "Flags used by the compiler during all build types." FORCE)
39-
endif()
40-
endif()
41-
42-
set(OPENCV_EXTRA_FLAGS "")
43-
set(OPENCV_EXTRA_C_FLAGS "")
44-
set(OPENCV_EXTRA_CXX_FLAGS "")
45-
set(OPENCV_EXTRA_FLAGS_RELEASE "")
46-
set(OPENCV_EXTRA_FLAGS_DEBUG "")
47-
set(OPENCV_EXTRA_EXE_LINKER_FLAGS "")
48-
set(OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE "")
49-
set(OPENCV_EXTRA_EXE_LINKER_FLAGS_DEBUG "")
50-
5131
macro(add_extra_compiler_option option)
5232
ocv_check_flag_support(CXX "${option}" _varname "${OPENCV_EXTRA_CXX_FLAGS} ${ARGN}")
5333
if(${_varname})
@@ -78,16 +58,9 @@ macro(add_env_definitions option)
7858
add_definitions("-D${option}=\"${value}\"")
7959
endmacro()
8060

81-
# OpenCV fails some tests when 'char' is 'unsigned' by default
82-
add_extra_compiler_option(-fsigned-char)
83-
84-
if(MINGW)
85-
# http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40838
86-
# here we are trying to workaround the problem
87-
add_extra_compiler_option(-mstackrealign)
88-
if(NOT HAVE_CXX_MSTACKREALIGN)
89-
add_extra_compiler_option(-mpreferred-stack-boundary=2)
90-
endif()
61+
if(NOT MSVC)
62+
# OpenCV fails some tests when 'char' is 'unsigned' by default
63+
add_extra_compiler_option(-fsigned-char)
9164
endif()
9265

9366
if(CV_ICC AND NOT ENABLE_FAST_MATH)
@@ -152,10 +125,6 @@ if(CMAKE_COMPILER_IS_GNUCXX)
152125
add_extra_compiler_option(-Werror)
153126
endif()
154127

155-
if(X86 AND NOT MINGW64 AND NOT X86_64 AND NOT APPLE)
156-
add_extra_compiler_option(-march=i686)
157-
endif()
158-
159128
if(APPLE)
160129
add_extra_compiler_option(-Wno-semicolon-before-method-body)
161130
endif()
@@ -196,23 +165,30 @@ if(CMAKE_COMPILER_IS_GNUCXX)
196165
endif()
197166

198167
if(ENABLE_INSTRUMENTATION)
199-
set(OPENCV_EXTRA_CXX_FLAGS "${OPENCV_EXTRA_CXX_FLAGS} --std=c++11")
168+
if(NOT HAVE_CXX11)
169+
message(WARNING "ENABLE_INSTRUMENTATION requires C++11 support")
170+
endif()
200171
set(WITH_VTK OFF) # There are issues with VTK 6.0
201172
endif()
202173

203174
if(ENABLE_LTO)
204175
add_extra_compiler_option(-flto)
205176
endif()
206-
207177
if(ENABLE_THIN_LTO)
208178
add_extra_compiler_option(-flto=thin)
209179
endif()
210180

211181
set(OPENCV_EXTRA_FLAGS_RELEASE "${OPENCV_EXTRA_FLAGS_RELEASE} -DNDEBUG")
212-
if(NOT " ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG} " MATCHES "-O")
182+
if(NOT " ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG} ${OPENCV_EXTRA_FLAGS_DEBUG} " MATCHES "-O")
213183
set(OPENCV_EXTRA_FLAGS_DEBUG "${OPENCV_EXTRA_FLAGS_DEBUG} -O0")
214184
endif()
215185
set(OPENCV_EXTRA_FLAGS_DEBUG "${OPENCV_EXTRA_FLAGS_DEBUG} -DDEBUG -D_DEBUG")
186+
187+
if(BUILD_WITH_DEBUG_INFO)
188+
if(NOT " ${CMAKE_CXX_FLAGS} ${OPENCV_EXTRA_CXX_FLAGS}" MATCHES " -g")
189+
set(OPENCV_EXTRA_CXX_FLAGS "${OPENCV_EXTRA_CXX_FLAGS} -g")
190+
endif()
191+
endif()
216192
endif()
217193

218194
if(MSVC)
@@ -221,11 +197,6 @@ if(MSVC)
221197
set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS")
222198
#endif()
223199

224-
# 64-bit portability warnings, in MSVC80
225-
if(MSVC80)
226-
set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} /Wp64")
227-
endif()
228-
229200
if(BUILD_WITH_DEBUG_INFO)
230201
set(OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE "${OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE} /debug")
231202
endif()
@@ -248,11 +219,10 @@ if(MSVC)
248219
set(OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE "${OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE} /LTCG")
249220
endif()
250221

251-
endif()
252-
253-
if(MSVC12 AND NOT CMAKE_GENERATOR MATCHES "Visual Studio")
254-
set(OPENCV_EXTRA_C_FLAGS "${OPENCV_EXTRA_C_FLAGS} /FS")
255-
set(OPENCV_EXTRA_CXX_FLAGS "${OPENCV_EXTRA_CXX_FLAGS} /FS")
222+
if(NOT MSVC_VERSION LESS 1800 AND NOT CMAKE_GENERATOR MATCHES "Visual Studio")
223+
set(OPENCV_EXTRA_C_FLAGS "${OPENCV_EXTRA_C_FLAGS} /FS")
224+
set(OPENCV_EXTRA_CXX_FLAGS "${OPENCV_EXTRA_CXX_FLAGS} /FS")
225+
endif()
256226
endif()
257227

258228
# Adding additional using directory for WindowsPhone 8.0 to get Windows.winmd properly
@@ -261,68 +231,55 @@ if(WINRT_PHONE AND WINRT_8_0)
261231
endif()
262232

263233
include(cmake/OpenCVCompilerOptimizations.cmake)
264-
265234
if(COMMAND ocv_compiler_optimization_options)
266235
ocv_compiler_optimization_options()
267236
endif()
268-
269237
if(COMMAND ocv_compiler_optimization_options_finalize)
270238
ocv_compiler_optimization_options_finalize()
271239
endif()
272240

273-
# Add user supplied extra options (optimization, etc...)
274-
# ==========================================================
275-
set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS}" CACHE INTERNAL "Extra compiler options")
276-
set(OPENCV_EXTRA_C_FLAGS "${OPENCV_EXTRA_C_FLAGS}" CACHE INTERNAL "Extra compiler options for C sources")
277-
set(OPENCV_EXTRA_CXX_FLAGS "${OPENCV_EXTRA_CXX_FLAGS}" CACHE INTERNAL "Extra compiler options for C++ sources")
278-
set(OPENCV_EXTRA_FLAGS_RELEASE "${OPENCV_EXTRA_FLAGS_RELEASE}" CACHE INTERNAL "Extra compiler options for Release build")
279-
set(OPENCV_EXTRA_FLAGS_DEBUG "${OPENCV_EXTRA_FLAGS_DEBUG}" CACHE INTERNAL "Extra compiler options for Debug build")
280-
set(OPENCV_EXTRA_EXE_LINKER_FLAGS "${OPENCV_EXTRA_EXE_LINKER_FLAGS}" CACHE INTERNAL "Extra linker flags")
281-
set(OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE "${OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE}" CACHE INTERNAL "Extra linker flags for Release build")
282-
set(OPENCV_EXTRA_EXE_LINKER_FLAGS_DEBUG "${OPENCV_EXTRA_EXE_LINKER_FLAGS_DEBUG}" CACHE INTERNAL "Extra linker flags for Debug build")
283-
284241
# set default visibility to hidden
285242
if((CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
286243
AND NOT OPENCV_SKIP_VISIBILITY_HIDDEN
287-
AND NOT CMAKE_CXX_FLAGS MATCHES "-fvisibility")
244+
AND NOT " ${CMAKE_CXX_FLAGS} ${OPENCV_EXTRA_FLAGS} ${OPENCV_EXTRA_CXX_FLAGS}" MATCHES " -fvisibility")
288245
add_extra_compiler_option(-fvisibility=hidden)
289246
add_extra_compiler_option(-fvisibility-inlines-hidden)
290247
endif()
291248

292-
#combine all "extra" options
293-
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OPENCV_EXTRA_FLAGS} ${OPENCV_EXTRA_C_FLAGS}")
294-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OPENCV_EXTRA_FLAGS} ${OPENCV_EXTRA_CXX_FLAGS}")
295-
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${OPENCV_EXTRA_FLAGS_RELEASE}")
296-
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} ${OPENCV_EXTRA_FLAGS_RELEASE}")
297-
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${OPENCV_EXTRA_FLAGS_DEBUG}")
298-
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${OPENCV_EXTRA_FLAGS_DEBUG}")
299-
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OPENCV_EXTRA_EXE_LINKER_FLAGS}")
300-
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} ${OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE}")
301-
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} ${OPENCV_EXTRA_EXE_LINKER_FLAGS_DEBUG}")
249+
# combine all "extra" options
250+
if(NOT OPENCV_SKIP_EXTRA_COMPILER_FLAGS)
251+
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OPENCV_EXTRA_FLAGS} ${OPENCV_EXTRA_C_FLAGS}")
252+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OPENCV_EXTRA_FLAGS} ${OPENCV_EXTRA_CXX_FLAGS}")
253+
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${OPENCV_EXTRA_FLAGS_RELEASE}")
254+
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} ${OPENCV_EXTRA_FLAGS_RELEASE}")
255+
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${OPENCV_EXTRA_FLAGS_DEBUG}")
256+
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${OPENCV_EXTRA_FLAGS_DEBUG}")
257+
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OPENCV_EXTRA_EXE_LINKER_FLAGS}")
258+
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} ${OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE}")
259+
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} ${OPENCV_EXTRA_EXE_LINKER_FLAGS_DEBUG}")
260+
endif()
302261

303262
if(MSVC)
304-
# avoid warnings from MSVC about overriding the /W* option
305-
# we replace /W3 with /W4 only for C++ files,
306-
# since all the 3rd-party libraries OpenCV uses are in C,
307-
# and we do not care about their warnings.
308-
string(REPLACE "/W3" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
309-
string(REPLACE "/W3" "/W4" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
310-
string(REPLACE "/W3" "/W4" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
311-
312263
if(NOT ENABLE_NOISY_WARNINGS)
313264
if(MSVC_VERSION EQUAL 1400)
314265
ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4510 /wd4610 /wd4312 /wd4201 /wd4244 /wd4328 /wd4267)
315266
endif()
316267
endif()
317268

318-
# allow extern "C" functions throw exceptions
319269
foreach(flags CMAKE_C_FLAGS CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_RELEASE CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_DEBUG)
320-
string(REPLACE "/EHsc-" "/EHs" ${flags} "${${flags}}")
321-
string(REPLACE "/EHsc" "/EHs" ${flags} "${${flags}}")
322-
323270
string(REPLACE "/Zm1000" "" ${flags} "${${flags}}")
324271
endforeach()
325272

273+
# Enable 'extern "C"' and asynchronous (division by zero, access violation) exceptions
274+
if(NOT OPENCV_SKIP_MSVC_EXCEPTIONS_FLAG)
275+
foreach(flags CMAKE_C_FLAGS CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_RELEASE CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_DEBUG)
276+
string(REGEX REPLACE " /EH[^ ]* " " " ${flags} " ${${flags}}")
277+
endforeach()
278+
if(NOT " ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE} ${CMAKE_CXX_FLAGS_DEBUG}" MATCHES " /EH")
279+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHa")
280+
endif()
281+
endif()
282+
326283
if(NOT ENABLE_NOISY_WARNINGS)
327284
ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4127) # conditional expression is constant
328285
ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4251) # class 'std::XXX' needs to have dll-interface to be used by clients of YYY
@@ -344,7 +301,20 @@ if(APPLE AND NOT CMAKE_CROSSCOMPILING AND NOT DEFINED ENV{LDFLAGS} AND EXISTS "/
344301
link_directories("/usr/local/lib")
345302
endif()
346303

347-
348304
if(ENABLE_BUILD_HARDENING)
349305
include(${CMAKE_CURRENT_LIST_DIR}/OpenCVCompilerDefenses.cmake)
350306
endif()
307+
308+
if(MSVC)
309+
include(cmake/OpenCVCRTLinkage.cmake)
310+
add_definitions(-D_VARIADIC_MAX=10)
311+
endif()
312+
313+
# Enable compiler options for OpenCV modules/apps/samples only (ignore 3rdparty)
314+
macro(ocv_add_modules_compiler_options)
315+
if(MSVC AND NOT OPENCV_SKIP_MSVC_W4_OPTION)
316+
foreach(flags CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_DEBUG)
317+
string(REPLACE "/W3" "/W4" ${flags} "${${flags}}")
318+
endforeach()
319+
endif()
320+
endmacro()

modules/python/src2/cv2.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
#if defined(_MSC_VER) && (_MSC_VER >= 1800)
22
// eliminating duplicated round() declaration
33
#define HAVE_ROUND 1
4+
#pragma warning(push)
5+
#pragma warning(disable:5033) // 'register' is no longer a supported storage class
46
#endif
5-
67
#include <Python.h>
8+
#if defined(_MSC_VER) && (_MSC_VER >= 1800)
9+
#pragma warning(pop)
10+
#endif
711

812
#define MODULESTR "cv2"
913
#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION

0 commit comments

Comments
 (0)