aboutsummaryrefslogtreecommitdiff
path: root/m4/mhd_check_cc_cflag.m4
diff options
context:
space:
mode:
authorEvgeny Grin (Karlson2k) <k2k@narod.ru>2022-04-13 20:53:21 +0300
committerEvgeny Grin (Karlson2k) <k2k@narod.ru>2022-04-16 13:37:52 +0300
commit9b1865f6918057e6600ff6b455bb8486a016fce1 (patch)
treeffdd46232704ffcf53e7b240677ef6b5b74036ab /m4/mhd_check_cc_cflag.m4
parentfff6d80c4bfa70a1d3368c9135b67eae2716a4b5 (diff)
downloadlibmicrohttpd-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.m4256
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
41AC_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#
51AC_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#
75AC_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([[
107int 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#
160AC_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#
193AC_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([[
208int 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([[
231int 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])