source: trunk/build_support/ax_prefix_config_h.m4 @ 1349

Last change on this file since 1349 was 1319, checked in by Peter, 15 years ago

config.h is no longer installed. Therefore, do not include config.h
into other header files. Instead there is a yat/yat-config.h which
will be installed and can therefore be used in header files. The
yat-config contains the same information as config.h but variables are
prefix'd with a YAT_. I had to change style in version.m4 due to a
variable clash between variables set in version.m4 and variables I
wanted in config.h.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 8.9 KB
Line 
1# ===========================================================================
2#           http://autoconf-archive.cryp.to/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# LAST MODIFICATION
91#
92#   2008-04-12
93#
94# COPYLEFT
95#
96#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
97#   Copyright (c) 2008 Marten Svantesson
98#   Copyright (c) 2008 Gerald Point <Gerald.Point@labri.fr>
99#
100#   This program is free software; you can redistribute it and/or modify it
101#   under the terms of the GNU General Public License as published by the
102#   Free Software Foundation; either version 2 of the License, or (at your
103#   option) any later version.
104#
105#   This program is distributed in the hope that it will be useful, but
106#   WITHOUT ANY WARRANTY; without even the implied warranty of
107#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
108#   Public License for more details.
109#
110#   You should have received a copy of the GNU General Public License along
111#   with this program. If not, see <http://www.gnu.org/licenses/>.
112#
113#   As a special exception, the respective Autoconf Macro's copyright owner
114#   gives unlimited permission to copy, distribute and modify the configure
115#   scripts that are the output of Autoconf when processing the Macro. You
116#   need not follow the terms of the GNU General Public License when using
117#   or distributing such scripts, even though portions of the text of the
118#   Macro appear in them. The GNU General Public License (GPL) does govern
119#   all other use of the material that constitutes the Autoconf Macro.
120#
121#   This special exception to the GPL applies to versions of the Autoconf
122#   Macro released by the Autoconf Macro Archive. When you make and
123#   distribute a modified version of the Autoconf Macro, you may extend this
124#   special exception to the GPL to apply to your modified version as well.
125
126AC_DEFUN([AX_PREFIX_CONFIG_H],[dnl
127AC_BEFORE([AC_CONFIG_HEADERS],[$0])dnl
128AC_CONFIG_COMMANDS([ifelse($1,,$PACKAGE-config.h,$1)],[dnl
129AS_VAR_PUSHDEF([_OUT],[ac_prefix_conf_OUT])dnl
130AS_VAR_PUSHDEF([_DEF],[ac_prefix_conf_DEF])dnl
131AS_VAR_PUSHDEF([_PKG],[ac_prefix_conf_PKG])dnl
132AS_VAR_PUSHDEF([_LOW],[ac_prefix_conf_LOW])dnl
133AS_VAR_PUSHDEF([_UPP],[ac_prefix_conf_UPP])dnl
134AS_VAR_PUSHDEF([_INP],[ac_prefix_conf_INP])dnl
135m4_pushdef([_script],[conftest.prefix])dnl
136m4_pushdef([_symbol],[m4_cr_Letters[]m4_cr_digits[]_])dnl
137_OUT=`echo ifelse($1, , $PACKAGE-config.h, $1)`
138_DEF=`echo _$_OUT | sed -e "y:m4_cr_letters:m4_cr_LETTERS[]:" -e "s/@<:@^m4_cr_Letters@:>@/_/g"`
139_PKG=`echo ifelse($2, , $PACKAGE, $2)`
140_LOW=`echo _$_PKG | sed -e "y:m4_cr_LETTERS-:m4_cr_letters[]_:"`
141_UPP=`echo $_PKG | sed -e "y:m4_cr_letters-:m4_cr_LETTERS[]_:"  -e "/^@<:@m4_cr_digits@:>@/s/^/_/"`
142_INP=`echo "ifelse($3,,,$3)" | sed -e 's/ *//'`
143if test ".$_INP" = "."; then
144   for ac_file in : $CONFIG_HEADERS; do test "_$ac_file" = _: && continue
145     case "$ac_file" in
146        *.h) _INP=$ac_file ;;
147        *)
148     esac
149     test ".$_INP" != "." && break
150   done
151fi
152if test ".$_INP" = "."; then
153   case "$_OUT" in
154      */*) _INP=`basename "$_OUT"`
155      ;;
156      *-*) _INP=`echo "$_OUT" | sed -e "s/@<:@_symbol@:>@*-//"`
157      ;;
158      *) _INP=config.h
159      ;;
160   esac
161fi
162if test -z "$_PKG" ; then
163   AC_MSG_ERROR([no prefix for _PREFIX_PKG_CONFIG_H])
164else
165  if test ! -f "$_INP" ; then if test -f "$srcdir/$_INP" ; then
166     _INP="$srcdir/$_INP"
167  fi fi
168  AC_MSG_NOTICE(creating $_OUT - prefix $_UPP for $_INP defines)
169  if test -f $_INP ; then
170    echo "s/^@%:@undef  *\\(@<:@m4_cr_LETTERS[]_@:>@\\)/@%:@undef $_UPP""_\\1/" > _script
171    echo "s/^@%:@undef  *\\(@<:@m4_cr_letters@:>@\\)/@%:@undef $_LOW""_\\1/" >> _script
172    echo "s/^@%:@def[]ine  *\\(@<:@m4_cr_LETTERS[]_@:>@@<:@_symbol@:>@*\\)\\(.*\\)/@%:@ifndef $_UPP""_\\1 \\" >> _script
173    echo "@%:@def[]ine $_UPP""_\\1 \\2 \\" >> _script
174    echo "@%:@endif/" >>_script
175    echo "s/^@%:@def[]ine  *\\(@<:@m4_cr_letters@:>@@<:@_symbol@:>@*\\)\\(.*\\)/@%:@ifndef $_LOW""_\\1 \\" >> _script
176    echo "@%:@define $_LOW""_\\1 \\2 \\" >> _script
177    echo "@%:@endif/" >> _script
178    # now executing _script on _DEF input to create _OUT output file
179    echo "@%:@ifndef $_DEF"      >$tmp/pconfig.h
180    echo "@%:@def[]ine $_DEF 1" >>$tmp/pconfig.h
181    echo ' ' >>$tmp/pconfig.h
182    echo /'*' $_OUT. Generated automatically at end of configure. '*'/ >>$tmp/pconfig.h
183
184    sed -f _script $_INP >>$tmp/pconfig.h
185    echo ' ' >>$tmp/pconfig.h
186    echo '/* once:' $_DEF '*/' >>$tmp/pconfig.h
187    echo "@%:@endif" >>$tmp/pconfig.h
188    if cmp -s $_OUT $tmp/pconfig.h 2>/dev/null; then
189      AC_MSG_NOTICE([$_OUT is unchanged])
190    else
191      ac_dir=`AS_DIRNAME(["$_OUT"])`
192      AS_MKDIR_P(["$ac_dir"])
193      rm -f "$_OUT"
194      mv $tmp/pconfig.h "$_OUT"
195    fi
196    cp _script _configs.sed
197  else
198    AC_MSG_ERROR([input file $_INP does not exist - skip generating $_OUT])
199  fi
200  rm -f conftest.*
201fi
202m4_popdef([_symbol])dnl
203m4_popdef([_script])dnl
204AS_VAR_POPDEF([_INP])dnl
205AS_VAR_POPDEF([_UPP])dnl
206AS_VAR_POPDEF([_LOW])dnl
207AS_VAR_POPDEF([_PKG])dnl
208AS_VAR_POPDEF([_DEF])dnl
209AS_VAR_POPDEF([_OUT])dnl
210],[PACKAGE="$PACKAGE"])])
211
212dnl implementation note: a bug report (31.5.2005) from Marten Svantesson points
213dnl out a problem where `echo "\1"` results in a Control-A. The unix standard
214dnl    http://www.opengroup.org/onlinepubs/000095399/utilities/echo.html
215dnl defines all backslash-sequences to be inherently non-portable asking
216dnl for replacement mit printf. Some old systems had problems with that
217dnl one either. However, the latest libtool (!) release does export an $ECHO
218dnl (and $echo) that does the right thing - just one question is left: what
219dnl was the first version to have it? Is it greater 2.58 ?
Note: See TracBrowser for help on using the repository browser.