]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/zstd/build/cmake/CMakeModules/AddExtraCompilationFlags.cmake
Import zstandard 1.1.4 in base
[FreeBSD/FreeBSD.git] / contrib / zstd / build / cmake / CMakeModules / AddExtraCompilationFlags.cmake
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
5
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")
11         else ()
12             MESSAGE("Compiler flag ${POSITION_INDEPENDENT_CODE_FLAG} not allowed")
13         endif (POSITION_INDEPENDENT_CODE_FLAG_ALLOWED)
14
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")
20         else ()
21             MESSAGE("Compiler flag ${WARNING_UNDEF} not allowed")
22         endif (WARNING_UNDEF_ALLOWED)
23
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")
29         else ()
30             MESSAGE("Compiler flag ${WARNING_SHADOW} not allowed")
31         endif (WARNING_SHADOW_ALLOWED)
32
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")
38         else ()
39             MESSAGE("Compiler flag ${WARNING_CAST_ALIGN} not allowed")
40         endif (WARNING_CAST_ALIGN_ALLOWED)
41
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")
47         else ()
48             MESSAGE("Compiler flag ${WARNING_CAST_QUAL} not allowed")
49         endif (WARNING_CAST_QUAL_ALLOWED)
50
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")
56         else ()
57             MESSAGE("Compiler flag ${WARNING_STRICT_PROTOTYPES} not allowed")
58         endif (WARNING_STRICT_PROTOTYPES_ALLOWED)
59
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")
65         else ()
66             MESSAGE("Compiler flag ${WARNING_ALL} not allowed")
67         endif (WARNING_ALL_ALLOWED)
68
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")
74         else ()
75             MESSAGE("Compiler flag ${WARNING_EXTRA} not allowed")
76         endif (WARNING_EXTRA_ALLOWED)
77
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")
83         else ()
84             MESSAGE("Compiler flag ${WARNING_FLOAT_EQUAL} not allowed")
85         endif (WARNING_FLOAT_EQUAL_ALLOWED)
86
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")
92         else ()
93             MESSAGE("Compiler flag ${WARNING_SIGN_CONVERSION} not allowed")
94         endif (WARNING_SIGN_CONVERSION_ALLOWED)
95
96         if (ACTIVATE_POSITION_INDEPENDENT_CODE_FLAG)
97             list(APPEND CMAKE_C_FLAGS ${POSITION_INDEPENDENT_CODE_FLAG})
98         else ()
99             string(REPLACE ${POSITION_INDEPENDENT_CODE_FLAG} "" CMAKE_C_FLAGS "${POSITION_INDEPENDENT_CODE_FLAG}")
100         endif (ACTIVATE_POSITION_INDEPENDENT_CODE_FLAG)
101
102         if (ACTIVATE_WARNING_UNDEF)
103             list(APPEND CMAKE_CXX_FLAGS ${WARNING_UNDEF})
104             list(APPEND CMAKE_C_FLAGS ${WARNING_UNDEF})
105         else ()
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)
109
110         if (ACTIVATE_WARNING_SHADOW)
111             list(APPEND CMAKE_CXX_FLAGS ${WARNING_SHADOW})
112             list(APPEND CMAKE_C_FLAGS ${WARNING_SHADOW})
113         else ()
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)
117
118         if (ACTIVATE_WARNING_CAST_QUAL)
119             list(APPEND CMAKE_CXX_FLAGS ${WARNING_CAST_QUAL})
120             list(APPEND CMAKE_C_FLAGS ${WARNING_CAST_QUAL})
121         else ()
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)
125
126         if (ACTIVATE_WARNING_CAST_ALIGN)
127             list(APPEND CMAKE_CXX_FLAGS ${WARNING_CAST_ALIGN})
128             list(APPEND CMAKE_C_FLAGS ${WARNING_CAST_ALIGN})
129         else ()
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)
133
134         if (ACTIVATE_WARNING_STRICT_PROTOTYPES)
135             list(APPEND CMAKE_C_FLAGS ${WARNING_STRICT_PROTOTYPES})
136         else ()
137             string(REPLACE ${WARNING_STRICT_PROTOTYPES} "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
138         endif (ACTIVATE_WARNING_STRICT_PROTOTYPES)
139
140         if (ACTIVATE_WARNING_ALL)
141             list(APPEND CMAKE_CXX_FLAGS ${WARNING_ALL})
142             list(APPEND CMAKE_C_FLAGS ${WARNING_ALL})
143         else ()
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)
147
148         if (ACTIVATE_WARNING_EXTRA)
149             list(APPEND CMAKE_CXX_FLAGS ${WARNING_EXTRA})
150             list(APPEND CMAKE_C_FLAGS ${WARNING_EXTRA})
151         else ()
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)
155
156         if (ACTIVATE_WARNING_FLOAT_EQUAL)
157             list(APPEND CMAKE_CXX_FLAGS ${WARNING_FLOAT_EQUAL})
158             list(APPEND CMAKE_C_FLAGS ${WARNING_FLOAT_EQUAL})
159         else ()
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)
163
164         if (ACTIVATE_WARNING_SIGN_CONVERSION)
165             list(APPEND CMAKE_CXX_FLAGS ${WARNING_SIGN_CONVERSION})
166             list(APPEND CMAKE_C_FLAGS ${WARNING_SIGN_CONVERSION})
167         else ()
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)
171
172         #Set c++11 by default
173         list(APPEND CMAKE_CXX_FLAGS "-std=c++11")
174
175         #Set c99 by default
176         list(APPEND CMAKE_C_FLAGS "-std=c99")
177
178     elseif (MSVC)
179         # Add specific compilation flags for Windows Visual
180
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")
186         else ()
187             MESSAGE("Compiler flag ${WARNING_ALL} not allowed")
188         endif (WARNING_ALL_ALLOWED)
189                 
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")
195         else ()
196             MESSAGE("Compiler flag ${RTC_FLAG} not allowed")
197         endif (RTC_FLAG_ALLOWED)
198                 
199         set(ZC_FLAG "/Zc:forScope")
200         CHECK_C_COMPILER_FLAG(${ZC_FLAG} ZC_FLAG_ALLOWED)
201         if (ZC_FLAG_ALLOWED)
202             MESSAGE("Compiler flag ${ZC_FLAG} allowed")
203             set(ACTIVATE_ZC_FLAG "ON" CACHE BOOL "activate /Zc:forScope flag")
204         else ()
205             MESSAGE("Compiler flag ${ZC_FLAG} not allowed")
206         endif (ZC_FLAG_ALLOWED)
207                 
208         set(GD_FLAG "/Gd")
209         CHECK_C_COMPILER_FLAG(${GD_FLAG} GD_FLAG_ALLOWED)
210         if (GD_FLAG_ALLOWED)
211             MESSAGE("Compiler flag ${GD_FLAG} allowed")
212             set(ACTIVATE_GD_FLAG "ON" CACHE BOOL "activate /Gd flag")
213         else ()
214             MESSAGE("Compiler flag ${GD_FLAG} not allowed")
215         endif (GD_FLAG_ALLOWED)
216                 
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")
222         else ()
223             MESSAGE("Compiler flag ${ANALYZE_FLAG} not allowed")
224         endif (ANALYZE_FLAG_ALLOWED)
225
226         if (ACTIVATE_WARNING_ALL)
227             list(APPEND CMAKE_CXX_FLAGS ${WARNING_ALL})
228             list(APPEND CMAKE_C_FLAGS ${WARNING_ALL})
229         else ()
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)
233                 
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})
238         else ()
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)
242                 
243         if (ACTIVATE_ZC_FLAG)
244             list(APPEND CMAKE_CXX_FLAGS ${ZC_FLAG})
245             list(APPEND CMAKE_C_FLAGS ${ZC_FLAG})
246         else ()
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)
250                 
251         if (ACTIVATE_GD_FLAG)
252             list(APPEND CMAKE_CXX_FLAGS ${GD_FLAG})
253             list(APPEND CMAKE_C_FLAGS ${GD_FLAG})
254         else ()
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)
258                 
259         if (ACTIVATE_ANALYZE_FLAG)
260             list(APPEND CMAKE_CXX_FLAGS ${ANALYZE_FLAG})
261             list(APPEND CMAKE_C_FLAGS ${ANALYZE_FLAG})
262         else ()
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)
266                 
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)
272
273         set(MULTITHREADED_COMPILATION "/MP")
274         MESSAGE("Compiler flag ${MULTITHREADED_COMPILATION} allowed")
275         set(ACTIVATE_MULTITHREADED_COMPILATION "ON" CACHE BOOL "activate /MP flag")
276
277         if (ACTIVATE_MULTITHREADED_COMPILATION)
278             list(APPEND CMAKE_CXX_FLAGS ${MULTITHREADED_COMPILATION})
279             list(APPEND CMAKE_C_FLAGS ${MULTITHREADED_COMPILATION})
280         else ()
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)
284
285         #For exceptions
286         list(APPEND CMAKE_CXX_FLAGS "/EHsc")
287         list(APPEND CMAKE_C_FLAGS "/EHsc")
288         
289         # UNICODE SUPPORT
290         list(APPEND CMAKE_CXX_FLAGS "/D_UNICODE /DUNICODE")
291         list(APPEND CMAKE_C_FLAGS "/D_UNICODE /DUNICODE")
292     endif ()
293
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)  
304
305     if (MSVC)
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)      
315     endif ()
316
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)
322
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)
328
329 ENDMACRO(ADD_EXTRA_COMPILATION_FLAGS)