3 if(FLAGS_ALREADY_INCLUDED)
6 set(FLAGS_ALREADY_INCLUDED 1)
8 # force option /fp:precise for Visual Studio projects.
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.
15 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /fp:precise")
16 set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /fp:precise")
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")
28 add_definitions (-D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE)
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)
35 # enable structured exceptions for MSVC
36 string (REGEX MATCH "EHsc" ISFLAG "${CMAKE_CXX_FLAGS}")
38 string (REGEX REPLACE "EHsc" "EHa" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
40 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHa")
43 # remove _WINDOWS flag if it exists
44 string (REGEX MATCH "/D_WINDOWS" IS_WINDOWSFLAG "${CMAKE_CXX_FLAGS}")
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}")
50 # remove WIN32 flag if it exists
51 string (REGEX MATCH "/DWIN32" IS_WIN32FLAG "${CMAKE_CXX_FLAGS}")
53 message (STATUS "Info: /DWIN32 has been removed from CMAKE_CXX_FLAGS")
54 string (REGEX REPLACE "/DWIN32" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
57 # remove _WINDOWS flag if it exists
58 string (REGEX MATCH "/D_WINDOWS" IS_WINDOWSFLAG "${CMAKE_C_FLAGS}")
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}")
64 # remove WIN32 flag if it exists
65 string (REGEX MATCH "/DWIN32" IS_WIN32FLAG "${CMAKE_C_FLAGS}")
67 message (STATUS "Info: /DWIN32 has been removed from CMAKE_C_FLAGS")
68 string (REGEX REPLACE "/DWIN32" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
71 # remove DEBUG flag if it exists
72 string (REGEX MATCH "-DDEBUG" IS_DEBUG_CXX "${CMAKE_CXX_FLAGS_DEBUG}")
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}")
78 string (REGEX MATCH "-DDEBUG" IS_DEBUG_C "${CMAKE_C_FLAGS_DEBUG}")
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}")
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")
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)
92 if (NOT DEFINED CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS)
93 SET(CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS 1)
96 # increase compiler warnings level (-W4 for MSVC, -Wextra for GCC)
98 if (CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
99 string (REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
101 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
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)
107 set (CMAKE_SHARED_LINKER_FLAGS "-lm ${CMAKE_SHARED_LINKER_FLAGS}")
109 set (CMAKE_SHARED_LINKER_FLAGS "-lm ${CMAKE_SHARED_LINKER_FLAGS}")
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}")
120 string (REGEX REPLACE "-O3" "-O2" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
122 set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O2")
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")
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}")
134 set (CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS}")
136 elseif (DEFINED CMAKE_COMPILER_IS_GNUCXX)
137 set (CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS}")
140 # Optimize size of binaries
141 if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR MINGW)
142 set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s")
143 set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -s")
146 if (BUILD_RELEASE_DISABLE_EXCEPTIONS)
147 set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DNo_Exception")
148 set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNo_Exception")