diff options
author | Evgeny Grin (Karlson2k) <k2k@narod.ru> | 2022-04-13 20:53:21 +0300 |
---|---|---|
committer | Evgeny Grin (Karlson2k) <k2k@narod.ru> | 2022-04-16 13:37:52 +0300 |
commit | 9b1865f6918057e6600ff6b455bb8486a016fce1 (patch) | |
tree | ffdd46232704ffcf53e7b240677ef6b5b74036ab /m4/mhd_check_cc_cflag.m4 | |
parent | fff6d80c4bfa70a1d3368c9135b67eae2716a4b5 (diff) | |
download | libmicrohttpd-9b1865f6918057e6600ff6b455bb8486a016fce1.tar.gz libmicrohttpd-9b1865f6918057e6600ff6b455bb8486a016fce1.zip |
configure: added --enable-build-type=TYPE
Useful to quickly define settings combination. Individual settings still
could be overridden by individual parameters.
Added autoconf macros for compiler and linker flags
Diffstat (limited to 'm4/mhd_check_cc_cflag.m4')
-rw-r--r-- | m4/mhd_check_cc_cflag.m4 | 256 |
1 files changed, 256 insertions, 0 deletions
diff --git a/m4/mhd_check_cc_cflag.m4 b/m4/mhd_check_cc_cflag.m4 new file mode 100644 index 00000000..f387495b --- /dev/null +++ b/m4/mhd_check_cc_cflag.m4 | |||
@@ -0,0 +1,256 @@ | |||
1 | # SYNOPSIS | ||
2 | # | ||
3 | # MHD_CHECK_CC_CFLAG([FLAG-TO-TEST], [VARIABLE-TO-PREPEND-CFLAGS], | ||
4 | # [ACTION-IF-SUPPORTED], [ACTION-IF-NOT-SUPPORTED]) | ||
5 | # | ||
6 | # DESCRIPTION | ||
7 | # | ||
8 | # This macro checks whether the specific compiler flag is supported. | ||
9 | # The check is performing by prepending FLAG-TO-TEST to CFLAGS, then | ||
10 | # prepending value of VARIABLE-TO-PREPEND-CFLAGS (if any) to CFLAGS, and | ||
11 | # then performing compile and link test. If test succeed without warnings, | ||
12 | # then the flag is considered to be suppoted. Otherwise, if compile and link | ||
13 | # without test flag can be done without any warning, the flag is considered | ||
14 | # to be unsuppoted. | ||
15 | # | ||
16 | # Example usage: | ||
17 | # | ||
18 | # MHD_CHECK_CC_CFLAG([-Wshadow], [additional_CFLAGS], | ||
19 | # [additional_CFLAGS="${additional_CFLAGS} -Wshadow"]) | ||
20 | # | ||
21 | # Defined cache variable used in check so if any test will not work | ||
22 | # correctly on some platform, user may simply fix it by giving cache | ||
23 | # variable in configure parameters, for example: | ||
24 | # | ||
25 | # ./configure mhd_cv_cc_fl_supp__Wshadow=no | ||
26 | # | ||
27 | # This simplify building from source on exotic platforms as patching | ||
28 | # of configure.ac is not required to change results of tests. | ||
29 | # | ||
30 | # LICENSE | ||
31 | # | ||
32 | # Copyright (c) 2022 Karlson2k (Evgeny Grin) <k2k@narod.ru> | ||
33 | # | ||
34 | # Copying and distribution of this file, with or without modification, are | ||
35 | # permitted in any medium without royalty provided the copyright notice | ||
36 | # and this notice are preserved. This file is offered as-is, without any | ||
37 | # warranty. | ||
38 | |||
39 | #serial 2 | ||
40 | |||
41 | AC_DEFUN([MHD_CHECK_CC_CFLAG],[dnl | ||
42 | _MHD_CHECK_CC_XFLAG([$1],[$2],[$3],[$4],[[CFLAGS]])dnl | ||
43 | ]) | ||
44 | |||
45 | # SYNOPSIS | ||
46 | # | ||
47 | # _MHD_CHECK_CC_XFLAG([FLAG-TO-TEST], [VARIABLE-TO-PREPEND-CFLAGS], | ||
48 | # [ACTION-IF-SUPPORTED], [ACTION-IF-NOT-SUPPORTED], | ||
49 | # [CFLAGS|LDFLAGS]) | ||
50 | # | ||
51 | AC_DEFUN([_MHD_CHECK_CC_XFLAG],[dnl | ||
52 | AC_PREREQ([2.64])dnl for AS_VAR_IF, m4_ifnblank | ||
53 | AC_LANG_ASSERT([C])dnl | ||
54 | AC_REQUIRE([AC_PROG_CC])dnl | ||
55 | m4_ifblank([$1], [m4_fatal([$0: First macro argument must not be empty])])dnl | ||
56 | m4_bmatch(m4_normalize([$1]), [\s],dnl | ||
57 | [m4_fatal([$0: First macro argument must not contain whitespaces])])dnl | ||
58 | m4_bmatch(_mhd_norm_expd([$2]), [\s],dnl | ||
59 | [m4_fatal([$0: Second macro argument must not contain whitespaces])])dnl | ||
60 | m4_bmatch([$1], [\$], [m4_fatal([$0: First macro argument must not contain '$'])])dnl | ||
61 | m4_bmatch([$2], [\$], [m4_fatal([$0: Second macro argument must not contain '$'])])dnl | ||
62 | AC_REQUIRE([MHD_FIND_CC_XFLAG_WARNPARAMS])dnl sets 'mhd_xFLAGS_params_warn' variable | ||
63 | m4_bmatch(_mhd_norm_expd([$5]), [^\(CFLAGS\|LDFLAGS\)$],[],dnl | ||
64 | [m4_fatal([$0: Fifth macro argument must be either 'CFLAGS' or 'LDFLAGS; ']_mhd_norm_expd([$5])[' is not supported])])dnl | ||
65 | _MHD_CHECK_CC_XFLAG_BODY([$1],[$2],[$3],[$4],[mhd_xFLAGS_params_warn],[$5])dnl | ||
66 | ]) | ||
67 | |||
68 | |||
69 | # SYNOPSIS | ||
70 | # | ||
71 | # _MHD_CHECK_CC_XFLAG_BODY([FLAG-TO-TEST], [VARIABLE-TO-PREPEND-CFLAGS], | ||
72 | # [ACTION-IF-SUPPORTED], [ACTION-IF-NOT-SUPPORTED], | ||
73 | # [VARIABLE-TO-ENABLE-WARNS], [CFLAGS|LDFLAGS]) | ||
74 | # | ||
75 | AC_DEFUN([_MHD_CHECK_CC_XFLAG_BODY],[dnl | ||
76 | AC_LANG_ASSERT([C])dnl | ||
77 | m4_ifblank([$1], [m4_fatal([$0: First macro argument must not be empty])])dnl | ||
78 | m4_bmatch(_mhd_norm_expd([$1]), [\s],dnl | ||
79 | [m4_fatal([$0: First macro argument must not contain whitespaces])])dnl | ||
80 | m4_bmatch(_mhd_norm_expd([$2]), [\s],dnl | ||
81 | [m4_fatal([$0: Second macro argument must not contain whitespaces])])dnl | ||
82 | m4_bmatch([$1], [\$], [m4_fatal([$0: First macro argument must not contain '$'])])dnl | ||
83 | m4_bmatch([$2], [\$], [m4_fatal([$0: Second macro argument must not contain '$'])])dnl | ||
84 | m4_ifblank([$5], [m4_fatal([$0: Fifth macro argument must not be empty])])dnl | ||
85 | m4_bmatch([$5], [\$], [m4_fatal([$0: Fifth macro argument must not contain '$'])])dnl | ||
86 | m4_bmatch(_mhd_norm_expd([$6]), [^\(CFLAGS\|LDFLAGS\)$],[],dnl | ||
87 | [m4_fatal([$0: Sixth macro argument must be either 'CFLAGS' or 'LDFLAGS; ']_mhd_norm_expd([$6])[' is not supported])])dnl | ||
88 | m4_pushdef([XFLAGS],_mhd_norm_expd([$6]))dnl | ||
89 | dnl Keep uppercase letters to avoid clashes for parameters like -fPIE and -fpie | ||
90 | AS_VAR_PUSHDEF([cv_Var],[mhd_cv_cc_]m4_tolower(m4_substr(_mhd_norm_expd([$6]),0,1))[fl_supp_]m4_bpatsubst(_mhd_norm_expd([$1]),[[^a-zA-Z0-9]],[_]))dnl | ||
91 | |||
92 | AC_CACHE_CHECK([whether $[]CC supports _mhd_norm_expd([$1]) flag], cv_Var, | ||
93 | [dnl | ||
94 | AS_VAR_PUSHDEF([save_xFLAGS_Var], [mhd_check_cc_flag_save_]XFLAGS)dnl | ||
95 | AS_VAR_SET([save_xFLAGS_Var],["${XFLAGS}"]) | ||
96 | m4_ifnblank([$2],[dnl | ||
97 | m4_if(_mhd_norm_expd([$2]),[XFLAGS], | ||
98 | [XFLAGS="${save_xFLAGS_Var} _mhd_norm_expd([$1]) $[]{_mhd_norm_expd([$5])}"], | ||
99 | [XFLAGS="$[]{_mhd_norm_expd([$2])} _mhd_norm_expd([$1]) ${save_xFLAGS_Var} $[]{_mhd_norm_expd([$5])}"]) | ||
100 | ],[dnl | ||
101 | XFLAGS="_mhd_norm_expd([$1]) $[]XFLAGS $[]{_mhd_norm_expd([$5])}" | ||
102 | ])dnl | ||
103 | mhd_check_cc_flag_save_c_werror_flag="$ac_c_werror_flag" | ||
104 | ac_c_werror_flag=yes | ||
105 | [#] Reuse the same source for all the checks here | ||
106 | AC_LANG_CONFTEST([AC_LANG_SOURCE([[ | ||
107 | int main(void) | ||
108 | { | ||
109 | return 0; | ||
110 | } | ||
111 | ]])]) | ||
112 | AC_LINK_IFELSE([], | ||
113 | [AS_VAR_SET([cv_Var],["yes"])], | ||
114 | [ [#] Compile and link failed with test flag added | ||
115 | m4_ifnblank([$2],[dnl | ||
116 | m4_if(_mhd_norm_expd([$2]),[XFLAGS], | ||
117 | [XFLAGS="${save_xFLAGS_Var} $[]{_mhd_norm_expd([$5])}"], | ||
118 | [XFLAGS="$[]{_mhd_norm_expd([$2])} ${save_xFLAGS_Var} $[]{_mhd_norm_expd([$5])}"]) | ||
119 | ],[dnl | ||
120 | XFLAGS="${save_xFLAGS_Var} $[]{_mhd_norm_expd([$5])}" | ||
121 | ])dnl | ||
122 | AC_LINK_IFELSE([], | ||
123 | [AS_VAR_SET([cv_Var],["no"])], | ||
124 | [ [#] Compile and link failed with test flag removed as well | ||
125 | m4_ifnblank([$2],[dnl | ||
126 | m4_if(_mhd_norm_expd([$2]),[XFLAGS], | ||
127 | [XFLAGS="${save_xFLAGS_Var} _mhd_norm_expd([$1])"], | ||
128 | [XFLAGS="$[]{_mhd_norm_expd([$2])} _mhd_norm_expd([$1]) ${save_xFLAGS_Var}"]) | ||
129 | ],[dnl | ||
130 | XFLAGS="_mhd_norm_expd([$1]) ${save_xFLAGS_Var}" | ||
131 | ])dnl | ||
132 | ac_c_werror_flag="$mhd_check_cc_flag_save_c_werror_flag" | ||
133 | AC_LINK_IFELSE([], | ||
134 | [AS_VAR_SET([cv_Var],["yes"])], | ||
135 | [AS_VAR_SET([cv_Var],["no"])], | ||
136 | ) | ||
137 | ] | ||
138 | ) | ||
139 | ] | ||
140 | ) | ||
141 | ac_c_werror_flag="$mhd_check_cc_flag_save_c_werror_flag" | ||
142 | AS_VAR_SET([XFLAGS],["${save_xFLAGS_Var}"]) | ||
143 | AS_UNSET(save_xFLAGS_Var) | ||
144 | AS_VAR_POPDEF([save_xFLAGS_Var])dnl | ||
145 | ] | ||
146 | ) | ||
147 | m4_ifnblank([$3$4],[dnl | ||
148 | AS_VAR_IF([cv_Var], ["yes"], [$3], m4_default_nblank([$4])) | ||
149 | ])dnl | ||
150 | AS_VAR_POPDEF([cv_Var])dnl | ||
151 | m4_popdef([XFLAGS])dnl | ||
152 | ]) | ||
153 | |||
154 | |||
155 | # | ||
156 | # SYNOPSIS | ||
157 | # | ||
158 | # MHD_FIND_CC_XFLAG_WARNPARAMS() | ||
159 | # | ||
160 | AC_DEFUN([MHD_FIND_CC_XFLAG_WARNPARAMS],[dnl | ||
161 | AC_LANG_ASSERT([C])dnl | ||
162 | AC_REQUIRE([MHD_FIND_CC_CFLAG_WWARN])dnl | ||
163 | mhd_xFLAGS_params_warn='' | ||
164 | _MHD_CHECK_CC_XFLAG_BODY([-Wunused-command-line-argument],[], | ||
165 | [ | ||
166 | MHD_APPEND_FLAG_TO_VAR([mhd_xFLAGS_params_warn],[-Wunused-command-line-argument]) | ||
167 | ],[],[mhd_cv_cc_flag_Wwarn],[[CFLAGS]] | ||
168 | ) | ||
169 | _MHD_CHECK_CC_XFLAG_BODY([-Wignored-optimization-argument],[], | ||
170 | [ | ||
171 | MHD_APPEND_FLAG_TO_VAR([mhd_xFLAGS_params_warn],[-Wignored-optimization-argument]) | ||
172 | ],[],[mhd_cv_cc_flag_Wwarn],[[CFLAGS]] | ||
173 | ) | ||
174 | _MHD_CHECK_CC_XFLAG_BODY([-Winvalid-command-line-argument],[], | ||
175 | [ | ||
176 | MHD_APPEND_FLAG_TO_VAR([mhd_xFLAGS_params_warn],[-Winvalid-command-line-argument]) | ||
177 | ],[],[mhd_cv_cc_flag_Wwarn],[[CFLAGS]] | ||
178 | ) | ||
179 | _MHD_CHECK_CC_XFLAG_BODY([-Wunknown-argument],[], | ||
180 | [ | ||
181 | MHD_APPEND_FLAG_TO_VAR([mhd_xFLAGS_params_warn],[-Wunknown-argument]) | ||
182 | ],[],[mhd_cv_cc_flag_Wwarn],[[CFLAGS]] | ||
183 | ) | ||
184 | MHD_PREPEND_FLAG_TO_VAR([mhd_xFLAGS_params_warn],[$mhd_cv_cc_flag_Wwarn]) | ||
185 | ]) | ||
186 | |||
187 | |||
188 | # | ||
189 | # SYNOPSIS | ||
190 | # | ||
191 | # MHD_FIND_CC_CFLAG_WWARN() | ||
192 | # | ||
193 | AC_DEFUN([MHD_FIND_CC_CFLAG_WWARN],[dnl | ||
194 | AC_PREREQ([2.64])dnl for AS_VAR_IF, m4_ifnblank | ||
195 | AC_REQUIRE([AC_PROG_CC])dnl | ||
196 | AC_LANG_ASSERT([C])dnl | ||
197 | AC_MSG_CHECKING([for $[]CC flag to warn on unknown -W parameters]) | ||
198 | AC_CACHE_VAL([mhd_cv_cc_flag_Wwarn], | ||
199 | [ | ||
200 | mhd_check_cc_flagwarn_save_c_werror_flag="$ac_c_werror_flag" | ||
201 | ac_c_werror_flag=yes | ||
202 | mhd_find_cc_Wwarn_save_CFLAGS="$CFLAGS" | ||
203 | AS_UNSET([mhd_cv_cc_flag_Wwarn]) | ||
204 | for mhd_cv_cc_flag_Wwarn in '' '-Wunknown-warning-option' '-Werror=unknown-warning-option' ; do | ||
205 | AS_VAR_IF([mhd_cv_cc_flag_Wwarn], ["unknown"], [break]) | ||
206 | [#] Reuse the same source for all the checks here | ||
207 | AC_LANG_CONFTEST([AC_LANG_SOURCE([[ | ||
208 | int main(void) | ||
209 | { | ||
210 | return 0; | ||
211 | } | ||
212 | ]])]) | ||
213 | CFLAGS="-Wmhd-noexist-flag $mhd_find_cc_Wwarn_save_CFLAGS $mhd_cv_cc_flag_Wwarn" | ||
214 | AC_LINK_IFELSE([], | ||
215 | [], | ||
216 | [ [#] Compile and link failed if test flag and non-existing flag added | ||
217 | CFLAGS="$mhd_find_cc_Wwarn_save_CFLAGS $mhd_cv_cc_flag_Wwarn" | ||
218 | AC_LINK_IFELSE([], | ||
219 | [ [#] Compile and link succeed if only test flag added | ||
220 | break | ||
221 | ] | ||
222 | ) | ||
223 | ] | ||
224 | ) | ||
225 | done | ||
226 | CFLAGS="$mhd_find_cc_Wwarn_save_CFLAGS" | ||
227 | AS_VAR_IF([mhd_cv_cc_flag_Wwarn], ["unknown"], | ||
228 | [ | ||
229 | _AS_ECHO_LOG([No suitable flags detected. Check whether default flags are correct.]) | ||
230 | AC_LINK_IFELSE([AC_LANG_SOURCE([[ | ||
231 | int main(void) | ||
232 | { | ||
233 | return 0; | ||
234 | } | ||
235 | ]])], | ||
236 | [:], | ||
237 | [ [#] Compile and link fails (or warns) with default flags | ||
238 | AC_MSG_WARN([Compiler warns (of fails) with default flags!]) | ||
239 | AC_MSG_WARN([Check whether compiler and compiler flags are correct.]) | ||
240 | ] | ||
241 | ) | ||
242 | ] | ||
243 | ) | ||
244 | CFLAGS="$mhd_find_cc_Wwarn_save_CFLAGS" | ||
245 | AS_UNSET([mhd_find_cc_Wwarn_save_CFLAGS]) | ||
246 | ac_c_werror_flag="$mhd_check_cc_flagwarn_save_c_werror_flag" | ||
247 | AS_UNSET([mhd_check_cc_flagwarn_save_c_werror_flag]) | ||
248 | ] | ||
249 | ) | ||
250 | AS_IF([test -z "$mhd_cv_cc_flag_Wwarn"], | ||
251 | [AC_MSG_RESULT([none needed])], | ||
252 | [AC_MSG_RESULT([$mhd_cv_cc_flag_Wwarn])]) | ||
253 | AS_VAR_IF([mhd_cv_cc_flag_Wwarn], ["unknown"], | ||
254 | [AC_MSG_WARN([Unable to find compiler flags to warn on unsupported -W options. Final compiler options may be suboptimal.])]) | ||
255 | |||
256 | ]) | ||