onceonly.m4 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. # onceonly.m4 serial 9
  2. dnl Copyright (C) 2002-2003, 2005-2006, 2008-2017 Free Software Foundation,
  3. dnl Inc.
  4. dnl
  5. dnl This file is free software; you can redistribute it and/or modify
  6. dnl it under the terms of the GNU General Public License as published by
  7. dnl the Free Software Foundation; either version 3 of the License, or
  8. dnl (at your option) any later version.
  9. dnl
  10. dnl This file is distributed in the hope that it will be useful,
  11. dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. dnl GNU General Public License for more details.
  14. dnl
  15. dnl You should have received a copy of the GNU General Public License
  16. dnl along with this file. If not, see <http://www.gnu.org/licenses/>.
  17. dnl
  18. dnl As a special exception to the GNU General Public License,
  19. dnl this file may be distributed as part of a program
  20. dnl that contains a configuration script generated by Autoconf, under
  21. dnl the same distribution terms as the rest of that program.
  22. dnl This file defines some "once only" variants of standard autoconf macros.
  23. dnl AC_CHECK_HEADERS_ONCE like AC_CHECK_HEADERS
  24. dnl AC_CHECK_FUNCS_ONCE like AC_CHECK_FUNCS
  25. dnl AC_CHECK_DECLS_ONCE like AC_CHECK_DECLS
  26. dnl AC_REQUIRE([AC_FUNC_STRCOLL]) like AC_FUNC_STRCOLL
  27. dnl The advantage is that the check for each of the headers/functions/decls
  28. dnl will be put only once into the 'configure' file. It keeps the size of
  29. dnl the 'configure' file down, and avoids redundant output when 'configure'
  30. dnl is run.
  31. dnl The drawback is that the checks cannot be conditionalized. If you write
  32. dnl if some_condition; then gl_CHECK_HEADERS(stdlib.h); fi
  33. dnl inside an AC_DEFUNed function, the gl_CHECK_HEADERS macro call expands to
  34. dnl empty, and the check will be inserted before the body of the AC_DEFUNed
  35. dnl function.
  36. dnl The original code implemented AC_CHECK_HEADERS_ONCE and AC_CHECK_FUNCS_ONCE
  37. dnl in terms of AC_DEFUN and AC_REQUIRE. This implementation uses diversions to
  38. dnl named sections DEFAULTS and INIT_PREPARE in order to check all requested
  39. dnl headers at once, thus reducing the size of 'configure'. It is known to work
  40. dnl with autoconf 2.57..2.62 at least . The size reduction is ca. 9%.
  41. dnl Autoconf version 2.59 plus gnulib is required; this file is not needed
  42. dnl with Autoconf 2.60 or greater. But note that autoconf's implementation of
  43. dnl AC_CHECK_DECLS_ONCE expects a comma-separated list of symbols as first
  44. dnl argument!
  45. AC_PREREQ([2.59])
  46. # AC_CHECK_HEADERS_ONCE(HEADER1 HEADER2 ...) is a once-only variant of
  47. # AC_CHECK_HEADERS(HEADER1 HEADER2 ...).
  48. AC_DEFUN([AC_CHECK_HEADERS_ONCE], [
  49. :
  50. m4_foreach_w([gl_HEADER_NAME], [$1], [
  51. AC_DEFUN([gl_CHECK_HEADER_]m4_quote(m4_translit(gl_HEADER_NAME,
  52. [./-], [___])), [
  53. m4_divert_text([INIT_PREPARE],
  54. [gl_header_list="$gl_header_list gl_HEADER_NAME"])
  55. gl_HEADERS_EXPANSION
  56. AH_TEMPLATE(AS_TR_CPP([HAVE_]m4_defn([gl_HEADER_NAME])),
  57. [Define to 1 if you have the <]m4_defn([gl_HEADER_NAME])[> header file.])
  58. ])
  59. AC_REQUIRE([gl_CHECK_HEADER_]m4_quote(m4_translit(gl_HEADER_NAME,
  60. [./-], [___])))
  61. ])
  62. ])
  63. m4_define([gl_HEADERS_EXPANSION], [
  64. m4_divert_text([DEFAULTS], [gl_header_list=])
  65. AC_CHECK_HEADERS([$gl_header_list])
  66. m4_define([gl_HEADERS_EXPANSION], [])
  67. ])
  68. # AC_CHECK_FUNCS_ONCE(FUNC1 FUNC2 ...) is a once-only variant of
  69. # AC_CHECK_FUNCS(FUNC1 FUNC2 ...).
  70. AC_DEFUN([AC_CHECK_FUNCS_ONCE], [
  71. :
  72. m4_foreach_w([gl_FUNC_NAME], [$1], [
  73. AC_DEFUN([gl_CHECK_FUNC_]m4_defn([gl_FUNC_NAME]), [
  74. m4_divert_text([INIT_PREPARE],
  75. [gl_func_list="$gl_func_list gl_FUNC_NAME"])
  76. gl_FUNCS_EXPANSION
  77. AH_TEMPLATE(AS_TR_CPP([HAVE_]m4_defn([gl_FUNC_NAME])),
  78. [Define to 1 if you have the ']m4_defn([gl_FUNC_NAME])[' function.])
  79. ])
  80. AC_REQUIRE([gl_CHECK_FUNC_]m4_defn([gl_FUNC_NAME]))
  81. ])
  82. ])
  83. m4_define([gl_FUNCS_EXPANSION], [
  84. m4_divert_text([DEFAULTS], [gl_func_list=])
  85. AC_CHECK_FUNCS([$gl_func_list])
  86. m4_define([gl_FUNCS_EXPANSION], [])
  87. ])
  88. # AC_CHECK_DECLS_ONCE(DECL1 DECL2 ...) is a once-only variant of
  89. # AC_CHECK_DECLS(DECL1, DECL2, ...).
  90. AC_DEFUN([AC_CHECK_DECLS_ONCE], [
  91. :
  92. m4_foreach_w([gl_DECL_NAME], [$1], [
  93. AC_DEFUN([gl_CHECK_DECL_]m4_defn([gl_DECL_NAME]), [
  94. AC_CHECK_DECLS(m4_defn([gl_DECL_NAME]))
  95. ])
  96. AC_REQUIRE([gl_CHECK_DECL_]m4_defn([gl_DECL_NAME]))
  97. ])
  98. ])