0027196: CMake - avoid setting option -EHa for compilers other than MSVC
[occt.git] / adm / cmake / occt_defs_flags.cmake
1 ##
2
3 if(FLAGS_ALREADY_INCLUDED)
4   return()
5 endif()
6 set(FLAGS_ALREADY_INCLUDED 1)
7
8 # force option -fp:precise for Visual Studio projects.
9 #
10 # Note that while this option is default for MSVC compiler, Visual Studio
11 # project can be switched later to use Intel Compiler (ICC).
12 # Enforcing -fp:precise ensures that in such case ICC will use correct
13 # option instead of its default -fp:fast which is harmful for OCCT.
14 if (MSVC)
15   set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fp:precise")
16   set (CMAKE_C_FLAGS   "${CMAKE_C_FLAGS}   -fp:precise")
17 endif()
18
19 # set compiler short name and choose SSE2 option for appropriate MSVC compilers
20 # ONLY for 32-bit
21 if (NOT CMAKE_SIZEOF_VOID_P EQUAL 8)
22   if (MSVC80 OR MSVC90 OR MSVC10)
23     set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:SSE2")
24     set (CMAKE_C_FLAGS   "${CMAKE_C_FLAGS}   /arch:SSE2")
25   endif()
26 endif()
27
28 if (WIN32)
29   add_definitions (-D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE)
30 else()
31   set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexceptions -fPIC")
32   set (CMAKE_C_FLAGS   "${CMAKE_C_FLAGS}   -fexceptions -fPIC")
33   add_definitions(-DOCC_CONVERT_SIGNALS)
34 endif()
35
36 # enable structured exceptions for MSVC
37 string (REGEX MATCH "EHsc" ISFLAG "${CMAKE_CXX_FLAGS}")
38 if (ISFLAG)
39   string (REGEX REPLACE "EHsc" "EHa" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
40 elseif (MSVC)
41   set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -EHa")
42 endif()
43
44 # remove _WINDOWS flag if it exists
45 string (REGEX MATCH "/D_WINDOWS" IS_WINDOWSFLAG "${CMAKE_CXX_FLAGS}")
46 if (IS_WINDOWSFLAG)
47   message (STATUS "Info: /D_WINDOWS has been removed from CMAKE_CXX_FLAGS")
48   string (REGEX REPLACE "/D_WINDOWS" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
49 endif()
50
51 # remove WIN32 flag if it exists
52 string (REGEX MATCH "/DWIN32" IS_WIN32FLAG "${CMAKE_CXX_FLAGS}")
53 if (IS_WIN32FLAG)
54   message (STATUS "Info: /DWIN32 has been removed from CMAKE_CXX_FLAGS")
55   string (REGEX REPLACE "/DWIN32" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
56 endif()
57
58 # remove _WINDOWS flag if it exists
59 string (REGEX MATCH "/D_WINDOWS" IS_WINDOWSFLAG "${CMAKE_C_FLAGS}")
60 if (IS_WINDOWSFLAG)
61   message (STATUS "Info: /D_WINDOWS has been removed from CMAKE_C_FLAGS")
62   string (REGEX REPLACE "/D_WINDOWS" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
63 endif()
64
65 # remove WIN32 flag if it exists
66 string (REGEX MATCH "/DWIN32" IS_WIN32FLAG "${CMAKE_C_FLAGS}")
67 if (IS_WIN32FLAG)
68   message (STATUS "Info: /DWIN32 has been removed from CMAKE_C_FLAGS")
69   string (REGEX REPLACE "/DWIN32" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
70 endif()
71
72 # remove DEBUG flag if it exists
73 string (REGEX MATCH "-DDEBUG" IS_DEBUG_CXX "${CMAKE_CXX_FLAGS_DEBUG}")
74 if (IS_DEBUG_CXX)
75   message (STATUS "Info: -DDEBUG has been removed from CMAKE_CXX_FLAGS_DEBUG")
76   string (REGEX REPLACE "-DDEBUG" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
77 endif()
78
79 string (REGEX MATCH "-DDEBUG" IS_DEBUG_C "${CMAKE_C_FLAGS_DEBUG}")
80 if (IS_DEBUG_C)
81   message (STATUS "Info: -DDEBUG has been removed from CMAKE_C_FLAGS_DEBUG")
82   string (REGEX REPLACE "-DDEBUG" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
83 endif()
84 # enable parallel compilation on MSVC 9 and above
85 if (MSVC AND NOT MSVC70 AND NOT MSVC80)
86   set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -MP")
87 endif()
88
89 # generate a single response file which enlist all of the object files
90 SET(CMAKE_C_USE_RESPONSE_FILE_FOR_OBJECTS 1)
91 SET(CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS 1)
92 # increase compiler warnings level (-W4 for MSVC, -Wextra for GCC)
93 if (MSVC)
94   if (CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
95     string (REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
96   else()
97     set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
98   endif()
99 elseif (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
100   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")
101   if (BUILD_SHARED_LIBS)
102     if (APPLE)
103       set (CMAKE_SHARED_LINKER_FLAGS "-lm ${CMAKE_SHARED_LINKER_FLAGS}")
104     else()
105       set (CMAKE_SHARED_LINKER_FLAGS "-lm -z defs ${CMAKE_SHARED_LINKER_FLAGS}")
106     endif()
107   else()
108     if (NOT ANDROID)
109       set (CMAKE_STATIC_LINKER_FLAGS "-lm ${CMAKE_SHARED_STATIC_FLAGS}")
110     endif()
111   endif()
112 endif()
113
114 if (DEFINED CMAKE_COMPILER_IS_GNUCXX OR "x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xClang")
115   set (CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS}")
116 endif()
117
118 # Optimize size of binaries
119 if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR MINGW)
120   set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s")
121   set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -s")
122 endif()
123
124 set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DNo_Exception")
125 set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNo_Exception")