ax_prefix_config_h.m4 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. # ===========================================================================
  2. # http://www.gnu.org/software/autoconf-archive/ax_prefix_config_h.html
  3. # ===========================================================================
  4. #
  5. # SYNOPSIS
  6. #
  7. # AX_PREFIX_CONFIG_H [(OUTPUT-HEADER [,PREFIX [,ORIG-HEADER]])]
  8. #
  9. # DESCRIPTION
  10. #
  11. # This is a new variant from ac_prefix_config_ this one will use a
  12. # lowercase-prefix if the config-define was starting with a
  13. # lowercase-char, e.g. "#define const", "#define restrict", or "#define
  14. # off_t", (and this one can live in another directory, e.g.
  15. # testpkg/config.h therefore I decided to move the output-header to be the
  16. # first arg)
  17. #
  18. # takes the usual config.h generated header file; looks for each of the
  19. # generated "#define SOMEDEF" lines, and prefixes the defined name (ie.
  20. # makes it "#define PREFIX_SOMEDEF". The result is written to the output
  21. # config.header file. The PREFIX is converted to uppercase for the
  22. # conversions.
  23. #
  24. # Defaults:
  25. #
  26. # OUTPUT-HEADER = $PACKAGE-config.h
  27. # PREFIX = $PACKAGE
  28. # ORIG-HEADER, from AM_CONFIG_HEADER(config.h)
  29. #
  30. # Your configure.ac script should contain both macros in this order, and
  31. # unlike the earlier variations of this prefix-macro it is okay to place
  32. # the AX_PREFIX_CONFIG_H call before the AC_OUTPUT invokation.
  33. #
  34. # Example:
  35. #
  36. # AC_INIT(config.h.in) # config.h.in as created by "autoheader"
  37. # AM_INIT_AUTOMAKE(testpkg, 0.1.1) # makes #undef VERSION and PACKAGE
  38. # AM_CONFIG_HEADER(config.h) # prep config.h from config.h.in
  39. # AX_PREFIX_CONFIG_H(mylib/_config.h) # prep mylib/_config.h from it..
  40. # AC_MEMORY_H # makes "#undef NEED_MEMORY_H"
  41. # AC_C_CONST_H # makes "#undef const"
  42. # AC_OUTPUT(Makefile) # creates the "config.h" now
  43. # # and also mylib/_config.h
  44. #
  45. # if the argument to AX_PREFIX_CONFIG_H would have been omitted then the
  46. # default outputfile would have been called simply "testpkg-config.h", but
  47. # even under the name "mylib/_config.h" it contains prefix-defines like
  48. #
  49. # #ifndef TESTPKG_VERSION
  50. # #define TESTPKG_VERSION "0.1.1"
  51. # #endif
  52. # #ifndef TESTPKG_NEED_MEMORY_H
  53. # #define TESTPKG_NEED_MEMORY_H 1
  54. # #endif
  55. # #ifndef _testpkg_const
  56. # #define _testpkg_const _const
  57. # #endif
  58. #
  59. # and this "mylib/_config.h" can be installed along with other
  60. # header-files, which is most convenient when creating a shared library
  61. # (that has some headers) where some functionality is dependent on the
  62. # OS-features detected at compile-time. No need to invent some
  63. # "mylib-confdefs.h.in" manually. :-)
  64. #
  65. # Note that some AC_DEFINEs that end up in the config.h file are actually
  66. # self-referential - e.g. AC_C_INLINE, AC_C_CONST, and the AC_TYPE_OFF_T
  67. # say that they "will define inline|const|off_t if the system does not do
  68. # it by itself". You might want to clean up about these - consider an
  69. # extra mylib/conf.h that reads something like:
  70. #
  71. # #include <mylib/_config.h>
  72. # #ifndef _testpkg_const
  73. # #define _testpkg_const const
  74. # #endif
  75. #
  76. # and then start using _testpkg_const in the header files. That is also a
  77. # good thing to differentiate whether some library-user has starting to
  78. # take up with a different compiler, so perhaps it could read something
  79. # like this:
  80. #
  81. # #ifdef _MSC_VER
  82. # #include <mylib/_msvc.h>
  83. # #else
  84. # #include <mylib/_config.h>
  85. # #endif
  86. # #ifndef _testpkg_const
  87. # #define _testpkg_const const
  88. # #endif
  89. #
  90. # LICENSE
  91. #
  92. # Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
  93. # Copyright (c) 2008 Marten Svantesson
  94. # Copyright (c) 2008 Gerald Point <Gerald.Point@labri.fr>
  95. #
  96. # This program is free software; you can redistribute it and/or modify it
  97. # under the terms of the GNU General Public License as published by the
  98. # Free Software Foundation; either version 3 of the License, or (at your
  99. # option) any later version.
  100. #
  101. # This program is distributed in the hope that it will be useful, but
  102. # WITHOUT ANY WARRANTY; without even the implied warranty of
  103. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
  104. # Public License for more details.
  105. #
  106. # You should have received a copy of the GNU General Public License along
  107. # with this program. If not, see <http://www.gnu.org/licenses/>.
  108. #
  109. # As a special exception, the respective Autoconf Macro's copyright owner
  110. # gives unlimited permission to copy, distribute and modify the configure
  111. # scripts that are the output of Autoconf when processing the Macro. You
  112. # need not follow the terms of the GNU General Public License when using
  113. # or distributing such scripts, even though portions of the text of the
  114. # Macro appear in them. The GNU General Public License (GPL) does govern
  115. # all other use of the material that constitutes the Autoconf Macro.
  116. #
  117. # This special exception to the GPL applies to versions of the Autoconf
  118. # Macro released by the Autoconf Archive. When you make and distribute a
  119. # modified version of the Autoconf Macro, you may extend this special
  120. # exception to the GPL to apply to your modified version as well.
  121. #serial 13
  122. AC_DEFUN([AX_PREFIX_CONFIG_H],[dnl
  123. AC_PREREQ([2.62])
  124. AC_BEFORE([AC_CONFIG_HEADERS],[$0])dnl
  125. AC_CONFIG_COMMANDS(m4_default([$1], [$PACKAGE-config.h]),[dnl
  126. AS_VAR_PUSHDEF([_OUT],[ac_prefix_conf_OUT])dnl
  127. AS_VAR_PUSHDEF([_DEF],[ac_prefix_conf_DEF])dnl
  128. AS_VAR_PUSHDEF([_PKG],[ac_prefix_conf_PKG])dnl
  129. AS_VAR_PUSHDEF([_LOW],[ac_prefix_conf_LOW])dnl
  130. AS_VAR_PUSHDEF([_UPP],[ac_prefix_conf_UPP])dnl
  131. AS_VAR_PUSHDEF([_INP],[ac_prefix_conf_INP])dnl
  132. m4_pushdef([_script],[conftest.prefix])dnl
  133. m4_pushdef([_symbol],[m4_cr_Letters[]m4_cr_digits[]_])dnl
  134. _OUT=`echo m4_default([$1], [$PACKAGE-config.h])`
  135. _DEF=`echo _$_OUT | sed -e "y:m4_cr_letters:m4_cr_LETTERS[]:" -e "s/@<:@^m4_cr_Letters@:>@/_/g"`
  136. _PKG=`echo m4_default([$2], [$PACKAGE])`
  137. _LOW=`echo _$_PKG | sed -e "y:m4_cr_LETTERS-:m4_cr_letters[]_:"`
  138. _UPP=`echo $_PKG | sed -e "y:m4_cr_letters-:m4_cr_LETTERS[]_:" -e "/^@<:@m4_cr_digits@:>@/s/^/_/"`
  139. _INP=`echo "$3" | sed -e 's/ *//'`
  140. if test ".$_INP" = "."; then
  141. for ac_file in : $CONFIG_HEADERS; do test "_$ac_file" = _: && continue
  142. case "$ac_file" in
  143. *.h) _INP=$ac_file ;;
  144. *)
  145. esac
  146. test ".$_INP" != "." && break
  147. done
  148. fi
  149. if test ".$_INP" = "."; then
  150. case "$_OUT" in
  151. */*) _INP=`basename "$_OUT"`
  152. ;;
  153. *-*) _INP=`echo "$_OUT" | sed -e "s/@<:@_symbol@:>@*-//"`
  154. ;;
  155. *) _INP=config.h
  156. ;;
  157. esac
  158. fi
  159. if test -z "$_PKG" ; then
  160. AC_MSG_ERROR([no prefix for _PREFIX_PKG_CONFIG_H])
  161. else
  162. if test ! -f "$_INP" ; then if test -f "$srcdir/$_INP" ; then
  163. _INP="$srcdir/$_INP"
  164. fi fi
  165. AC_MSG_NOTICE(creating $_OUT - prefix $_UPP for $_INP defines)
  166. if test -f $_INP ; then
  167. AS_ECHO(["s/^@%:@undef *\\(@<:@m4_cr_LETTERS[]_@:>@\\)/@%:@undef $_UPP""_\\1/"]) > _script
  168. AS_ECHO(["s/^@%:@undef *\\(@<:@m4_cr_letters@:>@\\)/@%:@undef $_LOW""_\\1/"]) >> _script
  169. AS_ECHO(["s/^@%:@def[]ine *\\(@<:@m4_cr_LETTERS[]_@:>@@<:@_symbol@:>@*\\)\\(.*\\)/@%:@ifndef $_UPP""_\\1\\"]) >> _script
  170. AS_ECHO(["@%:@def[]ine $_UPP""_\\1\\2\\"]) >> _script
  171. AS_ECHO(["@%:@endif/"]) >> _script
  172. AS_ECHO(["s/^@%:@def[]ine *\\(@<:@m4_cr_letters@:>@@<:@_symbol@:>@*\\)\\(.*\\)/@%:@ifndef $_LOW""_\\1\\"]) >> _script
  173. AS_ECHO(["@%:@define $_LOW""_\\1\\2\\"]) >> _script
  174. AS_ECHO(["@%:@endif/"]) >> _script
  175. # now executing _script on _DEF input to create _OUT output file
  176. echo "@%:@ifndef $_DEF" >$tmp/pconfig.h
  177. echo "@%:@def[]ine $_DEF 1" >>$tmp/pconfig.h
  178. echo ' ' >>$tmp/pconfig.h
  179. echo /'*' $_OUT. Generated automatically at end of configure. '*'/ >>$tmp/pconfig.h
  180. sed -f _script $_INP >>$tmp/pconfig.h
  181. echo ' ' >>$tmp/pconfig.h
  182. echo '/* once:' $_DEF '*/' >>$tmp/pconfig.h
  183. echo "@%:@endif" >>$tmp/pconfig.h
  184. if cmp -s $_OUT $tmp/pconfig.h 2>/dev/null; then
  185. AC_MSG_NOTICE([$_OUT is unchanged])
  186. else
  187. ac_dir=`AS_DIRNAME(["$_OUT"])`
  188. AS_MKDIR_P(["$ac_dir"])
  189. rm -f "$_OUT"
  190. mv $tmp/pconfig.h "$_OUT"
  191. fi
  192. else
  193. AC_MSG_ERROR([input file $_INP does not exist - skip generating $_OUT])
  194. fi
  195. rm -f conftest.*
  196. fi
  197. m4_popdef([_symbol])dnl
  198. m4_popdef([_script])dnl
  199. AS_VAR_POPDEF([_INP])dnl
  200. AS_VAR_POPDEF([_UPP])dnl
  201. AS_VAR_POPDEF([_LOW])dnl
  202. AS_VAR_POPDEF([_PKG])dnl
  203. AS_VAR_POPDEF([_DEF])dnl
  204. AS_VAR_POPDEF([_OUT])dnl
  205. ],[PACKAGE="$PACKAGE"])])