Commit | Line | Data |
---|---|---|
3ed277a6 SM |
1 | # ============================================================================= |
2 | # https://www.gnu.org/software/autoconf-archive/ax_compiler_flags_cflags.html | |
3 | # ============================================================================= | |
4 | # | |
5 | # SYNOPSIS | |
6 | # | |
7 | # AX_COMPILER_FLAGS_CFLAGS([VARIABLE], [IS-RELEASE], [EXTRA-BASE-FLAGS], [EXTRA-YES-FLAGS]) | |
8 | # | |
9 | # DESCRIPTION | |
10 | # | |
11 | # Add warning flags for the C compiler to VARIABLE, which defaults to | |
12 | # WARN_CFLAGS. VARIABLE is AC_SUBST-ed by this macro, but must be | |
13 | # manually added to the CFLAGS variable for each target in the code base. | |
14 | # | |
15 | # This macro depends on the environment set up by AX_COMPILER_FLAGS. | |
16 | # Specifically, it uses the value of $ax_enable_compile_warnings to decide | |
17 | # which flags to enable. | |
18 | # | |
19 | # LICENSE | |
20 | # | |
21 | # Copyright (c) 2014, 2015 Philip Withnall <philip@tecnocode.co.uk> | |
22 | # Copyright (c) 2017, 2018 Reini Urban <rurban@cpan.org> | |
23 | # | |
24 | # Copying and distribution of this file, with or without modification, are | |
25 | # permitted in any medium without royalty provided the copyright notice | |
26 | # and this notice are preserved. This file is offered as-is, without any | |
27 | # warranty. | |
28 | ||
29 | #serial 17 | |
30 | ||
31 | AC_DEFUN([AX_COMPILER_FLAGS_CFLAGS],[ | |
32 | AC_REQUIRE([AC_PROG_SED]) | |
33 | AX_REQUIRE_DEFINED([AX_APPEND_COMPILE_FLAGS]) | |
34 | AX_REQUIRE_DEFINED([AX_APPEND_FLAG]) | |
35 | AX_REQUIRE_DEFINED([AX_CHECK_COMPILE_FLAG]) | |
36 | ||
37 | # Variable names | |
38 | m4_define([ax_warn_cflags_variable], | |
39 | [m4_normalize(ifelse([$1],,[WARN_CFLAGS],[$1]))]) | |
40 | ||
41 | AC_LANG_PUSH([C]) | |
42 | ||
43 | AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ | |
44 | [#ifndef __cplusplus | |
45 | #error "no C++" | |
46 | #endif]])], | |
47 | [ax_compiler_cxx=yes;], | |
48 | [ax_compiler_cxx=no;]) | |
49 | ||
50 | # Always pass -Werror=unknown-warning-option to get Clang to fail on bad | |
51 | # flags, otherwise they are always appended to the warn_cflags variable, and | |
52 | # Clang warns on them for every compilation unit. | |
53 | # If this is passed to GCC, it will explode, so the flag must be enabled | |
54 | # conditionally. | |
55 | AX_CHECK_COMPILE_FLAG([-Werror=unknown-warning-option],[ | |
56 | ax_compiler_flags_test="-Werror=unknown-warning-option" | |
57 | ],[ | |
58 | ax_compiler_flags_test="" | |
59 | ]) | |
60 | ||
61 | # Check that -Wno-suggest-attribute=format is supported | |
62 | AX_CHECK_COMPILE_FLAG([-Wno-suggest-attribute=format],[ | |
63 | ax_compiler_no_suggest_attribute_flags="-Wno-suggest-attribute=format" | |
64 | ],[ | |
65 | ax_compiler_no_suggest_attribute_flags="" | |
66 | ]) | |
67 | ||
68 | # Base flags | |
69 | AX_APPEND_COMPILE_FLAGS([ dnl | |
70 | -fno-strict-aliasing dnl | |
71 | $3 dnl | |
72 | ],ax_warn_cflags_variable,[$ax_compiler_flags_test]) | |
73 | ||
74 | AS_IF([test "$ax_enable_compile_warnings" != "no"],[ | |
75 | if test "$ax_compiler_cxx" = "no" ; then | |
76 | # C-only flags. Warn in C++ | |
77 | AX_APPEND_COMPILE_FLAGS([ dnl | |
78 | -Wnested-externs dnl | |
79 | -Wmissing-prototypes dnl | |
80 | -Wstrict-prototypes dnl | |
81 | -Wdeclaration-after-statement dnl | |
82 | -Wimplicit-function-declaration dnl | |
83 | -Wold-style-definition dnl | |
84 | -Wjump-misses-init dnl | |
85 | ],ax_warn_cflags_variable,[$ax_compiler_flags_test]) | |
86 | fi | |
87 | ||
88 | # "yes" flags | |
89 | AX_APPEND_COMPILE_FLAGS([ dnl | |
90 | -Wall dnl | |
91 | -Wextra dnl | |
92 | -Wundef dnl | |
93 | -Wwrite-strings dnl | |
94 | -Wpointer-arith dnl | |
95 | -Wmissing-declarations dnl | |
96 | -Wredundant-decls dnl | |
97 | -Wno-unused-parameter dnl | |
98 | -Wno-missing-field-initializers dnl | |
99 | -Wformat=2 dnl | |
100 | -Wcast-align dnl | |
101 | -Wformat-nonliteral dnl | |
102 | -Wformat-security dnl | |
103 | -Wsign-compare dnl | |
104 | -Wstrict-aliasing dnl | |
105 | -Wshadow dnl | |
106 | -Winline dnl | |
107 | -Wpacked dnl | |
108 | -Wmissing-format-attribute dnl | |
109 | -Wmissing-noreturn dnl | |
110 | -Winit-self dnl | |
111 | -Wredundant-decls dnl | |
112 | -Wmissing-include-dirs dnl | |
113 | -Wunused-but-set-variable dnl | |
114 | -Warray-bounds dnl | |
115 | -Wreturn-type dnl | |
116 | -Wswitch-enum dnl | |
117 | -Wswitch-default dnl | |
118 | -Wduplicated-cond dnl | |
119 | -Wduplicated-branches dnl | |
120 | -Wlogical-op dnl | |
121 | -Wrestrict dnl | |
122 | -Wnull-dereference dnl | |
123 | -Wdouble-promotion dnl | |
124 | $4 dnl | |
125 | $5 dnl | |
126 | $6 dnl | |
127 | $7 dnl | |
128 | ],ax_warn_cflags_variable,[$ax_compiler_flags_test]) | |
129 | ]) | |
130 | AS_IF([test "$ax_enable_compile_warnings" = "error"],[ | |
131 | # "error" flags; -Werror has to be appended unconditionally because | |
132 | # it's not possible to test for | |
133 | # | |
134 | # suggest-attribute=format is disabled because it gives too many false | |
135 | # positives | |
136 | AX_APPEND_FLAG([-Werror],ax_warn_cflags_variable) | |
137 | ||
138 | AX_APPEND_COMPILE_FLAGS([ dnl | |
139 | [$ax_compiler_no_suggest_attribute_flags] dnl | |
140 | ],ax_warn_cflags_variable,[$ax_compiler_flags_test]) | |
141 | ]) | |
142 | ||
143 | # In the flags below, when disabling specific flags, always add *both* | |
144 | # -Wno-foo and -Wno-error=foo. This fixes the situation where (for example) | |
145 | # we enable -Werror, disable a flag, and a build bot passes CFLAGS=-Wall, | |
146 | # which effectively turns that flag back on again as an error. | |
147 | for flag in $ax_warn_cflags_variable; do | |
148 | AS_CASE([$flag], | |
149 | [-Wno-*=*],[], | |
150 | [-Wno-*],[ | |
151 | AX_APPEND_COMPILE_FLAGS([-Wno-error=$(AS_ECHO([$flag]) | $SED 's/^-Wno-//')], | |
152 | ax_warn_cflags_variable, | |
153 | [$ax_compiler_flags_test]) | |
154 | ]) | |
155 | done | |
156 | ||
157 | AC_LANG_POP([C]) | |
158 | ||
159 | # Substitute the variables | |
160 | AC_SUBST(ax_warn_cflags_variable) | |
161 | ])dnl AX_COMPILER_FLAGS |