0031606: Configuration, CMake - build fails with Android NDK + CLang compiler + MinGW...
[occt.git] / adm / cmake / occt_defs_flags.cmake
index fb70c15..0ed941e 100644 (file)
@@ -5,21 +5,26 @@ if(FLAGS_ALREADY_INCLUDED)
 endif()
 set(FLAGS_ALREADY_INCLUDED 1)
 
+# 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")
+  set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /fp:precise")
+  set (CMAKE_C_FLAGS   "${CMAKE_C_FLAGS}   /fp:precise")
 endif()
 
-# set compiler short name and choose SSE2 option for appropriate MSVC compilers
-# ONLY for 32-bit
+# add SSE2 option for old MSVC compilers (VS 2005 - 2010, 32 bit only)
 if (NOT CMAKE_SIZEOF_VOID_P EQUAL 8)
-  if (MSVC80 OR MSVC90 OR MSVC10)
+  if (MSVC AND ((MSVC_VERSION EQUAL 1400) OR (MSVC_VERSION EQUAL 1500) OR (MSVC_VERSION EQUAL 1600)))
     set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:SSE2")
     set (CMAKE_C_FLAGS   "${CMAKE_C_FLAGS}   /arch:SSE2")
   endif()
 endif()
 
-if (WIN32)
+if (MSVC)
   add_definitions (-D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE)
 else()
   set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexceptions -fPIC")
@@ -31,8 +36,8 @@ endif()
 string (REGEX MATCH "EHsc" ISFLAG "${CMAKE_CXX_FLAGS}")
 if (ISFLAG)
   string (REGEX REPLACE "EHsc" "EHa" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
-elseif (WIN32)
-  set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -EHa")
+elseif (MSVC)
+  set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHa")
 endif()
 
 # remove _WINDOWS flag if it exists
@@ -76,13 +81,18 @@ if (IS_DEBUG_C)
   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")
+if (MSVC AND (MSVC_VERSION GREATER 1400))
+  set (CMAKE_CXX_FLAGS "${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)
+if (NOT DEFINED CMAKE_C_USE_RESPONSE_FILE_FOR_OBJECTS)
+  SET(CMAKE_C_USE_RESPONSE_FILE_FOR_OBJECTS 1)
+endif()
+if (NOT DEFINED CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS)
+  SET(CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS 1)
+endif()
+
 # increase compiler warnings level (-W4 for MSVC, -Wextra for GCC)
 if (MSVC)
   if (CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
@@ -95,25 +105,52 @@ elseif (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMP
   if (BUILD_SHARED_LIBS)
     if (APPLE)
       set (CMAKE_SHARED_LINKER_FLAGS "-lm ${CMAKE_SHARED_LINKER_FLAGS}")
-    else()
-      set (CMAKE_SHARED_LINKER_FLAGS "-lm -z defs ${CMAKE_SHARED_LINKER_FLAGS}")
-    endif()
-  else()
-    if (NOT ANDROID)
-      set (CMAKE_STATIC_LINKER_FLAGS "-lm ${CMAKE_SHARED_STATIC_FLAGS}")
+    elseif(NOT WIN32)
+      set (CMAKE_SHARED_LINKER_FLAGS "-lm ${CMAKE_SHARED_LINKER_FLAGS}")
     endif()
   endif()
 endif()
 
-if (DEFINED CMAKE_COMPILER_IS_GNUCXX OR "x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xClang")
-  set (CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS}")
-endif()
+if ("x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xClang")
+  if (APPLE)
+    # CLang can be used with both libstdc++ and libc++, however on OS X libstdc++ is outdated.
+    set (CMAKE_CXX_FLAGS "-std=c++0x -stdlib=libc++ ${CMAKE_CXX_FLAGS}")
+  elseif(NOT WIN32)
+    # CLang for Windows (at least CLang 8.0 distributed with VS 2019)
+    # does not support option "-std=c++0x"
+    set (CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS}")
+  endif()
+  # Optimize size of binaries
+  set (CMAKE_SHARED_LINKER_FLAGS "-Wl,-s ${CMAKE_SHARED_LINKER_FLAGS}")
+elseif(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()
+
+  add_definitions(-D_WIN32_WINNT=0x0501)
+  # workaround bugs in mingw with vtable export
+  set (CMAKE_SHARED_LINKER_FLAGS "-Wl,--export-all-symbols")
 
-# Optimize size of binaries
-if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR MINGW)
+  # Require C++11
+  set (CMAKE_CXX_FLAGS "-std=gnu++0x ${CMAKE_CXX_FLAGS}")
+  # Optimize size of binaries
+  set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s")
+  set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -s")
+elseif (DEFINED CMAKE_COMPILER_IS_GNUCXX)
+  # Require C++11
+  set (CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS}")
+  # Optimize size of binaries
   set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s")
   set (CMAKE_C_FLAGS_RELEASE "${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")
\ No newline at end of file
+if (BUILD_RELEASE_DISABLE_EXCEPTIONS)
+  set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DNo_Exception")
+  set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNo_Exception")
+endif()