libmicrohttpd2

HTTP server C library (MHD 2.x, alpha)
Log | Files | Refs | README | LICENSE

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