]> OCCT Git - occt-copy.git/commitdiff
0027319: Configuration, Cmake - cmake's c/cxx corresponding flags are not updated... CR27319
authoribs <ibs@opencascade.com>
Wed, 30 Mar 2016 09:03:13 +0000 (12:03 +0300)
committeribs <ibs@opencascade.com>
Fri, 29 Apr 2016 21:47:24 +0000 (00:47 +0300)
update the corresponding variables by force

adm/cmake/occt_defs_flags.cmake

index 65fff6e721151e5dba546c5392eeb36ea621f519..b8f7d7dd60d0d4c858cbac827d87eb4c6a594572 100644 (file)
@@ -5,104 +5,124 @@ if(FLAGS_ALREADY_INCLUDED)
 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()
@@ -111,26 +131,25 @@ if(MINGW)
   # 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")