1 MACRO(ADD_EXTRA_COMPILATION_FLAGS)
2 include(CheckCXXCompilerFlag)
3 include(CheckCCompilerFlag)
4 if (CMAKE_COMPILER_IS_GNUCXX OR MINGW) #Not only UNIX but also WIN32 for MinGW
6 set(POSITION_INDEPENDENT_CODE_FLAG "-fPIC")
7 CHECK_C_COMPILER_FLAG(${POSITION_INDEPENDENT_CODE_FLAG} POSITION_INDEPENDENT_CODE_FLAG_ALLOWED)
8 if (POSITION_INDEPENDENT_CODE_FLAG_ALLOWED)
9 MESSAGE("Compiler flag ${POSITION_INDEPENDENT_CODE_FLAG} allowed")
10 set(ACTIVATE_POSITION_INDEPENDENT_CODE_FLAG "ON" CACHE BOOL "activate -fPIC flag")
12 MESSAGE("Compiler flag ${POSITION_INDEPENDENT_CODE_FLAG} not allowed")
13 endif (POSITION_INDEPENDENT_CODE_FLAG_ALLOWED)
15 set(WARNING_UNDEF "-Wundef")
16 CHECK_C_COMPILER_FLAG(${WARNING_UNDEF} WARNING_UNDEF_ALLOWED)
17 if (WARNING_UNDEF_ALLOWED)
18 MESSAGE("Compiler flag ${WARNING_UNDEF} allowed")
19 set(ACTIVATE_WARNING_UNDEF "ON" CACHE BOOL "activate -Wundef flag")
21 MESSAGE("Compiler flag ${WARNING_UNDEF} not allowed")
22 endif (WARNING_UNDEF_ALLOWED)
24 set(WARNING_SHADOW "-Wshadow")
25 CHECK_C_COMPILER_FLAG(${WARNING_SHADOW} WARNING_SHADOW_ALLOWED)
26 if (WARNING_SHADOW_ALLOWED)
27 MESSAGE("Compiler flag ${WARNING_SHADOW} allowed")
28 set(ACTIVATE_WARNING_SHADOW "ON" CACHE BOOL "activate -Wshadow flag")
30 MESSAGE("Compiler flag ${WARNING_SHADOW} not allowed")
31 endif (WARNING_SHADOW_ALLOWED)
33 set(WARNING_CAST_ALIGN "-Wcast-align")
34 CHECK_C_COMPILER_FLAG(${WARNING_CAST_ALIGN} WARNING_CAST_ALIGN_ALLOWED)
35 if (WARNING_CAST_ALIGN_ALLOWED)
36 MESSAGE("Compiler flag ${WARNING_CAST_ALIGN} allowed")
37 set(ACTIVATE_WARNING_CAST_ALIGN "ON" CACHE BOOL "activate -Wcast-align flag")
39 MESSAGE("Compiler flag ${WARNING_CAST_ALIGN} not allowed")
40 endif (WARNING_CAST_ALIGN_ALLOWED)
42 set(WARNING_CAST_QUAL "-Wcast-qual")
43 CHECK_C_COMPILER_FLAG(${WARNING_CAST_QUAL} WARNING_CAST_QUAL_ALLOWED)
44 if (WARNING_CAST_QUAL_ALLOWED)
45 MESSAGE("Compiler flag ${WARNING_CAST_QUAL} allowed")
46 set(ACTIVATE_WARNING_CAST_QUAL "ON" CACHE BOOL "activate -Wcast-qual flag")
48 MESSAGE("Compiler flag ${WARNING_CAST_QUAL} not allowed")
49 endif (WARNING_CAST_QUAL_ALLOWED)
51 set(WARNING_STRICT_PROTOTYPES "-Wstrict-prototypes")
52 CHECK_C_COMPILER_FLAG(${WARNING_STRICT_PROTOTYPES} WARNING_STRICT_PROTOTYPES_ALLOWED)
53 if (WARNING_STRICT_PROTOTYPES_ALLOWED)
54 MESSAGE("Compiler flag ${WARNING_STRICT_PROTOTYPES} allowed")
55 set(ACTIVATE_WARNING_STRICT_PROTOTYPES "ON" CACHE BOOL "activate -Wstrict-prototypes flag")
57 MESSAGE("Compiler flag ${WARNING_STRICT_PROTOTYPES} not allowed")
58 endif (WARNING_STRICT_PROTOTYPES_ALLOWED)
60 set(WARNING_ALL "-Wall")
61 CHECK_C_COMPILER_FLAG(${WARNING_ALL} WARNING_ALL_ALLOWED)
62 if (WARNING_ALL_ALLOWED)
63 MESSAGE("Compiler flag ${WARNING_ALL} allowed")
64 set(ACTIVATE_WARNING_ALL "ON" CACHE BOOL "activate -Wall flag")
66 MESSAGE("Compiler flag ${WARNING_ALL} not allowed")
67 endif (WARNING_ALL_ALLOWED)
69 set(WARNING_EXTRA "-Wextra")
70 CHECK_C_COMPILER_FLAG(${WARNING_EXTRA} WARNING_EXTRA_ALLOWED)
71 if (WARNING_EXTRA_ALLOWED)
72 MESSAGE("Compiler flag ${WARNING_EXTRA} allowed")
73 set(ACTIVATE_WARNING_EXTRA "ON" CACHE BOOL "activate -Wextra flag")
75 MESSAGE("Compiler flag ${WARNING_EXTRA} not allowed")
76 endif (WARNING_EXTRA_ALLOWED)
78 set(WARNING_FLOAT_EQUAL "-Wfloat-equal")
79 CHECK_C_COMPILER_FLAG(${WARNING_FLOAT_EQUAL} WARNING_FLOAT_EQUAL_ALLOWED)
80 if (WARNING_FLOAT_EQUAL_ALLOWED)
81 MESSAGE("Compiler flag ${WARNING_FLOAT_EQUAL} allowed")
82 set(ACTIVATE_WARNING_FLOAT_EQUAL "OFF" CACHE BOOL "activate -Wfloat-equal flag")
84 MESSAGE("Compiler flag ${WARNING_FLOAT_EQUAL} not allowed")
85 endif (WARNING_FLOAT_EQUAL_ALLOWED)
87 set(WARNING_SIGN_CONVERSION "-Wsign-conversion")
88 CHECK_C_COMPILER_FLAG(${WARNING_SIGN_CONVERSION} WARNING_SIGN_CONVERSION_ALLOWED)
89 if (WARNING_SIGN_CONVERSION_ALLOWED)
90 MESSAGE("Compiler flag ${WARNING_SIGN_CONVERSION} allowed")
91 set(ACTIVATE_WARNING_SIGN_CONVERSION "OFF" CACHE BOOL "activate -Wsign-conversion flag")
93 MESSAGE("Compiler flag ${WARNING_SIGN_CONVERSION} not allowed")
94 endif (WARNING_SIGN_CONVERSION_ALLOWED)
96 if (ACTIVATE_POSITION_INDEPENDENT_CODE_FLAG)
97 list(APPEND CMAKE_C_FLAGS ${POSITION_INDEPENDENT_CODE_FLAG})
99 string(REPLACE ${POSITION_INDEPENDENT_CODE_FLAG} "" CMAKE_C_FLAGS "${POSITION_INDEPENDENT_CODE_FLAG}")
100 endif (ACTIVATE_POSITION_INDEPENDENT_CODE_FLAG)
102 if (ACTIVATE_WARNING_UNDEF)
103 list(APPEND CMAKE_CXX_FLAGS ${WARNING_UNDEF})
104 list(APPEND CMAKE_C_FLAGS ${WARNING_UNDEF})
106 string(REPLACE ${WARNING_UNDEF} "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
107 string(REPLACE ${WARNING_UNDEF} "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
108 endif (ACTIVATE_WARNING_UNDEF)
110 if (ACTIVATE_WARNING_SHADOW)
111 list(APPEND CMAKE_CXX_FLAGS ${WARNING_SHADOW})
112 list(APPEND CMAKE_C_FLAGS ${WARNING_SHADOW})
114 string(REPLACE ${WARNING_SHADOW} "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
115 string(REPLACE ${WARNING_SHADOW} "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
116 endif (ACTIVATE_WARNING_SHADOW)
118 if (ACTIVATE_WARNING_CAST_QUAL)
119 list(APPEND CMAKE_CXX_FLAGS ${WARNING_CAST_QUAL})
120 list(APPEND CMAKE_C_FLAGS ${WARNING_CAST_QUAL})
122 string(REPLACE ${WARNING_CAST_QUAL} "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
123 string(REPLACE ${WARNING_CAST_QUAL} "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
124 endif (ACTIVATE_WARNING_CAST_QUAL)
126 if (ACTIVATE_WARNING_CAST_ALIGN)
127 list(APPEND CMAKE_CXX_FLAGS ${WARNING_CAST_ALIGN})
128 list(APPEND CMAKE_C_FLAGS ${WARNING_CAST_ALIGN})
130 string(REPLACE ${WARNING_CAST_ALIGN} "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
131 string(REPLACE ${WARNING_CAST_ALIGN} "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
132 endif (ACTIVATE_WARNING_CAST_ALIGN)
134 if (ACTIVATE_WARNING_STRICT_PROTOTYPES)
135 list(APPEND CMAKE_C_FLAGS ${WARNING_STRICT_PROTOTYPES})
137 string(REPLACE ${WARNING_STRICT_PROTOTYPES} "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
138 endif (ACTIVATE_WARNING_STRICT_PROTOTYPES)
140 if (ACTIVATE_WARNING_ALL)
141 list(APPEND CMAKE_CXX_FLAGS ${WARNING_ALL})
142 list(APPEND CMAKE_C_FLAGS ${WARNING_ALL})
144 string(REPLACE ${WARNING_ALL} "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
145 string(REPLACE ${WARNING_ALL} "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
146 endif (ACTIVATE_WARNING_ALL)
148 if (ACTIVATE_WARNING_EXTRA)
149 list(APPEND CMAKE_CXX_FLAGS ${WARNING_EXTRA})
150 list(APPEND CMAKE_C_FLAGS ${WARNING_EXTRA})
152 string(REPLACE ${WARNING_EXTRA} "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
153 string(REPLACE ${WARNING_EXTRA} "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
154 endif (ACTIVATE_WARNING_EXTRA)
156 if (ACTIVATE_WARNING_FLOAT_EQUAL)
157 list(APPEND CMAKE_CXX_FLAGS ${WARNING_FLOAT_EQUAL})
158 list(APPEND CMAKE_C_FLAGS ${WARNING_FLOAT_EQUAL})
160 string(REPLACE ${WARNING_FLOAT_EQUAL} "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
161 string(REPLACE ${WARNING_FLOAT_EQUAL} "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
162 endif (ACTIVATE_WARNING_FLOAT_EQUAL)
164 if (ACTIVATE_WARNING_SIGN_CONVERSION)
165 list(APPEND CMAKE_CXX_FLAGS ${WARNING_SIGN_CONVERSION})
166 list(APPEND CMAKE_C_FLAGS ${WARNING_SIGN_CONVERSION})
168 string(REPLACE ${WARNING_SIGN_CONVERSION} "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
169 string(REPLACE ${WARNING_SIGN_CONVERSION} "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
170 endif (ACTIVATE_WARNING_SIGN_CONVERSION)
172 #Set c++11 by default
173 list(APPEND CMAKE_CXX_FLAGS "-std=c++11")
176 list(APPEND CMAKE_C_FLAGS "-std=c99")
179 # Add specific compilation flags for Windows Visual
181 set(WARNING_ALL "/Wall")
182 CHECK_C_COMPILER_FLAG(${WARNING_ALL} WARNING_ALL_ALLOWED)
183 if (WARNING_ALL_ALLOWED)
184 MESSAGE("Compiler flag ${WARNING_ALL} allowed")
185 set(ACTIVATE_WARNING_ALL "OFF" CACHE BOOL "activate /Wall flag")
187 MESSAGE("Compiler flag ${WARNING_ALL} not allowed")
188 endif (WARNING_ALL_ALLOWED)
190 set(RTC_FLAG "/RTC1")
191 CHECK_C_COMPILER_FLAG(${RTC_FLAG} RTC_FLAG_ALLOWED)
192 if (RTC_FLAG_ALLOWED)
193 MESSAGE("Compiler flag ${RTC_FLAG} allowed")
194 set(ACTIVATE_RTC_FLAG "ON" CACHE BOOL "activate /RTC1 flag")
196 MESSAGE("Compiler flag ${RTC_FLAG} not allowed")
197 endif (RTC_FLAG_ALLOWED)
199 set(ZC_FLAG "/Zc:forScope")
200 CHECK_C_COMPILER_FLAG(${ZC_FLAG} ZC_FLAG_ALLOWED)
202 MESSAGE("Compiler flag ${ZC_FLAG} allowed")
203 set(ACTIVATE_ZC_FLAG "ON" CACHE BOOL "activate /Zc:forScope flag")
205 MESSAGE("Compiler flag ${ZC_FLAG} not allowed")
206 endif (ZC_FLAG_ALLOWED)
209 CHECK_C_COMPILER_FLAG(${GD_FLAG} GD_FLAG_ALLOWED)
211 MESSAGE("Compiler flag ${GD_FLAG} allowed")
212 set(ACTIVATE_GD_FLAG "ON" CACHE BOOL "activate /Gd flag")
214 MESSAGE("Compiler flag ${GD_FLAG} not allowed")
215 endif (GD_FLAG_ALLOWED)
217 set(ANALYZE_FLAG "/analyze:stacksize25000")
218 CHECK_C_COMPILER_FLAG(${ANALYZE_FLAG} ANALYZE_FLAG_ALLOWED)
219 if (ANALYZE_FLAG_ALLOWED)
220 MESSAGE("Compiler flag ${ANALYZE_FLAG} allowed")
221 set(ACTIVATE_ANALYZE_FLAG "ON" CACHE BOOL "activate /ANALYZE flag")
223 MESSAGE("Compiler flag ${ANALYZE_FLAG} not allowed")
224 endif (ANALYZE_FLAG_ALLOWED)
226 if (ACTIVATE_WARNING_ALL)
227 list(APPEND CMAKE_CXX_FLAGS ${WARNING_ALL})
228 list(APPEND CMAKE_C_FLAGS ${WARNING_ALL})
230 string(REPLACE ${WARNING_ALL} "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
231 string(REPLACE ${WARNING_ALL} "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
232 endif (ACTIVATE_WARNING_ALL)
234 # Only for DEBUG version
235 if (ACTIVATE_RTC_FLAG)
236 list(APPEND CMAKE_CXX_FLAGS_DEBUG ${RTC_FLAG})
237 list(APPEND CMAKE_C_FLAGS_DEBUG ${RTC_FLAG})
239 string(REPLACE ${RTC_FLAG} "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
240 string(REPLACE ${RTC_FLAG} "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
241 endif (ACTIVATE_RTC_FLAG)
243 if (ACTIVATE_ZC_FLAG)
244 list(APPEND CMAKE_CXX_FLAGS ${ZC_FLAG})
245 list(APPEND CMAKE_C_FLAGS ${ZC_FLAG})
247 string(REPLACE ${ZC_FLAG} "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
248 string(REPLACE ${ZC_FLAG} "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
249 endif (ACTIVATE_ZC_FLAG)
251 if (ACTIVATE_GD_FLAG)
252 list(APPEND CMAKE_CXX_FLAGS ${GD_FLAG})
253 list(APPEND CMAKE_C_FLAGS ${GD_FLAG})
255 string(REPLACE ${GD_FLAG} "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
256 string(REPLACE ${GD_FLAG} "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
257 endif (ACTIVATE_GD_FLAG)
259 if (ACTIVATE_ANALYZE_FLAG)
260 list(APPEND CMAKE_CXX_FLAGS ${ANALYZE_FLAG})
261 list(APPEND CMAKE_C_FLAGS ${ANALYZE_FLAG})
263 string(REPLACE ${ANALYZE_FLAG} "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
264 string(REPLACE ${ANALYZE_FLAG} "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
265 endif (ACTIVATE_ANALYZE_FLAG)
267 if (MSVC80 OR MSVC90 OR MSVC10 OR MSVC11)
268 # To avoid compiler warning (level 4) C4571, compile with /EHa if you still want
269 # your catch(...) blocks to catch structured exceptions.
270 list(APPEND CMAKE_CXX_FLAGS "/EHa")
271 endif (MSVC80 OR MSVC90 OR MSVC10 OR MSVC11)
273 set(MULTITHREADED_COMPILATION "/MP")
274 MESSAGE("Compiler flag ${MULTITHREADED_COMPILATION} allowed")
275 set(ACTIVATE_MULTITHREADED_COMPILATION "ON" CACHE BOOL "activate /MP flag")
277 if (ACTIVATE_MULTITHREADED_COMPILATION)
278 list(APPEND CMAKE_CXX_FLAGS ${MULTITHREADED_COMPILATION})
279 list(APPEND CMAKE_C_FLAGS ${MULTITHREADED_COMPILATION})
281 string(REPLACE ${MULTITHREADED_COMPILATION} "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
282 string(REPLACE ${MULTITHREADED_COMPILATION} "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
283 endif (ACTIVATE_MULTITHREADED_COMPILATION)
286 list(APPEND CMAKE_CXX_FLAGS "/EHsc")
287 list(APPEND CMAKE_C_FLAGS "/EHsc")
290 list(APPEND CMAKE_CXX_FLAGS "/D_UNICODE /DUNICODE")
291 list(APPEND CMAKE_C_FLAGS "/D_UNICODE /DUNICODE")
294 # Remove duplicates compilation flags
295 FOREACH (flag_var CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
296 CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
297 CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
298 CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
299 separate_arguments(${flag_var})
300 list(REMOVE_DUPLICATES ${flag_var})
301 string(REPLACE ";" " " ${flag_var} "${${flag_var}}")
302 set(${flag_var} "${${flag_var}}" CACHE STRING "common build flags" FORCE)
303 ENDFOREACH (flag_var)
306 # Replace /MT to /MD flag
307 # Replace /O2 to /O3 flag
308 FOREACH (flag_var CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
309 CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
310 CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
311 CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
312 STRING(REGEX REPLACE "/MT" "/MD" ${flag_var} "${${flag_var}}")
313 STRING(REGEX REPLACE "/O2" "/Ox" ${flag_var} "${${flag_var}}")
314 ENDFOREACH (flag_var)
317 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" CACHE STRING "Updated flags" FORCE)
318 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}" CACHE STRING "Updated flags" FORCE)
319 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}" CACHE STRING "Updated flags" FORCE)
320 set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL}" CACHE STRING "Updated flags" FORCE)
321 set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}" CACHE STRING "Updated flags" FORCE)
323 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" CACHE STRING "Updated flags" FORCE)
324 set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}" CACHE STRING "Updated flags" FORCE)
325 set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}" CACHE STRING "Updated flags" FORCE)
326 set(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL}" CACHE STRING "Updated flags" FORCE)
327 set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}" CACHE STRING "Updated flags" FORCE)
329 ENDMACRO(ADD_EXTRA_COMPILATION_FLAGS)