484002d1aa1bf01973a03d61fadaceaabd1ad7f4
[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 # add SSE2 option for old MSVC compilers (VS 2005 - 2010, 32 bit only)
20 if (NOT CMAKE_SIZEOF_VOID_P EQUAL 8)
21   if (MSVC AND ((MSVC_VERSION EQUAL 1400) OR (MSVC_VERSION EQUAL 1500) OR (MSVC_VERSION EQUAL 1600)))
22     set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:SSE2")
23     set (CMAKE_C_FLAGS   "${CMAKE_C_FLAGS}   /arch:SSE2")
24   endif()
25 endif()
26
27 if (MSVC)
28   add_definitions (-D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE)
29 else()
30   set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexceptions -fPIC")
31   set (CMAKE_C_FLAGS   "${CMAKE_C_FLAGS}   -fexceptions -fPIC")
32   add_definitions(-DOCC_CONVERT_SIGNALS)
33 endif()
34
35 # enable structured exceptions for MSVC
36 string (REGEX MATCH "EHsc" ISFLAG "${CMAKE_CXX_FLAGS}")
37 if (ISFLAG)
38   string (REGEX REPLACE "EHsc" "EHa" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
39 elseif (MSVC)
40   set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHa")
41 endif()
42
43 # remove _WINDOWS flag if it exists
44 string (REGEX MATCH "/D_WINDOWS" IS_WINDOWSFLAG "${CMAKE_CXX_FLAGS}")
45 if (IS_WINDOWSFLAG)
46   message (STATUS "Info: /D_WINDOWS has been removed from CMAKE_CXX_FLAGS")
47   string (REGEX REPLACE "/D_WINDOWS" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
48 endif()
49
50 # remove WIN32 flag if it exists
51 string (REGEX MATCH "/DWIN32" IS_WIN32FLAG "${CMAKE_CXX_FLAGS}")
52 if (IS_WIN32FLAG)
53   message (STATUS "Info: /DWIN32 has been removed from CMAKE_CXX_FLAGS")
54   string (REGEX REPLACE "/DWIN32" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
55 endif()
56
57 # remove _WINDOWS flag if it exists
58 string (REGEX MATCH "/D_WINDOWS" IS_WINDOWSFLAG "${CMAKE_C_FLAGS}")
59 if (IS_WINDOWSFLAG)
60   message (STATUS "Info: /D_WINDOWS has been removed from CMAKE_C_FLAGS")
61   string (REGEX REPLACE "/D_WINDOWS" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
62 endif()
63
64 # remove WIN32 flag if it exists
65 string (REGEX MATCH "/DWIN32" IS_WIN32FLAG "${CMAKE_C_FLAGS}")
66 if (IS_WIN32FLAG)
67   message (STATUS "Info: /DWIN32 has been removed from CMAKE_C_FLAGS")
68   string (REGEX REPLACE "/DWIN32" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
69 endif()
70
71 # remove DEBUG flag if it exists
72 string (REGEX MATCH "-DDEBUG" IS_DEBUG_CXX "${CMAKE_CXX_FLAGS_DEBUG}")
73 if (IS_DEBUG_CXX)
74   message (STATUS "Info: -DDEBUG has been removed from CMAKE_CXX_FLAGS_DEBUG")
75   string (REGEX REPLACE "-DDEBUG" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
76 endif()
77
78 string (REGEX MATCH "-DDEBUG" IS_DEBUG_C "${CMAKE_C_FLAGS_DEBUG}")
79 if (IS_DEBUG_C)
80   message (STATUS "Info: -DDEBUG has been removed from CMAKE_C_FLAGS_DEBUG")
81   string (REGEX REPLACE "-DDEBUG" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
82 endif()
83 # enable parallel compilation on MSVC 9 and above
84 if (MSVC AND (MSVC_VERSION GREATER 1400))
85   set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
86 endif()
87
88 # generate a single response file which enlist all of the object files
89 if (NOT DEFINED CMAKE_C_USE_RESPONSE_FILE_FOR_OBJECTS)
90   SET(CMAKE_C_USE_RESPONSE_FILE_FOR_OBJECTS 1)
91 endif()
92 if (NOT DEFINED CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS)
93   SET(CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS 1)
94 endif()
95
96 # increase compiler warnings level (-W4 for MSVC, -Wextra for GCC)
97 if (MSVC)
98   if (CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
99     string (REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
100   else()
101     set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
102   endif()
103 elseif (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
104   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")
105   if (BUILD_SHARED_LIBS)
106     if (APPLE)
107       set (CMAKE_SHARED_LINKER_FLAGS "-lm ${CMAKE_SHARED_LINKER_FLAGS}")
108     elseif(NOT WIN32)
109       set (CMAKE_SHARED_LINKER_FLAGS "-lm ${CMAKE_SHARED_LINKER_FLAGS}")
110     endif()
111   endif()
112 endif()
113
114 if(MINGW)
115   # Set default release optimization option to O2 instead of O3, since in
116   # some OCCT related examples, this gives significantly smaller binaries
117   # at comparable performace with MinGW-w64.
118   string (REGEX MATCH "-O3" IS_O3_CXX "${CMAKE_CXX_FLAGS_RELEASE}")
119   if (IS_O3_CXX)
120     string (REGEX REPLACE "-O3" "-O2" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
121   else()
122     set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O2")
123   endif()
124
125   set (CMAKE_CXX_FLAGS "-std=gnu++0x ${CMAKE_CXX_FLAGS}")
126   add_definitions(-D_WIN32_WINNT=0x0501)
127   # workaround bugs in mingw with vtable export
128   set (CMAKE_SHARED_LINKER_FLAGS "-Wl,--export-all-symbols")
129 elseif ("x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xClang")
130   if (APPLE)
131     # CLang can be used with both libstdc++ and libc++, however on OS X libstdc++ is outdated.
132     set (CMAKE_CXX_FLAGS "-std=c++0x -stdlib=libc++ ${CMAKE_CXX_FLAGS}")
133   elseif(NOT WIN32)
134     # CLang for Windows (at least CLang 8.0 distributed with VS 2019) 
135     # does not support option "-std=c++0x"
136     set (CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS}")
137   endif()
138 elseif (DEFINED CMAKE_COMPILER_IS_GNUCXX)
139   set (CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS}")
140 endif()
141
142 # Optimize size of binaries
143 if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR MINGW)
144   set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s")
145   set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -s")
146 endif()
147
148 if (BUILD_RELEASE_DISABLE_EXCEPTIONS)
149   set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DNo_Exception")
150   set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNo_Exception")
151 endif()