3be78b18274e705896f1aace0db842f66be1463e
[awesomized/libmemcached] / m4 / ax_harden_compiler_flags.m4
1 # ===========================================================================
2 # https://github.com/BrianAker/ddm4/
3 # ===========================================================================
4 #
5 # SYNOPSIS
6 #
7 # AX_HARDEN_COMPILER_FLAGS()
8 # AX_HARDEN_LINKER_FLAGS()
9 # AX_HARDEN_CC_COMPILER_FLAGS()
10 # AX_HARDEN_CXX_COMPILER_FLAGS()
11 #
12 # DESCRIPTION
13 #
14 # Any compiler flag that "hardens" or tests code. C99 is assumed.
15 #
16 # NOTE: Implementation based on AX_APPEND_FLAG.
17 #
18 # LICENSE
19 #
20 # Copyright (C) 2012 Brian Aker
21 # All rights reserved.
22 #
23 # Redistribution and use in source and binary forms, with or without
24 # modification, are permitted provided that the following conditions are
25 # met:
26 #
27 # * Redistributions of source code must retain the above copyright
28 # notice, this list of conditions and the following disclaimer.
29 #
30 # * Redistributions in binary form must reproduce the above
31 # copyright notice, this list of conditions and the following disclaimer
32 # in the documentation and/or other materials provided with the
33 # distribution.
34 #
35 # * The names of its contributors may not be used to endorse or
36 # promote products derived from this software without specific prior
37 # written permission.
38 #
39 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
40 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
41 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
42 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
43 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
45 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
46 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
47 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
48 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
49 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
50
51 # The Following flags are not checked for
52 # -Wdeclaration-after-statement is counter to C99
53 # AX_APPEND_COMPILE_FLAGS_ERROR([-std=c++11]) -- Not ready yet
54 # AX_APPEND_COMPILE_FLAGS_ERROR([-pedantic]) -- ?
55 # AX_APPEND_COMPILE_FLAGS_ERROR([-Wstack-protector]) -- Issues on 32bit compile
56 # AX_APPEND_COMPILE_FLAGS_ERROR([-fstack-protector-all]) -- Issues on 32bit compile
57 # AX_APPEND_COMPILE_FLAGS_ERROR([-Wlong-long]) -- Don't turn on for compatibility issues memcached_stat_st
58
59 #serial 5
60
61 AC_DEFUN([AX_APPEND_LINK_FLAGS_ERROR],
62 [AC_PREREQ([2.63])dnl
63 AX_APPEND_LINK_FLAGS([$1],[LIB],[-Werror])
64 ])
65
66 AC_DEFUN([AX_APPEND_COMPILE_FLAGS_ERROR],
67 [AC_PREREQ([2.63])dnl
68 AX_APPEND_COMPILE_FLAGS([$1],,[-Werror])
69 ])
70
71 AC_DEFUN([AX_HARDEN_LINKER_FLAGS],
72 [AC_PREREQ([2.63])dnl
73 AC_REQUIRE([AX_APPEND_LINK_FLAGS])
74 AC_REQUIRE([AX_CXX_COMPILER_VERSION])
75 AC_REQUIRE([AX_DEBUG])
76 AC_REQUIRE([AX_VCS_CHECKOUT])
77
78 AX_APPEND_LINK_FLAGS_ERROR([-z relro -z now])
79 AX_APPEND_LINK_FLAGS_ERROR([-pie])
80
81 AS_IF([test "x$ac_cv_vcs_checkout" = xyes],[AX_APPEND_LINK_FLAGS_ERROR([-Werror])])
82 ])
83
84 AC_DEFUN([AX_HARDEN_CC_COMPILER_FLAGS],
85 [AC_PREREQ([2.63])dnl
86 AC_REQUIRE([AX_APPEND_LINK_FLAGS])
87 AC_REQUIRE([AX_CXX_COMPILER_VERSION])
88 AC_REQUIRE([AX_DEBUG])
89 AC_REQUIRE([AX_VCS_CHECKOUT])
90
91 AC_LANG_PUSH([C])dnl
92
93 AX_APPEND_COMPILE_FLAGS_ERROR([-g])
94 AS_IF([test "x$ax_enable_debug" = xyes],
95 [AX_APPEND_COMPILE_FLAGS_ERROR([-ggdb])
96 AX_APPEND_COMPILE_FLAGS_ERROR([-O0])],
97 [AX_APPEND_COMPILE_FLAGS_ERROR([-O2])])
98
99 AX_APPEND_COMPILE_FLAGS_ERROR([-fstack-check])
100 AX_APPEND_COMPILE_FLAGS_ERROR([-Wno-pragmas])
101 AX_APPEND_COMPILE_FLAGS_ERROR([-Wall])
102 AX_APPEND_COMPILE_FLAGS_ERROR([-Wextra])
103 AX_APPEND_COMPILE_FLAGS_ERROR([-Wunknown-pragmas])
104 AX_APPEND_COMPILE_FLAGS_ERROR([-Wthis-test-should-fail])
105 AX_APPEND_COMPILE_FLAGS_ERROR([-std=c99])
106 # Anything below this comment please keep sorted.
107 AX_APPEND_COMPILE_FLAGS_ERROR([--param=ssp-buffer-size=1])
108 # -Wmissing-format-attribute
109 AX_APPEND_COMPILE_FLAGS_ERROR([-Wno-attributes])
110 AX_APPEND_COMPILE_FLAGS_ERROR([-Waddress])
111 AX_APPEND_COMPILE_FLAGS_ERROR([-Warray-bounds])
112 AX_APPEND_COMPILE_FLAGS_ERROR([-Wbad-function-cast])
113 # Not in use -Wc++-compat
114 AX_APPEND_COMPILE_FLAGS_ERROR([-Wchar-subscripts])
115 AX_APPEND_COMPILE_FLAGS_ERROR([-Wcomment])
116 AX_APPEND_COMPILE_FLAGS_ERROR([-Wfloat-equal])
117 AX_APPEND_COMPILE_FLAGS_ERROR([-Wformat-security])
118 AX_APPEND_COMPILE_FLAGS_ERROR([-Wformat=2])
119 AX_APPEND_COMPILE_FLAGS_ERROR([-Wlogical-op])
120 AX_APPEND_COMPILE_FLAGS_ERROR([-Wmaybe-uninitialized])
121 AX_APPEND_COMPILE_FLAGS_ERROR([-Wmissing-field-initializers])
122 AS_IF([test "$MINGW" = "yes"],
123 [AX_APPEND_COMPILE_FLAGS_ERROR([-Wno-missing-noreturn])],
124 [AX_APPEND_COMPILE_FLAGS_ERROR([-Wmissing-noreturn])])
125 AX_APPEND_COMPILE_FLAGS_ERROR([-Wmissing-prototypes])
126 AX_APPEND_COMPILE_FLAGS_ERROR([-Wnested-externs])
127 AX_APPEND_COMPILE_FLAGS_ERROR([-Wnormalized=id])
128 AX_APPEND_COMPILE_FLAGS_ERROR([-Wold-style-definition])
129 AX_APPEND_COMPILE_FLAGS_ERROR([-Woverride-init])
130 AX_APPEND_COMPILE_FLAGS_ERROR([-Wpointer-arith])
131 AX_APPEND_COMPILE_FLAGS_ERROR([-Wpointer-sign])
132 AS_IF([test "x$MINGW" = xyes],
133 [AX_APPEND_COMPILE_FLAGS_ERROR([-Wno-suggest-attribute=const])
134 AX_APPEND_COMPILE_FLAGS_ERROR([-Wno-suggest-attribute=noreturn])
135 AX_APPEND_COMPILE_FLAGS_ERROR([-Wno-suggest-attribute=pure])
136 AX_APPEND_COMPILE_FLAGS_ERROR([-Wno-redundant-decls])],
137 [AX_APPEND_COMPILE_FLAGS_ERROR([-Wredundant-decls])])
138
139 AX_APPEND_COMPILE_FLAGS_ERROR([-Wshadow])
140 AX_APPEND_COMPILE_FLAGS_ERROR([-Wshorten-64-to-32])
141 AX_APPEND_COMPILE_FLAGS_ERROR([-Wsign-compare])
142 AX_APPEND_COMPILE_FLAGS_ERROR([-Wstrict-overflow=1])
143 AX_APPEND_COMPILE_FLAGS_ERROR([-Wstrict-prototypes])
144 AX_APPEND_COMPILE_FLAGS_ERROR([-Wswitch-enum])
145 AX_APPEND_COMPILE_FLAGS_ERROR([-Wundef])
146 AX_APPEND_COMPILE_FLAGS_ERROR([-Wunused])
147 AX_APPEND_COMPILE_FLAGS_ERROR([-Wunused-result])
148 AX_APPEND_COMPILE_FLAGS_ERROR([-Wunused-variable])
149 AX_APPEND_COMPILE_FLAGS_ERROR([-Wwrite-strings])
150 AX_APPEND_COMPILE_FLAGS_ERROR([-floop-parallelize-all])
151 AX_APPEND_COMPILE_FLAGS_ERROR([-fwrapv])
152 AX_APPEND_COMPILE_FLAGS_ERROR([-fmudflapt])
153 AS_IF([test "x$ac_cv_vcs_checkout" = xyes], [AX_APPEND_COMPILE_FLAGS_ERROR([-Werror])])
154 AC_LANG_POP([C])
155 ])
156
157 AC_DEFUN([AX_HARDEN_CXX_COMPILER_FLAGS],
158 [AC_PREREQ([2.63])dnl
159 AC_REQUIRE([AX_APPEND_LINK_FLAGS])
160 AC_REQUIRE([AX_CXX_COMPILER_VERSION])
161 AC_REQUIRE([AX_DEBUG])
162 AC_REQUIRE([AX_VCS_CHECKOUT])
163
164 AC_LANG_PUSH([C++])
165
166 AX_APPEND_COMPILE_FLAGS_ERROR([-g])
167 AS_IF([test "x$ax_enable_debug" = xyes],
168 [AX_APPEND_COMPILE_FLAGS_ERROR([-O0])
169 AX_APPEND_COMPILE_FLAGS_ERROR([-ggdb])],
170 [AX_APPEND_COMPILE_FLAGS_ERROR([-O2])])
171
172 AS_IF([test "x$ac_c_gcc_recent" = xyes],
173 [AX_APPEND_COMPILE_FLAGS_ERROR([-D_FORTIFY_SOURCE=2])])
174
175 AS_IF([test "x$ac_cv_vcs_checkout" = xyes],
176 [AX_APPEND_COMPILE_FLAGS_ERROR([-Werror])
177 AX_APPEND_COMPILE_FLAGS_ERROR([-fstack-check])],
178 [AX_APPEND_COMPILE_FLAGS_ERROR([-Wno-pragmas])])
179
180 AX_APPEND_COMPILE_FLAGS_ERROR([-Wall])
181 AX_APPEND_COMPILE_FLAGS_ERROR([-Wextra])
182 AX_APPEND_COMPILE_FLAGS_ERROR([-Wunknown-pragmas])
183 AX_APPEND_COMPILE_FLAGS_ERROR([-Wthis-test-should-fail])
184 # Anything below this comment please keep sorted.
185 AX_APPEND_COMPILE_FLAGS_ERROR([--param=ssp-buffer-size=1])
186 # -Wmissing-format-attribute
187 AX_APPEND_COMPILE_FLAGS_ERROR([-Wno-attributes])
188 AX_APPEND_COMPILE_FLAGS_ERROR([-Waddress])
189 AX_APPEND_COMPILE_FLAGS_ERROR([-Warray-bounds])
190 AX_APPEND_COMPILE_FLAGS_ERROR([-Wchar-subscripts])
191 AX_APPEND_COMPILE_FLAGS_ERROR([-Wcomment])
192 AX_APPEND_COMPILE_FLAGS_ERROR([-Wctor-dtor-privacy])
193 AX_APPEND_COMPILE_FLAGS_ERROR([-Wfloat-equal])
194 AX_APPEND_COMPILE_FLAGS_ERROR([-Wformat=2])
195 AX_APPEND_COMPILE_FLAGS_ERROR([-Wmaybe-uninitialized])
196 AX_APPEND_COMPILE_FLAGS_ERROR([-Wmissing-field-initializers])
197 AS_IF([test "x$MINGW" = xyes],
198 [AX_APPEND_COMPILE_FLAGS_ERROR([-Wno-missing-noreturn])],
199 [AX_APPEND_COMPILE_FLAGS_ERROR([-Wmissing-noreturn])])
200 AX_APPEND_COMPILE_FLAGS_ERROR([-Wlogical-op])
201 AX_APPEND_COMPILE_FLAGS_ERROR([-Wnon-virtual-dtor])
202 AX_APPEND_COMPILE_FLAGS_ERROR([-Wnormalized=id])
203 AX_APPEND_COMPILE_FLAGS_ERROR([-Woverloaded-virtual])
204 AX_APPEND_COMPILE_FLAGS_ERROR([-Wpointer-arith])
205 AS_IF([test "x$MINGW" = xyes],
206 [AX_APPEND_COMPILE_FLAGS_ERROR([-Wno-suggest-attribute=const])
207 AX_APPEND_COMPILE_FLAGS_ERROR([-Wno-suggest-attribute=noreturn])
208 AX_APPEND_COMPILE_FLAGS_ERROR([-Wno-error=suggest-attribute=noreturn])
209 AX_APPEND_COMPILE_FLAGS_ERROR([-Wno-redundant-decls])],
210 [AX_APPEND_COMPILE_FLAGS_ERROR([-Wredundant-decls])])
211 AX_APPEND_COMPILE_FLAGS_ERROR([-Wshadow])
212 AX_APPEND_COMPILE_FLAGS_ERROR([-Wshorten-64-to-32])
213 AX_APPEND_COMPILE_FLAGS_ERROR([-Wsign-compare])
214 AX_APPEND_COMPILE_FLAGS_ERROR([-Wstrict-overflow=1])
215 AX_APPEND_COMPILE_FLAGS_ERROR([-Wswitch-enum])
216 AX_APPEND_COMPILE_FLAGS_ERROR([-Wundef])
217 AX_APPEND_COMPILE_FLAGS_ERROR([-Wc++11-compat])
218 AX_APPEND_COMPILE_FLAGS_ERROR([-Wunused])
219 AX_APPEND_COMPILE_FLAGS_ERROR([-Wunused-result])
220 AX_APPEND_COMPILE_FLAGS_ERROR([-Wunused-variable])
221 AX_APPEND_COMPILE_FLAGS_ERROR([-Wwrite-strings])
222 AX_APPEND_COMPILE_FLAGS_ERROR([-Wformat-security])
223 AX_APPEND_COMPILE_FLAGS_ERROR([-floop-parallelize-all])
224 AX_APPEND_COMPILE_FLAGS_ERROR([-fwrapv])
225 AX_APPEND_COMPILE_FLAGS_ERROR([-fmudflapt])
226 AS_IF([test "x$ac_cv_vcs_checkout" = xyes], [AX_APPEND_COMPILE_FLAGS_ERROR([-Werror])])
227 AC_LANG_POP([C++])
228 ])
229
230 AC_DEFUN([AX_HARDEN_COMPILER_FLAGS],
231 [AC_PREREQ([2.63])dnl
232 AC_REQUIRE([AX_APPEND_COMPILE_FLAGS])
233 AC_REQUIRE([AX_APPEND_LINK_FLAGS])
234 AC_REQUIRE([AX_CXX_COMPILER_VERSION])
235 AC_REQUIRE([AX_DEBUG])
236 AC_REQUIRE([AX_VCS_CHECKOUT])
237
238 AC_CACHE_CHECK([if all warnings into errors],[ac_cv_warnings_as_errors],
239 [AS_IF([test "x$ac_cv_vcs_checkout" = xyes],[ac_cv_warnings_as_errors=yes],
240 [ac_cv_warnings_as_errors=no])
241 ])
242
243 # All of the actual checks happen via these Macros
244 AC_REQUIRE([AX_HARDEN_LINKER_FLAGS])
245 AC_REQUIRE([AX_HARDEN_CC_COMPILER_FLAGS])
246 AC_REQUIRE([AX_HARDEN_CXX_COMPILER_FLAGS])
247 AC_REQUIRE([AX_CC_OTHER_FLAGS])
248
249 AC_REQUIRE([gl_VISIBILITY])
250 AS_IF([test -n "$CFLAG_VISIBILITY"],[CPPFLAGS="$CPPFLAGS $CFLAG_VISIBILITY"])
251 ])
252
253 AC_DEFUN([AX_CC_OTHER_FLAGS],
254 [AC_PREREQ([2.63])dnl
255 AC_REQUIRE([AX_APPEND_COMPILE_FLAGS_ERROR])
256 AC_REQUIRE([AX_HARDEN_CC_COMPILER_FLAGS])
257
258 AC_LANG_PUSH([C])
259 AX_APPEND_COMPILE_FLAGS_ERROR([-pipe])
260 AC_LANG_POP([C])
261 ])