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