mhd_check_func_run.m4 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. # SYNOPSIS
  2. #
  3. # MHD_CHECK_FUNC_RUN(FUNCTION_NAME,
  4. # [INCLUDES=AC_INCLUDES_DEFAULT], CHECK_CODE
  5. # COMMAND_IF_CROSS_COMPILING,
  6. # [ACTION_IF_AVAILABLE], [ACTION_IF_NOT_AVAILABLE],
  7. # [ADDITIONAL_LIBS])
  8. #
  9. # DESCRIPTION
  10. #
  11. # This macro checks for presence of specific function by including
  12. # specified headers, checking for declaration of the function and then
  13. # compiling and linking CHECK_CODE. If all previous steps succeed,
  14. # the binary is executed.
  15. # The CHECK_CODE is full body of the "main" function and must include
  16. # the final "return" keyword.
  17. # This checks the declaration, the presence in library and the functionality.
  18. # If function is available then macro HAVE_function_name (the name
  19. # of the function conveted to all uppercase characters) is defined
  20. # automatically.
  21. # By using definition from provided headers, this macro ensures that
  22. # correct calling convention is used for detection.
  23. # The compilation and linking is tried even if cross-compiling. If they
  24. # failed then the result is "no".
  25. # The COMMAND_IF_CROSS_COMPILING commands are executed if and only if
  26. # the compilation and linking succeed. These commands must set 'cacheVar'
  27. # variable to "yes", "no", "assuming yes" or "assuming no".
  28. # ACTION_IF_SUCCEED is executed if result is "yes" or "assuming yes".
  29. # ACTION_IF_FAILED is executed if result is "no" or "assuming no".
  30. #
  31. # Example usage:
  32. #
  33. # MHD_CHECK_FUNC_RUN([memmem],
  34. # [[#include <string.h>]],
  35. # [[const void *ptr = memmem("aa", 2, "a", 1);
  36. # if (((void*)0) == ptr) return 1;
  37. # return 0;]],
  38. # [cacheVar="assuming yes"],
  39. # [var_use_memmem='yes'], [var_use_memmem='no'])
  40. #
  41. # The cache variable used in check so if any test will not work
  42. # correctly on some platform, user may simply fix it by giving cache
  43. # variable in configure parameters, for example:
  44. #
  45. # ./configure mhd_cv_works_func_memmem=no
  46. #
  47. # This simplifies building from source on exotic platforms as patching
  48. # of configure.ac is not required to change the results of the tests.
  49. #
  50. # LICENSE
  51. #
  52. # Copyright (c) 2024 Karlson2k (Evgeny Grin) <k2k@narod.ru>
  53. #
  54. # Copying and distribution of this file, with or without modification, are
  55. # permitted in any medium without royalty provided the copyright notice
  56. # and this notice are preserved. This file is offered as-is, without any
  57. # warranty.
  58. #serial 1
  59. dnl $1: FUNCTION_NAME
  60. dnl $2: INCLUDES
  61. dnl $3: CHECK_CODE
  62. dnl $4: COMMAND_IF_CROSS_COMPILING
  63. dnl $5: ACTION_IF_AVAILABLE
  64. dnl $6: ACTION_IF_NOT_AVAILABLE
  65. dnl $7: ADDITIONAL_LIBS
  66. AC_DEFUN([MHD_CHECK_FUNC_RUN],[dnl
  67. AC_PREREQ([2.64])dnl for AS_VAR_SET_IF, m4_ifblank, m4_ifnblank, m4_default_nblank
  68. m4_newline([[# Expansion of $0 macro starts here]])
  69. AC_LANG_ASSERT([C])dnl
  70. m4_ifblank(m4_translit([$1],[()],[ ]), [m4_fatal([$0: First macro argument ("FUNCTION_NAME") must not be empty])])dnl
  71. m4_ifblank([$3], [m4_fatal([$0: Third macro argument ("CHECK_CODE") must not be empty])])dnl
  72. m4_bmatch(m4_normalize([$1]), [\s],dnl
  73. [m4_fatal([$0: First macro argument ("FUNCTION_NAME") must not contain whitespaces])])dnl
  74. m4_if(m4_index([$3], m4_normalize(m4_translit([$1],[()],[ ]))), [-1], dnl
  75. [m4_fatal([$0: "CHECK_CODE" macro parameter (third argument) does not contain ']m4_normalize([$1])[' token])])dnl
  76. m4_if(m4_index([$3],return), [-1], dnl
  77. [m4_fatal([$0: "CHECK_CODE" macro parameter (third argument) does not contain 'return' token])])dnl
  78. m4_bmatch(_mhd_norm_expd([$4]),[\<]cacheVar[\>],[],dnl
  79. [m4_fatal([$0: The fourth macro argument ("COMMAND_IF_CROSS_COMPILING") must assign ]dnl
  80. [a value to the cache variable 'cacheVar'. The variable must be not overquoted.])])dnl
  81. AS_VAR_PUSHDEF([decl_cv_Var],[ac_cv_have_decl_]m4_bpatsubst(_mhd_norm_expd(m4_translit([$1],[()],[ ])),[[^a-zA-Z0-9]],[_]))dnl
  82. AS_VAR_PUSHDEF([cacheVar],[mhd_cv_works_func_]m4_bpatsubst(_mhd_norm_expd(m4_translit([$1],[()],[ ])),[[^a-zA-Z0-9]],[_]))dnl
  83. AS_VAR_SET_IF([cacheVar],[],[AC_CHECK_DECL(_mhd_norm_expd([$1]),[],[cacheVar="no"],[$2])])
  84. AC_CACHE_CHECK([whether '$1' available and works],[cacheVar],dnl
  85. [
  86. AC_LANG_CONFTEST([AC_LANG_SOURCE([
  87. m4_default_nblank([$2],[AC_INCLUDES_DEFAULT])
  88. [int main(void)
  89. {
  90. ]$3[
  91. }
  92. ]])])
  93. m4_ifnblank([$7],[dnl
  94. mhd_check_func_SAVE_LIBS="$LIBS"
  95. LIBS="_mhd_norm_expd([$7]) $LIBS"
  96. ])dnl m4_ifnblank
  97. AS_VAR_IF([cross_compiling],["yes"],
  98. [AC_LINK_IFELSE([],[
  99. $4
  100. ],[cacheVar='no'])dnl AC_LINK_IFELSE
  101. ],dnl
  102. [AC_RUN_IFELSE([],[cacheVar='yes'],[cacheVar='no'],[[# Dummy placeholder]])
  103. ])
  104. rm -f conftest.$ac_ext
  105. m4_ifnblank([$7],[dnl
  106. LIBS="${mhd_check_func_SAVE_LIBS}"
  107. AS_UNSET([mhd_check_func_SAVE_LIBS])
  108. ])dnl m4_ifnblank
  109. ])dnl AC_CACHE_CHECK
  110. m4_ifnblank([$5],[
  111. AS_IF([test "x$cacheVar" = "xyes" || test "x$cacheVar" = "xassuming yes"],[$5])dnl AS_IF
  112. ])dnl m4_ifnblank
  113. m4_ifnblank([$6],[
  114. AS_IF([test "x$cacheVar" = "xno" || test "x$cacheVar" = "xassuming no"],[$6])dnl AS_IF
  115. ])dnl m4_ifnblank
  116. m4_newline([[# Expansion of $0 macro ends here]])
  117. ])dnl AC_DEFUN MHD_CHECK_FUNC_RUN