mhd_check_cc_cflag.m4 (10168B)
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 supported. 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 ])