endif()
set(FLAGS_ALREADY_INCLUDED 1)
-# force option /fp:precise for Visual Studio projects.
+# this macro adds new flag to a cache variable is being connected with compiler
+macro (ADD_CONTENT_IF_IT_ABSENT USER_VARIABLE USER_CONTENT)
+
+ separate_arguments (USER_CONTENT)
+
+ foreach (CURRENT_USER_CONTENT ${USER_CONTENT})
+ if (NOT "${CURRENT_USER_CONTENT}" STREQUAL "")
+ set (HAS_CONTENT OFF)
+ foreach (COMPILER_OPTION_SPECIFICATOR "/" "-") # there are two compiler option specificators / (msvc) and - (msvc and others)
+ set (FULL_USER_CONTENT "${COMPILER_OPTION_SPECIFICATOR}${CURRENT_USER_CONTENT}")
+ string (REGEX MATCH "${FULL_USER_CONTENT}" HAS_CURRENT_CONTENT "${${USER_VARIABLE}}")
+ if (HAS_CURRENT_CONTENT)
+ set (HAS_CONTENT ON)
+ endif()
+ endforeach()
+
+ if (NOT HAS_CONTENT)
+ if (MSVC)
+ set (FULL_USER_CONTENT "/${CURRENT_USER_CONTENT}")
+ else()
+ set (FULL_USER_CONTENT "-${CURRENT_USER_CONTENT}")
+ endif()
+
+ message (STATUS "Info: ${FULL_USER_CONTENT} added to ${USER_VARIABLE}")
+ get_property(USER_VARIABLE_DOCSTRING CACHE ${USER_VARIABLE} PROPERTY HELPSTRING)
+ set (${USER_VARIABLE} "${${USER_VARIABLE}} ${FULL_USER_CONTENT}" CACHE STRING "${USER_VARIABLE_DOCSTRING}" FORCE)
+ endif()
+ endforeach()
+ endif()
+endmacro()
+
+# this macro replaces a specific flag with new one in a cache variable is being connected with compiler
+macro (REPLACE_CONTENT_IF_IT_IS USER_VARIABLE USER_CONTENT NEW_USER_CONTENT)
+ foreach (COMPILER_OPTION_SPECIFICATOR "/" "-") # there are two compiler option specificators / (msvc) and - (msvc and others)
+ set (FULL_USER_CONTENT "${COMPILER_OPTION_SPECIFICATOR}${USER_CONTENT}")
+ string (REGEX MATCH "${FULL_USER_CONTENT}" HAS_CONTENT "${${USER_VARIABLE}}")
+ if (HAS_CONTENT)
+ if ("${NEW_USER_CONTENT}" STREQUAL "")
+ message (STATUS "Info: ${FULL_USER_CONTENT} removed from ${USER_VARIABLE}")
+ set (FULL_NEW_USER_CONTENT "${NEW_USER_CONTENT}")
+ else()
+ set (FULL_NEW_USER_CONTENT "${COMPILER_OPTION_SPECIFICATOR}${NEW_USER_CONTENT}")
+ message (STATUS "Info: ${FULL_USER_CONTENT} replaced with ${FULL_NEW_USER_CONTENT} in ${USER_VARIABLE}")
+ endif()
+
+ string (REGEX REPLACE "${FULL_USER_CONTENT}" "${FULL_NEW_USER_CONTENT}" ${USER_VARIABLE} "${${USER_VARIABLE}}")
+
+ get_property(USER_VARIABLE_DOCSTRING CACHE ${USER_VARIABLE} PROPERTY HELPSTRING)
+ set (${USER_VARIABLE} "${${USER_VARIABLE}}" CACHE STRING "${USER_VARIABLE_DOCSTRING}" FORCE)
+ endif()
+ endforeach()
+endmacro()
+
+# force option -fp:precise for Visual Studio projects.
#
# Note that while this option is default for MSVC compiler, Visual Studio
# project can be switched later to use Intel Compiler (ICC).
# Enforcing -fp:precise ensures that in such case ICC will use correct
# option instead of its default -fp:fast which is harmful for OCCT.
if (MSVC)
- set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /fp:precise")
- set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /fp:precise")
+ ADD_CONTENT_IF_IT_ABSENT (CMAKE_CXX_FLAGS "fp:precise")
+ ADD_CONTENT_IF_IT_ABSENT (CMAKE_C_FLAGS "fp:precise")
endif()
# set compiler short name and choose SSE2 option for appropriate MSVC compilers
# ONLY for 32-bit
if (NOT CMAKE_SIZEOF_VOID_P EQUAL 8)
if (MSVC80 OR MSVC90 OR MSVC10)
- set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:SSE2")
- set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /arch:SSE2")
+ ADD_CONTENT_IF_IT_ABSENT (CMAKE_CXX_FLAGS "arch:SSE2")
+ ADD_CONTENT_IF_IT_ABSENT (CMAKE_C_FLAGS "arch:SSE2")
endif()
endif()
if (WIN32)
add_definitions (-D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE)
else()
- set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexceptions -fPIC")
- set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fexceptions -fPIC")
+ ADD_CONTENT_IF_IT_ABSENT (CMAKE_CXX_FLAGS "fPIC fexceptions")
+ ADD_CONTENT_IF_IT_ABSENT (CMAKE_C_FLAGS "fPIC fexceptions")
+
add_definitions(-DOCC_CONVERT_SIGNALS)
endif()
# enable structured exceptions for MSVC
-string (REGEX MATCH "EHsc" ISFLAG "${CMAKE_CXX_FLAGS}")
-if (ISFLAG)
- string (REGEX REPLACE "EHsc" "EHa" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
-elseif (MSVC)
- set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHa")
-endif()
-
-# remove _WINDOWS flag if it exists
-string (REGEX MATCH "/D_WINDOWS" IS_WINDOWSFLAG "${CMAKE_CXX_FLAGS}")
-if (IS_WINDOWSFLAG)
- message (STATUS "Info: /D_WINDOWS has been removed from CMAKE_CXX_FLAGS")
- string (REGEX REPLACE "/D_WINDOWS" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
+REPLACE_CONTENT_IF_IT_IS (CMAKE_CXX_FLAGS "EHsc" "EHa")
+if (MSVC)
+ ADD_CONTENT_IF_IT_ABSENT (CMAKE_CXX_FLAGS "EHa")
endif()
-# remove WIN32 flag if it exists
-string (REGEX MATCH "/DWIN32" IS_WIN32FLAG "${CMAKE_CXX_FLAGS}")
-if (IS_WIN32FLAG)
- message (STATUS "Info: /DWIN32 has been removed from CMAKE_CXX_FLAGS")
- string (REGEX REPLACE "/DWIN32" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
-endif()
+# remove _WINDOWS, WIN32 flag if they are
+REPLACE_CONTENT_IF_IT_IS (CMAKE_CXX_FLAGS "D_WINDOWS" "")
+REPLACE_CONTENT_IF_IT_IS (CMAKE_CXX_FLAGS "DWIN32" "")
-# remove _WINDOWS flag if it exists
-string (REGEX MATCH "/D_WINDOWS" IS_WINDOWSFLAG "${CMAKE_C_FLAGS}")
-if (IS_WINDOWSFLAG)
- message (STATUS "Info: /D_WINDOWS has been removed from CMAKE_C_FLAGS")
- string (REGEX REPLACE "/D_WINDOWS" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
-endif()
-
-# remove WIN32 flag if it exists
-string (REGEX MATCH "/DWIN32" IS_WIN32FLAG "${CMAKE_C_FLAGS}")
-if (IS_WIN32FLAG)
- message (STATUS "Info: /DWIN32 has been removed from CMAKE_C_FLAGS")
- string (REGEX REPLACE "/DWIN32" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
-endif()
+REPLACE_CONTENT_IF_IT_IS (CMAKE_C_FLAGS "D_WINDOWS" "")
+REPLACE_CONTENT_IF_IT_IS (CMAKE_C_FLAGS "DWIN32" "")
# remove DEBUG flag if it exists
-string (REGEX MATCH "-DDEBUG" IS_DEBUG_CXX "${CMAKE_CXX_FLAGS_DEBUG}")
-if (IS_DEBUG_CXX)
- message (STATUS "Info: -DDEBUG has been removed from CMAKE_CXX_FLAGS_DEBUG")
- string (REGEX REPLACE "-DDEBUG" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
-endif()
+REPLACE_CONTENT_IF_IT_IS (CMAKE_CXX_FLAGS_DEBUG "DDEBUG" "")
+REPLACE_CONTENT_IF_IT_IS (CMAKE_C_FLAGS_DEBUG "DDEBUG" "")
-string (REGEX MATCH "-DDEBUG" IS_DEBUG_C "${CMAKE_C_FLAGS_DEBUG}")
-if (IS_DEBUG_C)
- message (STATUS "Info: -DDEBUG has been removed from CMAKE_C_FLAGS_DEBUG")
- string (REGEX REPLACE "-DDEBUG" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
-endif()
# enable parallel compilation on MSVC 9 and above
+
if (MSVC AND NOT MSVC70 AND NOT MSVC80)
- set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
+ ADD_CONTENT_IF_IT_ABSENT (CMAKE_CXX_FLAGS "MP")
endif()
# generate a single response file which enlist all of the object files
SET(CMAKE_C_USE_RESPONSE_FILE_FOR_OBJECTS 1)
SET(CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS 1)
+
# increase compiler warnings level (-W4 for MSVC, -Wextra for GCC)
if (MSVC)
- if (CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
- string (REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
- else()
- set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
- endif()
+ REPLACE_CONTENT_IF_IT_IS (CMAKE_CXX_FLAGS "W[0-3]" "")
+ ADD_CONTENT_IF_IT_ABSENT (CMAKE_CXX_FLAGS "W4")
elseif (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")
+ ADD_CONTENT_IF_IT_ABSENT (CMAKE_CXX_FLAGS "Wextra Wall")
if (BUILD_SHARED_LIBS)
- if (APPLE)
- set (CMAKE_SHARED_LINKER_FLAGS "-lm ${CMAKE_SHARED_LINKER_FLAGS}")
- elseif(NOT WIN32)
- set (CMAKE_SHARED_LINKER_FLAGS "-lm ${CMAKE_SHARED_LINKER_FLAGS}")
+ if(NOT WIN32)
+ ADD_CONTENT_IF_IT_ABSENT (CMAKE_SHARED_LINKER_FLAGS "lm")
endif()
endif()
endif()
# Set default release optimization option to O2 instead of O3, since in
# some OCCT related examples, this gives significantly smaller binaries
# at comparable performace with MinGW-w64.
- string (REGEX MATCH "-O3" IS_O3_CXX "${CMAKE_CXX_FLAGS_RELEASE}")
- if (IS_O3_CXX)
- string (REGEX REPLACE "-O3" "-O2" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
- else()
- set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O2")
- endif()
+ REPLACE_CONTENT_IF_IT_IS (CMAKE_CXX_FLAGS_RELEASE "O3" "O2")
+ ADD_CONTENT_IF_IT_ABSENT (CMAKE_CXX_FLAGS_RELEASE "O2")
+
+ ADD_CONTENT_IF_IT_ABSENT (CMAKE_CXX_FLAGS "std=gnu++0x")
- set (CMAKE_CXX_FLAGS "-std=gnu++0x ${CMAKE_CXX_FLAGS}")
add_definitions(-D_WIN32_WINNT=0x0501)
+
# workaround bugs in mingw with vtable export
- set (CMAKE_SHARED_LINKER_FLAGS "-Wl,--export-all-symbols")
+ ADD_CONTENT_IF_IT_ABSENT (CMAKE_SHARED_LINKER_FLAGS "Wl,--export-all-symbols")
+
elseif (DEFINED CMAKE_COMPILER_IS_GNUCXX OR "x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xClang")
- set (CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS}")
+ ADD_CONTENT_IF_IT_ABSENT (CMAKE_CXX_FLAGS "std=c++0x")
endif()
# Optimize size of binaries
if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR MINGW)
- set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s")
- set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -s")
+ ADD_CONTENT_IF_IT_ABSENT (CMAKE_CXX_FLAGS_RELEASE "s")
+ ADD_CONTENT_IF_IT_ABSENT (CMAKE_C_FLAGS_RELEASE "s")
endif()
-set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DNo_Exception")
-set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNo_Exception")
+ADD_CONTENT_IF_IT_ABSENT (CMAKE_CXX_FLAGS_RELEASE "DNo_Exception")
+ADD_CONTENT_IF_IT_ABSENT (CMAKE_C_FLAGS_RELEASE "DNo_Exception")