123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 |
- # SYNOPSIS
- #
- # MHD_CHECK_CC_CFLAG([FLAG-TO-TEST], [VARIABLE-TO-PREPEND-CFLAGS],
- # [ACTION-IF-SUPPORTED], [ACTION-IF-NOT-SUPPORTED])
- #
- # DESCRIPTION
- #
- # This macro checks whether the specific compiler flag is supported.
- # The check is performing by prepending FLAG-TO-TEST to CFLAGS, then
- # prepending value of VARIABLE-TO-PREPEND-CFLAGS (if any) to CFLAGS, and
- # then performing compile and link test. If test succeed without warnings,
- # then the flag is considered to be supported. Otherwise, if compile and link
- # without test flag can be done without any warning, the flag is considered
- # to be unsuppoted.
- #
- # Example usage:
- #
- # MHD_CHECK_CC_CFLAG([-Wshadow], [additional_CFLAGS],
- # [additional_CFLAGS="${additional_CFLAGS} -Wshadow"])
- #
- # Defined cache variable used in check so if any test will not work
- # correctly on some platform, user may simply fix it by giving cache
- # variable in configure parameters, for example:
- #
- # ./configure mhd_cv_cc_fl_supp__Wshadow=no
- #
- # This simplify building from source on exotic platforms as patching
- # of configure.ac is not required to change results of tests.
- #
- # LICENSE
- #
- # Copyright (c) 2022 Karlson2k (Evgeny Grin) <k2k@narod.ru>
- #
- # Copying and distribution of this file, with or without modification, are
- # permitted in any medium without royalty provided the copyright notice
- # and this notice are preserved. This file is offered as-is, without any
- # warranty.
- #serial 2
- AC_DEFUN([MHD_CHECK_CC_CFLAG],[dnl
- _MHD_CHECK_CC_XFLAG([$1],[$2],[$3],[$4],[[CFLAGS]])dnl
- ])
- # SYNOPSIS
- #
- # _MHD_CHECK_CC_XFLAG([FLAG-TO-TEST], [VARIABLE-TO-PREPEND-CFLAGS],
- # [ACTION-IF-SUPPORTED], [ACTION-IF-NOT-SUPPORTED],
- # [CFLAGS|LDFLAGS])
- #
- AC_DEFUN([_MHD_CHECK_CC_XFLAG],[dnl
- AC_PREREQ([2.64])dnl for AS_VAR_IF, m4_ifnblank
- AC_LANG_ASSERT([C])dnl
- AC_REQUIRE([AC_PROG_CC])dnl
- m4_ifblank([$1], [m4_fatal([$0: First macro argument must not be empty])])dnl
- m4_bmatch(m4_normalize([$1]), [\s],dnl
- [m4_fatal([$0: First macro argument must not contain whitespaces])])dnl
- m4_bmatch(_mhd_norm_expd([$2]), [\s],dnl
- [m4_fatal([$0: Second macro argument must not contain whitespaces])])dnl
- m4_bmatch([$1], [\$], [m4_fatal([$0: First macro argument must not contain '$'])])dnl
- m4_bmatch([$2], [\$], [m4_fatal([$0: Second macro argument must not contain '$'])])dnl
- AC_REQUIRE([MHD_FIND_CC_XFLAG_WARNPARAMS])dnl sets 'mhd_xFLAGS_params_warn' variable
- m4_bmatch(_mhd_norm_expd([$5]), [^\(CFLAGS\|LDFLAGS\)$],[],dnl
- [m4_fatal([$0: Fifth macro argument must be either 'CFLAGS' or 'LDFLAGS; ']_mhd_norm_expd([$5])[' is not supported])])dnl
- _MHD_CHECK_CC_XFLAG_BODY([$1],[$2],[$3],[$4],[mhd_xFLAGS_params_warn],[$5])dnl
- ])
- # SYNOPSIS
- #
- # _MHD_CHECK_CC_XFLAG_BODY([FLAG-TO-TEST], [VARIABLE-TO-PREPEND-CFLAGS],
- # [ACTION-IF-SUPPORTED], [ACTION-IF-NOT-SUPPORTED],
- # [VARIABLE-TO-ENABLE-WARNS], [CFLAGS|LDFLAGS])
- #
- AC_DEFUN([_MHD_CHECK_CC_XFLAG_BODY],[dnl
- AC_LANG_ASSERT([C])dnl
- m4_ifblank([$1], [m4_fatal([$0: First macro argument must not be empty])])dnl
- m4_bmatch(_mhd_norm_expd([$1]), [\s],dnl
- [m4_fatal([$0: First macro argument must not contain whitespaces])])dnl
- m4_bmatch(_mhd_norm_expd([$2]), [\s],dnl
- [m4_fatal([$0: Second macro argument must not contain whitespaces])])dnl
- m4_bmatch([$1], [\$], [m4_fatal([$0: First macro argument must not contain '$'])])dnl
- m4_bmatch([$2], [\$], [m4_fatal([$0: Second macro argument must not contain '$'])])dnl
- m4_ifblank([$5], [m4_fatal([$0: Fifth macro argument must not be empty])])dnl
- m4_bmatch([$5], [\$], [m4_fatal([$0: Fifth macro argument must not contain '$'])])dnl
- m4_bmatch(_mhd_norm_expd([$6]), [^\(CFLAGS\|LDFLAGS\)$],[],dnl
- [m4_fatal([$0: Sixth macro argument must be either 'CFLAGS' or 'LDFLAGS; ']_mhd_norm_expd([$6])[' is not supported])])dnl
- m4_pushdef([XFLAGS],_mhd_norm_expd([$6]))dnl
- dnl Keep uppercase letters to avoid clashes for parameters like -fPIE and -fpie
- 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
- AC_CACHE_CHECK([whether $[]CC supports _mhd_norm_expd([$1]) flag], cv_Var,
- [dnl
- AS_VAR_PUSHDEF([save_xFLAGS_Var], [mhd_check_cc_flag_save_]XFLAGS)dnl
- AS_VAR_SET([save_xFLAGS_Var],["${XFLAGS}"])
- m4_ifnblank([$2],[dnl
- m4_if(_mhd_norm_expd([$2]),[XFLAGS],
- [XFLAGS="${save_xFLAGS_Var} _mhd_norm_expd([$1]) $[]{_mhd_norm_expd([$5])}"],
- [XFLAGS="$[]{_mhd_norm_expd([$2])} _mhd_norm_expd([$1]) ${save_xFLAGS_Var} $[]{_mhd_norm_expd([$5])}"])
- ],[dnl
- XFLAGS="_mhd_norm_expd([$1]) $[]XFLAGS $[]{_mhd_norm_expd([$5])}"
- ])dnl
- mhd_check_cc_flag_save_c_werror_flag="$ac_c_werror_flag"
- ac_c_werror_flag=yes
- [#] Reuse the same source for all the checks here
- AC_LANG_CONFTEST([AC_LANG_SOURCE([[
- int main(void)
- {
- return 0;
- }
- ]])])
- AC_LINK_IFELSE([],
- [AS_VAR_SET([cv_Var],["yes"])],
- [ [#] Compile and link failed with test flag added
- m4_ifnblank([$2],[dnl
- m4_if(_mhd_norm_expd([$2]),[XFLAGS],
- [XFLAGS="${save_xFLAGS_Var} $[]{_mhd_norm_expd([$5])}"],
- [XFLAGS="$[]{_mhd_norm_expd([$2])} ${save_xFLAGS_Var} $[]{_mhd_norm_expd([$5])}"])
- ],[dnl
- XFLAGS="${save_xFLAGS_Var} $[]{_mhd_norm_expd([$5])}"
- ])dnl
- AC_LINK_IFELSE([],
- [AS_VAR_SET([cv_Var],["no"])],
- [ [#] Compile and link failed with test flag removed as well
- m4_ifnblank([$2],[dnl
- m4_if(_mhd_norm_expd([$2]),[XFLAGS],
- [XFLAGS="${save_xFLAGS_Var} _mhd_norm_expd([$1])"],
- [XFLAGS="$[]{_mhd_norm_expd([$2])} _mhd_norm_expd([$1]) ${save_xFLAGS_Var}"])
- ],[dnl
- XFLAGS="_mhd_norm_expd([$1]) ${save_xFLAGS_Var}"
- ])dnl
- ac_c_werror_flag="$mhd_check_cc_flag_save_c_werror_flag"
- AC_LINK_IFELSE([],
- [AS_VAR_SET([cv_Var],["yes"])],
- [AS_VAR_SET([cv_Var],["no"])],
- )
- ]
- )
- ]
- )
- ac_c_werror_flag="$mhd_check_cc_flag_save_c_werror_flag"
- AS_VAR_SET([XFLAGS],["${save_xFLAGS_Var}"])
- AS_UNSET(save_xFLAGS_Var)
- AS_VAR_POPDEF([save_xFLAGS_Var])dnl
- ]
- )
- m4_ifnblank([$3$4],[dnl
- AS_VAR_IF([cv_Var], ["yes"], [$3], m4_default_nblank([$4]))
- ])dnl
- AS_VAR_POPDEF([cv_Var])dnl
- m4_popdef([XFLAGS])dnl
- ])
- #
- # SYNOPSIS
- #
- # MHD_FIND_CC_XFLAG_WARNPARAMS()
- #
- AC_DEFUN([MHD_FIND_CC_XFLAG_WARNPARAMS],[dnl
- AC_LANG_ASSERT([C])dnl
- AC_REQUIRE([MHD_FIND_CC_CFLAG_WWARN])dnl
- mhd_xFLAGS_params_warn=''
- _MHD_CHECK_CC_XFLAG_BODY([-Wunused-command-line-argument],[],
- [
- MHD_APPEND_FLAG_TO_VAR([mhd_xFLAGS_params_warn],[-Wunused-command-line-argument])
- ],[],[mhd_cv_cc_flag_Wwarn],[[CFLAGS]]
- )
- _MHD_CHECK_CC_XFLAG_BODY([-Wignored-optimization-argument],[],
- [
- MHD_APPEND_FLAG_TO_VAR([mhd_xFLAGS_params_warn],[-Wignored-optimization-argument])
- ],[],[mhd_cv_cc_flag_Wwarn],[[CFLAGS]]
- )
- _MHD_CHECK_CC_XFLAG_BODY([-Winvalid-command-line-argument],[],
- [
- MHD_APPEND_FLAG_TO_VAR([mhd_xFLAGS_params_warn],[-Winvalid-command-line-argument])
- ],[],[mhd_cv_cc_flag_Wwarn],[[CFLAGS]]
- )
- _MHD_CHECK_CC_XFLAG_BODY([-Wunknown-argument],[],
- [
- MHD_APPEND_FLAG_TO_VAR([mhd_xFLAGS_params_warn],[-Wunknown-argument])
- ],[],[mhd_cv_cc_flag_Wwarn],[[CFLAGS]]
- )
- MHD_PREPEND_FLAG_TO_VAR([mhd_xFLAGS_params_warn],[$mhd_cv_cc_flag_Wwarn])
- ])
- #
- # SYNOPSIS
- #
- # MHD_FIND_CC_CFLAG_WWARN()
- #
- AC_DEFUN([MHD_FIND_CC_CFLAG_WWARN],[dnl
- AC_PREREQ([2.64])dnl for AS_VAR_IF, m4_ifnblank
- AC_REQUIRE([AC_PROG_CC])dnl
- AC_LANG_ASSERT([C])dnl
- AC_MSG_CHECKING([for $[]CC flag to warn on unknown -W parameters])
- AC_CACHE_VAL([mhd_cv_cc_flag_Wwarn],
- [
- mhd_check_cc_flagwarn_save_c_werror_flag="$ac_c_werror_flag"
- ac_c_werror_flag=yes
- mhd_find_cc_Wwarn_save_CFLAGS="$CFLAGS"
- AS_UNSET([mhd_cv_cc_flag_Wwarn])
- for mhd_cv_cc_flag_Wwarn in '' '-Wunknown-warning-option' '-Werror=unknown-warning-option' ; do
- AS_VAR_IF([mhd_cv_cc_flag_Wwarn], ["unknown"], [break])
- [#] Reuse the same source for all the checks here
- AC_LANG_CONFTEST([AC_LANG_SOURCE([[
- int main(void)
- {
- return 0;
- }
- ]])])
- CFLAGS="-Wmhd-noexist-flag $mhd_find_cc_Wwarn_save_CFLAGS $mhd_cv_cc_flag_Wwarn"
- AC_LINK_IFELSE([],
- [],
- [ [#] Compile and link failed if test flag and non-existing flag added
- CFLAGS="$mhd_find_cc_Wwarn_save_CFLAGS $mhd_cv_cc_flag_Wwarn"
- AC_LINK_IFELSE([],
- [ [#] Compile and link succeed if only test flag added
- break
- ]
- )
- ]
- )
- done
- CFLAGS="$mhd_find_cc_Wwarn_save_CFLAGS"
- AS_VAR_IF([mhd_cv_cc_flag_Wwarn], ["unknown"],
- [
- _AS_ECHO_LOG([No suitable flags detected. Check whether default flags are correct.])
- AC_LINK_IFELSE([AC_LANG_SOURCE([[
- int main(void)
- {
- return 0;
- }
- ]])],
- [:],
- [ [#] Compile and link fails (or warns) with default flags
- AC_MSG_WARN([Compiler warns (of fails) with default flags!])
- AC_MSG_WARN([Check whether compiler and compiler flags are correct.])
- ]
- )
- ]
- )
- CFLAGS="$mhd_find_cc_Wwarn_save_CFLAGS"
- AS_UNSET([mhd_find_cc_Wwarn_save_CFLAGS])
- ac_c_werror_flag="$mhd_check_cc_flagwarn_save_c_werror_flag"
- AS_UNSET([mhd_check_cc_flagwarn_save_c_werror_flag])
- ]
- )
- AS_IF([test -z "$mhd_cv_cc_flag_Wwarn"],
- [AC_MSG_RESULT([none needed])],
- [AC_MSG_RESULT([$mhd_cv_cc_flag_Wwarn])])
- AS_VAR_IF([mhd_cv_cc_flag_Wwarn], ["unknown"],
- [AC_MSG_WARN([Unable to find compiler flags to warn on unsupported -W options. Final compiler options may be suboptimal.])])
- ])
|