1# SYNOPSIS 2# 3# MHD_CHECK_FUNC([FUNCTION_NAME], 4# [INCLUDES=AC_INCLUDES_DEFAULT], [CHECK_CODE], 5# [ACTION-IF-AVAILABLE], [ACTION-IF-NOT-AVAILABLE], 6# [ADDITIONAL_LIBS]) 7# 8# DESCRIPTION 9# 10# This macro checks for presence of specific function by including 11# specified headers and compiling and linking CHECK_CODE. 12# This check both declaration and presence in library. 13# Unlike AC_CHECK_FUNCS macro, this macro do not produce false 14# negative result if function is declared with specific calling 15# conventions like __stdcall' or attribute like 16# __attribute__((__dllimport__)) and linker failed to build test 17# program if library contains function with calling conventions 18# different from declared. 19# By using definition from provided headers, this macro ensures that 20# correct calling convention is used for detection. 21# 22# Example usage: 23# 24# MHD_CHECK_FUNC([memmem], 25# [[#include <string.h>]], 26# [const void *ptr = memmem("aa", 2, "a", 1); (void)ptr;], 27# [var_use_memmem='yes'], [var_use_memmem='no']) 28# 29# Defined cache variable used in check so if any test will not work 30# correctly on some platform, user may simply fix it by giving cache 31# variable in configure parameters, for example: 32# 33# ./configure mhd_cv_func_memmem_have=no 34# 35# This simplify building from source on exotic platforms as patching 36# of configure.ac is not required to change results of tests. 37# 38# LICENSE 39# 40# Copyright (c) 2019 Karlson2k (Evgeny Grin) <k2k@narod.ru> 41# 42# Copying and distribution of this file, with or without modification, are 43# permitted in any medium without royalty provided the copyright notice 44# and this notice are preserved. This file is offered as-is, without any 45# warranty. 46 47#serial 1 48 49AC_DEFUN([MHD_CHECK_FUNC],[dnl 50 AC_PREREQ([2.64])dnl for AS_VAR_IF, m4_ifblank, m4_ifnblank 51 m4_ifblank(m4_translit([$1],[()],[ ]), [m4_fatal([First macro argument must not be empty])])dnl 52 m4_ifblank([$3], [m4_fatal([Third macro argument must not be empty])])dnl 53 m4_bmatch(m4_normalize([$1]), [\s],dnl 54 [m4_fatal([First macro argument must not contain whitespaces])])dnl 55 m4_if(m4_index([$3], m4_normalize(m4_translit([$1],[()],[ ]))), [-1], dnl 56 [m4_fatal([CHECK_CODE parameter (third macro argument) do not contain ']m4_normalize([$1])[' token])])dnl 57 AS_VAR_PUSHDEF([cv_Var], [mhd_cv_func_]m4_bpatsubst(m4_normalize(m4_translit([$1],[()],[ ])),[[^a-zA-Z0-9]],[_]))dnl 58 dnl 59 AC_CACHE_CHECK([for function $1], [cv_Var], 60 [dnl 61 m4_ifnblank([$6],[dnl 62 mhd_check_func_SAVE_LIBS="$LIBS" 63 LIBS="$LIBS m4_normalize([$6])" 64 ])dnl 65 AC_LINK_IFELSE( 66 [AC_LANG_PROGRAM([m4_default_nblank([$2],[AC_INCLUDES_DEFAULT])], [$3]) ], 67 [AS_VAR_SET([cv_Var],["yes"])], [AS_VAR_SET([cv_Var],["no"])] ) 68 m4_ifnblank([$6],[dnl 69 LIBS="${mhd_check_func_SAVE_LIBS}" 70 AS_UNSET([mhd_check_func_SAVE_LIBS]) 71 ])dnl 72 ]) 73 AS_VAR_IF([cv_Var], ["yes"], 74 [AC_DEFINE([[HAVE_]]m4_bpatsubst(m4_toupper(m4_normalize(m4_translit([$1],[()],[ ]))),[[^A-Z0-9]],[_]), 75 [1], [Define to 1 if you have the `]m4_normalize(m4_translit([$1],[()],[ ]))[' function.]) 76 m4_n([$4])dnl 77 ], [$5]) 78 AS_VAR_POPDEF([cv_Var])dnl 79]) 80 81