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