diff options
author | Evgeny Grin (Karlson2k) <k2k@narod.ru> | 2023-03-06 18:33:23 +0300 |
---|---|---|
committer | Evgeny Grin (Karlson2k) <k2k@narod.ru> | 2023-03-14 20:43:45 +0300 |
commit | da73f7abf93c92ad49ef27af333846de66598458 (patch) | |
tree | bb86fbd821bbea59373e751d803fa2f4a9c014f1 | |
parent | 48255935e3f7f1b23852fc6cd811943263c102e8 (diff) |
mhd_check_func.m4: added check for function declaration
-rw-r--r-- | m4/mhd_check_func.m4 | 96 |
1 files changed, 55 insertions, 41 deletions
diff --git a/m4/mhd_check_func.m4 b/m4/mhd_check_func.m4 index 502a9b15..77e6baca 100644 --- a/m4/mhd_check_func.m4 +++ b/m4/mhd_check_func.m4 @@ -9,13 +9,15 @@ # # This macro checks for presence of specific function by including # specified headers and compiling and linking CHECK_CODE. -# This check both declaration and presence in library. +# This checks both declaration and presence in library. +# If function is available then macro HAVE_function_name (the name +# of the function convetedd to all uppercase characters) is defined +# automatically. # Unlike AC_CHECK_FUNCS macro, this macro do not produce false # negative result if function is declared with specific calling # conventions like __stdcall' or attribute like -# __attribute__((__dllimport__)) and linker failed to build test -# program if library contains function with calling conventions -# different from declared. +# __attribute__((__dllimport__)) and linker failing to build test +# program due to the different calling conventions. # By using definition from provided headers, this macro ensures that # correct calling convention is used for detection. # @@ -26,13 +28,13 @@ # [const void *ptr = memmem("aa", 2, "a", 1); (void)ptr;], # [var_use_memmem='yes'], [var_use_memmem='no']) # -# Defined cache variable used in check so if any test will not work +# The 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_func_memmem_have=no # -# This simplify building from source on exotic platforms as patching +# This simplifies building from source on exotic platforms as patching # of configure.ac is not required to change results of tests. # # LICENSE @@ -44,47 +46,59 @@ # and this notice are preserved. This file is offered as-is, without any # warranty. -#serial 4 +#serial 5 AC_DEFUN([MHD_CHECK_FUNC],[dnl - AC_PREREQ([2.64])dnl for AS_VAR_IF, m4_ifblank, m4_ifnblank - m4_ifblank(m4_translit([$1],[()],[ ]), [m4_fatal([First macro argument must not be empty])])dnl - m4_ifblank([$3], [m4_fatal([Third macro argument must not be empty])])dnl - m4_bmatch(m4_normalize([$1]), [\s],dnl - [m4_fatal([First macro argument must not contain whitespaces])])dnl - m4_if(m4_index([$3], m4_normalize(m4_translit([$1],[()],[ ]))), [-1], dnl - [m4_fatal([CHECK_CODE parameter (third macro argument) does not contain ']m4_normalize([$1])[' token])])dnl - AS_VAR_PUSHDEF([cv_Var], [mhd_cv_func_]m4_bpatsubst(_mhd_norm_expd(m4_translit([$1],[()],[ ])),[[^a-zA-Z0-9]],[_]))dnl - dnl - AC_CACHE_CHECK([for function $1], cv_Var, - [dnl - m4_ifnblank([$6],[dnl - mhd_check_func_SAVE_LIBS="$LIBS" - LIBS="$LIBS _mhd_norm_expd([$6])" - ])dnl - AC_LINK_IFELSE( - [AC_LANG_SOURCE([ +AC_PREREQ([2.64])dnl for AS_VAR_IF, m4_ifblank, m4_ifnblank +m4_newline([[# Expansion of $0 macro starts here]]) +AC_LANG_ASSERT([C])dnl +m4_ifblank(m4_translit([$1],[()],[ ]), [m4_fatal([First macro argument must not be empty])])dnl +m4_ifblank([$3], [m4_fatal([Third macro argument must not be empty])])dnl +m4_bmatch(m4_normalize([$1]), [\s],dnl + [m4_fatal([First macro argument must not contain whitespaces])])dnl +m4_if(m4_index([$3], m4_normalize(m4_translit([$1],[()],[ ]))), [-1], dnl + [m4_fatal([CHECK_CODE parameter (third macro argument) does not contain ']m4_normalize([$1])[' token])])dnl +AS_VAR_PUSHDEF([decl_cv_Var],[ac_cv_have_decl_]m4_bpatsubst(_mhd_norm_expd(m4_translit([$1],[()],[ ])),[[^a-zA-Z0-9]],[_]))dnl +AS_VAR_PUSHDEF([cv_Var],[mhd_cv_func_]m4_bpatsubst(_mhd_norm_expd(m4_translit([$1],[()],[ ])),[[^a-zA-Z0-9]],[_]))dnl +AS_VAR_SET_IF([cv_Var],[],[AC_CHECK_DECL(_mhd_norm_expd([$1]),[],[],[$2])]) +AC_CACHE_CHECK([for function $1], [cv_Var],dnl + [dnl + AS_VAR_IF([decl_cv_Var],["yes"],dnl + [dnl + m4_ifnblank([$6],[dnl + mhd_check_func_SAVE_LIBS="$LIBS" + LIBS="_mhd_norm_expd([$6]) $LIBS" + ])dnl + AC_LINK_IFELSE( + [AC_LANG_SOURCE([ m4_default_nblank([$2],[AC_INCLUDES_DEFAULT]) -int main(void) +[int main(void) { - $3 + ]$3[ return 0; } - ]) - ], - [AS_VAR_SET([cv_Var],["yes"])], [AS_VAR_SET([cv_Var],["no"])] ) - m4_ifnblank([$6],[dnl - LIBS="${mhd_check_func_SAVE_LIBS}" - AS_UNSET([mhd_check_func_SAVE_LIBS]) - ])dnl - ]) - AS_VAR_IF([cv_Var], ["yes"], - [AC_DEFINE([[HAVE_]]m4_bpatsubst(m4_toupper(_mhd_norm_expd(m4_translit([$1],[()],[ ]))),[[^A-Z0-9]],[_]), - [1], [Define to 1 if you have the ']_mhd_norm_expd(m4_translit([$1],[()],[ ]))[' function.]) - m4_n([$4])dnl - ], [$5]) - AS_VAR_POPDEF([cv_Var])dnl -]) + ]]) + ], + [AS_VAR_SET([cv_Var],["yes"])], + [AS_VAR_SET([cv_Var],["no"])]dnl + ) + m4_ifnblank([$6],[dnl + LIBS="${mhd_check_func_SAVE_LIBS}" + AS_UNSET([mhd_check_func_SAVE_LIBS]) + ])dnl + ],[AS_VAR_SET([cv_Var],["no"])]dnl + )dnl + ]dnl +) +AS_VAR_IF([cv_Var], ["yes"], + [AC_DEFINE([[HAVE_]]m4_bpatsubst(m4_toupper(_mhd_norm_expd(m4_translit([$1],[()],[ ]))),[[^A-Z0-9]],[_]), + [1], [Define to 1 if you have the ']_mhd_norm_expd(m4_translit([$1],[()],[ ]))[' function.]) + m4_n([$4])dnl + ],[$5]) +AS_VAR_POPDEF([cv_Var])dnl +AS_VAR_POPDEF([decl_cv_Var])dnl +m4_newline([[# Expansion of $0 macro ends here]]) +])dnl AC_DEFUN MHD_CHECK_FUNC |