libmicrohttpd

HTTP/1.x server C library (MHD 1.x, stable)
Log | Files | Refs | Submodules | README | LICENSE

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 ])