Make AC_FOREACH be robust to active symbols.
* acgeneral.m4 (m4_split, m4_join, m4_strip): New macros.
(AC_FOREACH_COMMA): Renamed as...
(m4_foreach): this.
(_AC_CAR): Renamed as...
(_m4_car): this.
(_AC_FOREACH): Renamed as...
(_m4_foreach): this.
(_AC_COMMATIZE): Removed.
(AC_FOREACH): Rewritten using m4_split, m4_join, m4_strip, and
m4_foreach.
* acgeneral.m4: Spell checked.
* autoconf.texi: Likewise.
+1999-09-28 Akim Demaille <akim@epita.fr>
+
+ Make AC_FOREACH be robust to active symbols.
+
+ * acgeneral.m4 (m4_split, m4_join, m4_strip): New macros.
+ (AC_FOREACH_COMMA): Renamed as...
+ (m4_foreach): this.
+ (_AC_CAR): Renamed as...
+ (_m4_car): this.
+ (_AC_FOREACH): Renamed as...
+ (_m4_foreach): this.
+ (_AC_COMMATIZE): Removed.
+ (AC_FOREACH): Rewritten using m4_split, m4_join, m4_strip, and
+ m4_foreach.
+ * acgeneral.m4: Spell checked.
+ * autoconf.texi: Likewise.
+
1999-09-28 Akim Demaille <akim@epita.fr>
* acgeneral.m4 (AC_NEED_DECL): When $4 is given, don't provide
dnl m4_default(EXP1, EXP2)
dnl ----------------------
-dnl Returns EXP1 if non empty, otherwisee EXP2.
+dnl Returns EXP1 if non empty, otherwise EXP2.
define([m4_default], [ifset([$1], [$1], [$2])])
+dnl m4_split(STRING)
+dnl ----------------
+dnl Split STRING into an m4 list of quoted elements. The elements are
+dnl quoted with [ and ]. Beginning spaces and end spaces *are kept*.
+dnl Use m4_strip to remove them.
+dnl
+dnl Pay attention to the changequotes. Inner changequotes exist for
+dnl obvious reasons (we want to insert square brackets). Outer
+dnl changequotes are needed because otherwise the m4 parser, when it
+dnl sees the closing bracket we add to the result, believes it is the
+dnl end of the body of the macro we define.
+dnl
+dnl Also, notice that $1 is quoted twice, since we want the result to be
+dnl quoted. Then you should understand that the argument of patsubst is
+dnl ``STRING'' (i.e., with additional `` and '').
+dnl
+dnl This macro is safe on active symbols, i.e.:
+dnl define(active, ACTIVE)
+dnl m4_split([active active ])end
+dnl => [active], [active], []end
+changequote(<<, >>)
+define(<<m4_split>>,
+<<changequote(``, '')dnl
+[patsubst(````$1'''', ``[ ]+'', ``], ['')]dnl
+changequote([, ])>>)
+changequote([, ])
+
+
+dnl m4_join(STRING)
+dnl ---------------
+dnl If STRING contains end of lines, replace them with spaces. If there
+dnl are backslashed end of lines, remove them. This macro is safe with
+dnl active symbols.
+dnl define(active, ACTIVE)
+dnl m4_join([active
+dnl act\
+dnl ive])end
+dnl => active activeend
+define([m4_join],
+[translit(patsubst([[[$1]]], [\\
+]), [
+], [ ])])
+
+
+dnl m4_strip(STRING)
+dnl ----------------
+dnl Expands into STRING with tabs and spaces singled out into a single
+dnl space, and removing leading and trailing spaces.
+dnl
+dnl This macro is robust to active symbols.
+dnl define(active, ACTIVE)
+dnl m4_strip([ active active ])end
+dnl => active activeend
+dnl
+dnl This macro is fun! Because we want to preserve active symbols, STRING
+dnl must be quoted for each evaluation, which explains there are 4 levels
+dnl of brackets around $1 (don't forget that the result must be quoted
+dnl too, hence one more quoting than applications).
+dnl
+dnl Then notice the patsubst of the middle: it is in charge of removing
+dnl the leading space. Why not just `patsubst(..., [^ ])'? Because this
+dnl macro will receive the output of the preceding patsubst, i.e. more or
+dnl less [[STRING]]. So if there is a leading space in STRING, then it is
+dnl the *third* character, since there are two leading `['; Equally for
+dnl the outer patsubst.
+define([m4_strip],
+[patsubst(patsubst(patsubst([[[[$1]]]],
+ [[ ]+], [ ]),
+ [^\(..\) ], [\1]),
+ [ \(.\)$], [\1])])
+
+
+dnl ### Implementing m4 loops
+
+
+dnl Implementing loops (`foreach' loops) in m4 is much more tricky than it
+dnl may seem. Actually, the example of a `foreach' loop in the m4
+dnl documentation is wrong: it does not quote the arguments properly,
+dnl which leads to undesired expansions.
+dnl
+dnl The example in the documentation is:
+dnl
+dnl | # foreach(x, (item_1, item_2, ..., item_n), stmt)
+dnl | define(`foreach',
+dnl | `pushdef(`$1', `')_foreach(`$1', `$2', `$3')popdef(`$1')')
+dnl | define(`_arg1', `$1')
+dnl | define(`_foreach',
+dnl | `ifelse(`$2', `()', ,
+dnl | `define(`$1', _arg1$2)$3`'_foreach(`$1', (shift$2), `$3')')')
+dnl
+dnl But then if you run
+dnl
+dnl | define(a, 1)
+dnl | define(b, 2)
+dnl | define(c, 3)
+dnl | foreach(`f', `(`a', `(b', `c)')', `echo f
+dnl | ')
+dnl
+dnl it gives
+dnl
+dnl => echo 1
+dnl => echo (2,3)
+dnl
+dnl which is not what is expected.
+dnl
+dnl Once you understood this, you turn yourself into a quoting wizard,
+dnl and come up with the following solution:
+dnl
+dnl | # foreach(x, (item_1, item_2, ..., item_n), stmt)
+dnl | define(`foreach', `pushdef(`$1', `')_foreach($@)popdef(`$1')')
+dnl | define(`_arg1', ``$1'')
+dnl | define(`_foreach',
+dnl | `ifelse($2, `()', ,
+dnl | `define(`$1', `_arg1$2')$3`'_foreach(`$1', `(shift$2)', `$3')')')
+dnl
+dnl which this time answers
+dnl
+dnl => echo a
+dnl => echo (b
+dnl => echo c)
+dnl
+dnl Bingo!
+
+dnl M4_FOREACH(VARIABLE, LIST, EXPRESSION)
+dnl --------------------------------------
+dnl Expand EXPRESSION assigning to VARIABLE each value of the LIST
+dnl (LIST should have the form `[(item_1, item_2, ..., item_n)]'),
+dnl i.e. the whole list should be *quoted*. Quote members too if
+dnl you don't want them to be expanded.
+dnl
+dnl This macro is robust to active symbols:
+dnl define(active, ACTIVE)
+dnl m4_foreach([Var], [([active], [b], [active])], [-Var-])end
+dnl => -active--b--active-end
+define(m4_foreach,
+[pushdef([$1], [])_m4_foreach($@)popdef([$1])])
+
+dnl Low level macros used to define m4_foreach
+define(_m4_car, [[$1]])
+define(_m4_foreach,
+[ifelse($2, [()], ,
+ [define([$1], [_m4_car$2])$3[]_m4_foreach([$1],
+ [(m4_shift$2)],
+ [$3])])])
+
+
dnl ### Defining macros
dnl | else
dnl | IF-FALSE
dnl | fi
-dnl | with simplifications is IF-TRUE and/or IF-FALSE is empty.
+dnl with simplifications is IF-TRUE and/or IF-FALSE is empty.
define([AC_SHELL_IFELSE],
[ifset([$2$3],
[if [$1]; then
dnl from `a' to `\0' never ends...
dnl
dnl Include a protection against `%' (used as a sed separator) in FROM and TO.
-dnl Forbid appearence of `-' in FROM elsewhere than in the last position,
+dnl Forbid appearance of `-' in FROM elsewhere than in the last position,
dnl since we might otherwise trigger a GNU m4 bug (version 1.4 included).
dnl ALPHABET may contain characters interval.
dnl define(AC_TR,
dnl ### Implementing m4 loops
-
-dnl Implementing loops (`foreach' loops) in m4 is much more tricky than it
-dnl may seem. Actually, the example of a `foreach' loop in the m4
-dnl documentation is wrong: it does not quote the arguments properly,
-dnl which leads to undesired expansions.
-dnl
-dnl The example in the documentation is:
-dnl
-dnl | # foreach(x, (item_1, item_2, ..., item_n), stmt)
-dnl | define(`foreach',
-dnl | `pushdef(`$1', `')_foreach(`$1', `$2', `$3')popdef(`$1')')
-dnl | define(`_arg1', `$1')
-dnl | define(`_foreach',
-dnl | `ifelse(`$2', `()', ,
-dnl | `define(`$1', _arg1$2)$3`'_foreach(`$1', (shift$2), `$3')')')
-dnl
-dnl But then if you run
-dnl
-dnl | define(a, 1)
-dnl | define(b, 2)
-dnl | define(c, 3)
-dnl | foreach(`f', `(`a', `(b', `c)')', `echo f
-dnl | ')
-dnl
-dnl it gives
-dnl
-dnl | echo 1
-dnl | echo (2,3)
-dnl
-dnl which is not what is expected.
-dnl
-dnl Once you understood this, you turn yourself into a quoting wizard,
-dnl and come up with the following solution:
-dnl
-dnl | # foreach(x, (item_1, item_2, ..., item_n), stmt)
-dnl | define(`foreach', `pushdef(`$1', `')_foreach($@)popdef(`$1')')
-dnl | define(`_arg1', ``$1'')
-dnl | define(`_foreach',
-dnl | `ifelse($2, `()', ,
-dnl | `define(`$1', `_arg1$2')$3`'_foreach(`$1', `(shift$2)', `$3')')')
-dnl
-dnl which this time answers
-dnl
-dnl | echo a
-dnl | echo (b
-dnl | echo c)
-dnl
-dnl Bingo!
-
-dnl AC_FOREACH_COMMA(VARIABLE, LIST, EXPRESSION)
-dnl --------------------------------------------
-dnl Expand EXPRESSION assigning to VARIABLE each value of the LIST
-dnl (LIST should have the form `[(item_1, item_2, ..., item_n)]'),
-dnl i.e. the whole list should be *quoted*. Quote members too if
-dnl you don't want them to be expanded.
-define(AC_FOREACH_COMMA,
-[pushdef([$1], [])_AC_FOREACH($@)popdef([$1])])
-
-dnl Low level macros used to define AC_FOREACH_COMMA.
-define(_AC_CAR, [[$1]])
-define(_AC_FOREACH,
-[ifelse($2, [()], ,
- [define([$1], [_AC_CAR$2])$3[]_AC_FOREACH([$1],
- [(m4_shift$2)],
- [$3])])])
-
-dnl _AC_COMMATIZE(LIST)
-dnl -------------------
-
-dnl Transform a shell LIST (i.e., white space separated) into a m4 list
-dnl (i.e., separated with commas). This is used to implement AC_FOREACH
-dnl with AC_FOREACH_COMMA.
-dnl
-dnl It quite tricky for several reasons:
-dnl - if there are quoted active symbols in input, on the output they
-dnl should still be quoted. I didn't manage to reach this goal yet,
-dnl but it doesn't seem to be such a necessity. FIXME: do it.
-dnl - if there are parentheses in the input, make sure *not* to think
-dnl this is an m4 list. This is especially important for
-dnl AC_HELP_STRING.
-dnl
-dnl This means that `_AC_COMMATIZE([a] [(b] [c)])' should expand into
-dnl `[a], [(b], [c)]'. Currently parentheses are correctly handled, but
-dnl the macro are expanded, i.e., the output is `[1],[(2],[3)]'.
-dnl
-dnl Do not use `patsubst([$2], [\>\W+\<], [,])', since it swallows
-dnl the `$' from the variable names, so, 1. swallow `\[CR]' (I don't
-dnl understand why I need two backslashes), 2. remove trailing spaces, 3.
-dnl replace remaining sequences of spaces with commas.
-dnl
-dnl Pay attention to the changequotes. Inner changequotes exist for
-dnl obvious reasons (we want to insert square brackets). Outer
-dnl changequotes are needed because otherwise the m4 parser, when it
-dnl sees the closing bracket we add to the result, believes it is the
-dnl end of the body of the macro we define.
-changequote(<<, >>)
-define(<<_AC_COMMATIZE>>,
-<<changequote(``, '')dnl
-pushdef(``one_line'', translit(patsubst(``$1'', ``\\
-''), ``
-'', `` ''))dnl
-pushdef(``no_trailing_space'', patsubst(one_line, ``[ ]+$''))dnl
-[patsubst(no_trailing_space, ``[ ]+'', ``],['')]dnl
-changequote([, ])dnl
-popdef(``no_trailing_space'')dnl
-popdef(``one_line'')>>)
-changequote([, ])
-
dnl AC_FOREACH(VARIABLE, LIST, EXPRESSION)
dnl --------------------------------------
dnl
dnl Compute EXPRESSION assigning to VARIABLE each value of the LIST.
-dnl (LIST has the form `item_1 item_2 ... item_n': there are no commas.)
-dnl
+dnl LIST is a /bin/sh list, i.e., it has the form ` item_1 item_2
+dnl ... item_n ': white spaces are separators, and leading and trailing
+dnl spaces are meaningless.
+dnl
+dnl This macro is robust to active symbols:
+dnl AC_FOREACH([Var], [ active
+dnl b act\
+dnl ive ], [-Var-])end
+dnl => -active--b--active-end
define([AC_FOREACH],
-[AC_FOREACH_COMMA([$1], (_AC_COMMATIZE([$2])), [$3])])
+[m4_foreach([$1], (m4_split(m4_strip(m4_join([$2])))), [$3])])
dnl AC_SPECIALIZE(MACRO, ARG1 [, ARGS...])
dnl Typical outputs are:
dnl
dnl AC_WRAP([Short string */], [ ], [/* ], 20)
-dnl | /* Short string */
+dnl => /* Short string */
dnl
dnl AC_WRAP([Much longer string */], [ ], [/* ], 20)
-dnl | /* Much longer
-dnl | string */
+dnl => /* Much longer
+dnl => string */
dnl
dnl AC_WRAP([Short doc.], [ ], [ --short ], 30)
-dnl | --short Short doc.
+dnl => --short Short doc.
dnl
dnl AC_WRAP([Short doc.], [ ], [ --too-wide ], 30)
-dnl | --too-wide
-dnl | Short doc.
+dnl => --too-wide
+dnl => Short doc.
dnl
dnl AC_WRAP([Super long documentation.], [ ], [ --too-wide ], 30)
-dnl | --too-wide
-dnl | Super long
-dnl | documentation.
+dnl => --too-wide
+dnl => Super long
+dnl => documentation.
dnl
-dnl dnl FIXME: there is no checking of a longer PREFIX than WIDTH, but do
-dnl dnl we really want to bother with people trying each single corner
-dnl dnl of a software?
+dnl FIXME: there is no checking of a longer PREFIX than WIDTH, but do
+dnl we really want to bother with people trying each single corner
+dnl of a software?
define([AC_WRAP],
[pushdef([AC_Prefix], m4_default([$2], []))dnl
pushdef([AC_Prefix1], m4_default([$3], [AC_Prefix]))dnl
dnl Format an Autoconf macro's help string so that it looks pretty when
dnl the user executes "configure --help". This macro takes three
dnl arguments, a "left hand side" (LHS), a "right hand side" (RHS), and
-dnl the COLUMN which is a string of wide spaces which leads to the
+dnl the COLUMN which is a string of white spaces which leads to the
dnl the RHS column (default: 26 white spaces).
dnl
dnl The resulting string is suitable for use in other macros that require
dnl AC_INIT_NOTICE()
AC_DEFUN(AC_INIT_NOTICE,
[# Guess values for system-dependent variables and create Makefiles.
-# Generated automatically using autoconf version] AC_ACVERSION [
+# Generated automatically using Autoconf version] AC_ACVERSION [
# Copyright (C) 1992, 93, 94, 95, 96, 98, 1999 Free Software Foundation, Inc.
#
# This configure script is free software; the Free Software Foundation
dnl AC_INIT_PREPARE(UNIQUE-FILE-IN-SOURCE-DIR)
dnl ------------------------------------------
-dnl Called by AC_INIT to buid the preamble of the `configure' scripts.
+dnl Called by AC_INIT to build the preamble of the `configure' scripts.
dnl 1. Trap and clean up various tmp files.
dnl 2. Set up the fd and output files
dnl 3. Remember the options given to `configure' for `config.status --recheck'.
" 1>&AC_FD_CC
# Strip out --no-create and --no-recursion so they do not pile up.
-# Also quote any args containing shell metacharacters.
+# Also quote any args containing shell meta-characters.
ac_configure_args=
for ac_arg
do
dnl AC_CHECK_TYPE(TYPE, DEFAULT[, INCLUDES])
dnl ----------------------------------------
-dnl FIXME: This is an extremely badly choosen name, since this
+dnl FIXME: This is an extremely badly chosen name, since this
dnl macro actually performs an AC_REPLACE_TYPE. Some day we
dnl have to clean this up.
AC_DEFUN(AC_CHECK_TYPE,
# include <stdlib.h>
# include <stddef.h>
#endif
-[$3]
+$3
], AC_VAR_SET(ac_Type, yes), AC_VAR_SET(ac_Type, no))])
AC_SHELL_IFELSE(test AC_VAR_GET(ac_Type) = yes,,
[AC_DEFINE_UNQUOTED($1, $2)])dnl
# configure, is in ./config.log if it exists.
ac_cs_usage="\\
-\\\`$CONFIG_STATUS' instanciates files from templates according to the
+\\\`$CONFIG_STATUS' instantiates files from templates according to the
current configuration.
Usage: $CONFIG_STATUS @BKL@OPTIONS@BKR@ FILE...
--version Print the version of Autoconf and exit
--help Display this help and exit
-dnl Output this only if there are files to instanciate.
+dnl Output this only if there are files to instantiate.
ifset(ifdef([AC_LIST_HEADER], 1)$1,
-[Files to instanciate:
+[Files to instantiate:
ifset($1, [ Configuration files:
AC_WRAP($1, [ ])
])dnl
dnl Using a here document instead of a string reduces the quoting nightmare.
dnl Putting comments in sed scripts is not portable.
dnl One may be tempted to use the same trick to speed up the sed script
-dnl as for CONFIG_FILES (combinasion of :t and t t). Here we cannot,
+dnl as for CONFIG_FILES (combination of :t and t t). Here we cannot,
dnl because of the `#define' templates: we may enter in infinite loops
dnl replacing `#define foo bar' by itself.
dnl We ought to get rid of the #define templates.
changequote([, ])dnl
EOF
+# Break up conftest.vals because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
rm -f conftest.tail
while :
do
Structures
-* Particular Structures:: Macros to check for certain stucture members
+* Particular Structures:: Macros to check for certain structure members
* Generic Structures:: How to find other structure members
Typedefs
@maindex PROG_LN_S
@ovindex LN_S
If @samp{ln -s} works on the current filesystem (the operating system
-and filesystem support symbolic links), set output
-variable @code{LN_S} to @samp{ln -s}, otherwise set it to @samp{ln}.
+and filesystem support symbolic links), set output variable @code{LN_S}
+to @samp{ln -s}, otherwise set it to @samp{ln}.
If the link is put in a directory other than the current directory, its
meaning depends on whether @samp{ln} or @samp{ln -s} is used. To safely
@code{AC_TRY_COMPILE} (@pxref{Examining Syntax}).
@menu
-* Particular Structures:: Macros to check for certain stucture members
+* Particular Structures:: Macros to check for certain structure members
* Generic Structures:: How to find other structure members
@end menu
The value of @var{type} may be the name of any legitimate C data type
including the keywords @code{struct} and @code{union}. @var{includes} is
any @code{#include} statements needed to obtain the definition of the
-aggregate type. If @var{member} is present, set @var{variable} to @samp{yes},
-otherwise @samp{no}. An example:
+aggregate type. If @var{member} is present, set @var{variable} to
+@samp{yes}, otherwise @samp{no}. An example:
@example
-AC_C_STRUCT_MEMBER(gecos,
- [#include <pwd.h>], [struct passwd], gecos)
+AC_C_STRUCT_MEMBER(pw_gecos,
+ [#include <pwd.h>], [struct passwd], pw_gecos)
@end example
@end defmac
The following macros check for Fortran 77 compiler characteristics. To
check for characteristics not listed here, use @code{AC_TRY_COMPILE}
(@pxref{Examining Syntax}) or @code{AC_TRY_RUN} (@pxref{Run Time}),
-making sure to first set the current lanuage to Fortran 77
+making sure to first set the current language to Fortran 77
@code{AC_LANG_FORTRAN77} (@pxref{Language Choice}).
@defmac AC_F77_LIBRARY_LDFLAGS
@maindex CANONICAL_HOST
Perform only the subset of @code{AC_CANONICAL_SYSTEM} relevant to the
host type. This is all that is needed for programs that are not part of
-a compiler toolchain.
+a compiler tool chain.
@end defmac
@defmac AC_VALIDATE_CACHED_SYSTEM_TUPLE (@var{cmd})
@chapter Recreating a Configuration
The @code{configure} script creates a file named @file{config.status},
-which actually configures, @dfn{intanciates}, the template files. It
+which actually configures, @dfn{instantiates}, the template files. It
also keeps the configuration options that were specified when the
package was last configured in case reconfiguring is needed.
@end example
In the first form, it configures the @var{files}, if none are specified,
-all the templates are instanciated. The files may be specified with or
+all the templates are instantiated. The files may be specified with or
without their dependencies, i.e., if the files @file{foo.in} and
@file{bar.in} are precursors of @file{foobar}, the two following lines
are equivalent:
./config.status foobar:foo.in:bar.in
@end example
-In the second form, no file is instanciated, but a specific action is
+In the second form, no file is instantiated, but a specific action is
taken:
@table @code
@item --recheck
@tex
Fran\c cois
@end tex
-Pinard, I made the macros not interrupt each others' messages.
-(That feature revealed some performance bottlenecks in GNU @code{m4},
-which he hastily corrected!)
-I reorganized the documentation around problems people want to solve.
-And I began a testsuite, because experience
-had shown that Autoconf has a pronounced tendency to regress when we
-change it.
+Pinard, I made the macros not interrupt each others' messages. (That
+feature revealed some performance bottlenecks in GNU @code{m4}, which he
+hastily corrected!) I reorganized the documentation around problems
+people want to solve. And I began a testsuite, because experience had
+shown that Autoconf has a pronounced tendency to regress when we change
+it.
Again, several alpha testers gave invaluable feedback, especially
@ifinfo
Structures
-* Particular Structures:: Macros to check for certain stucture members
+* Particular Structures:: Macros to check for certain structure members
* Generic Structures:: How to find other structure members
Typedefs
@maindex PROG_LN_S
@ovindex LN_S
If @samp{ln -s} works on the current filesystem (the operating system
-and filesystem support symbolic links), set output
-variable @code{LN_S} to @samp{ln -s}, otherwise set it to @samp{ln}.
+and filesystem support symbolic links), set output variable @code{LN_S}
+to @samp{ln -s}, otherwise set it to @samp{ln}.
If the link is put in a directory other than the current directory, its
meaning depends on whether @samp{ln} or @samp{ln -s} is used. To safely
@code{AC_TRY_COMPILE} (@pxref{Examining Syntax}).
@menu
-* Particular Structures:: Macros to check for certain stucture members
+* Particular Structures:: Macros to check for certain structure members
* Generic Structures:: How to find other structure members
@end menu
The value of @var{type} may be the name of any legitimate C data type
including the keywords @code{struct} and @code{union}. @var{includes} is
any @code{#include} statements needed to obtain the definition of the
-aggregate type. If @var{member} is present, set @var{variable} to @samp{yes},
-otherwise @samp{no}. An example:
+aggregate type. If @var{member} is present, set @var{variable} to
+@samp{yes}, otherwise @samp{no}. An example:
@example
-AC_C_STRUCT_MEMBER(gecos,
- [#include <pwd.h>], [struct passwd], gecos)
+AC_C_STRUCT_MEMBER(pw_gecos,
+ [#include <pwd.h>], [struct passwd], pw_gecos)
@end example
@end defmac
The following macros check for Fortran 77 compiler characteristics. To
check for characteristics not listed here, use @code{AC_TRY_COMPILE}
(@pxref{Examining Syntax}) or @code{AC_TRY_RUN} (@pxref{Run Time}),
-making sure to first set the current lanuage to Fortran 77
+making sure to first set the current language to Fortran 77
@code{AC_LANG_FORTRAN77} (@pxref{Language Choice}).
@defmac AC_F77_LIBRARY_LDFLAGS
@maindex CANONICAL_HOST
Perform only the subset of @code{AC_CANONICAL_SYSTEM} relevant to the
host type. This is all that is needed for programs that are not part of
-a compiler toolchain.
+a compiler tool chain.
@end defmac
@defmac AC_VALIDATE_CACHED_SYSTEM_TUPLE (@var{cmd})
@chapter Recreating a Configuration
The @code{configure} script creates a file named @file{config.status},
-which actually configures, @dfn{intanciates}, the template files. It
+which actually configures, @dfn{instantiates}, the template files. It
also keeps the configuration options that were specified when the
package was last configured in case reconfiguring is needed.
@end example
In the first form, it configures the @var{files}, if none are specified,
-all the templates are instanciated. The files may be specified with or
+all the templates are instantiated. The files may be specified with or
without their dependencies, i.e., if the files @file{foo.in} and
@file{bar.in} are precursors of @file{foobar}, the two following lines
are equivalent:
./config.status foobar:foo.in:bar.in
@end example
-In the second form, no file is instanciated, but a specific action is
+In the second form, no file is instantiated, but a specific action is
taken:
@table @code
@item --recheck
@tex
Fran\c cois
@end tex
-Pinard, I made the macros not interrupt each others' messages.
-(That feature revealed some performance bottlenecks in GNU @code{m4},
-which he hastily corrected!)
-I reorganized the documentation around problems people want to solve.
-And I began a testsuite, because experience
-had shown that Autoconf has a pronounced tendency to regress when we
-change it.
+Pinard, I made the macros not interrupt each others' messages. (That
+feature revealed some performance bottlenecks in GNU @code{m4}, which he
+hastily corrected!) I reorganized the documentation around problems
+people want to solve. And I began a testsuite, because experience had
+shown that Autoconf has a pronounced tendency to regress when we change
+it.
Again, several alpha testers gave invaluable feedback, especially
@ifinfo
dnl m4_default(EXP1, EXP2)
dnl ----------------------
-dnl Returns EXP1 if non empty, otherwisee EXP2.
+dnl Returns EXP1 if non empty, otherwise EXP2.
define([m4_default], [ifset([$1], [$1], [$2])])
+dnl m4_split(STRING)
+dnl ----------------
+dnl Split STRING into an m4 list of quoted elements. The elements are
+dnl quoted with [ and ]. Beginning spaces and end spaces *are kept*.
+dnl Use m4_strip to remove them.
+dnl
+dnl Pay attention to the changequotes. Inner changequotes exist for
+dnl obvious reasons (we want to insert square brackets). Outer
+dnl changequotes are needed because otherwise the m4 parser, when it
+dnl sees the closing bracket we add to the result, believes it is the
+dnl end of the body of the macro we define.
+dnl
+dnl Also, notice that $1 is quoted twice, since we want the result to be
+dnl quoted. Then you should understand that the argument of patsubst is
+dnl ``STRING'' (i.e., with additional `` and '').
+dnl
+dnl This macro is safe on active symbols, i.e.:
+dnl define(active, ACTIVE)
+dnl m4_split([active active ])end
+dnl => [active], [active], []end
+changequote(<<, >>)
+define(<<m4_split>>,
+<<changequote(``, '')dnl
+[patsubst(````$1'''', ``[ ]+'', ``], ['')]dnl
+changequote([, ])>>)
+changequote([, ])
+
+
+dnl m4_join(STRING)
+dnl ---------------
+dnl If STRING contains end of lines, replace them with spaces. If there
+dnl are backslashed end of lines, remove them. This macro is safe with
+dnl active symbols.
+dnl define(active, ACTIVE)
+dnl m4_join([active
+dnl act\
+dnl ive])end
+dnl => active activeend
+define([m4_join],
+[translit(patsubst([[[$1]]], [\\
+]), [
+], [ ])])
+
+
+dnl m4_strip(STRING)
+dnl ----------------
+dnl Expands into STRING with tabs and spaces singled out into a single
+dnl space, and removing leading and trailing spaces.
+dnl
+dnl This macro is robust to active symbols.
+dnl define(active, ACTIVE)
+dnl m4_strip([ active active ])end
+dnl => active activeend
+dnl
+dnl This macro is fun! Because we want to preserve active symbols, STRING
+dnl must be quoted for each evaluation, which explains there are 4 levels
+dnl of brackets around $1 (don't forget that the result must be quoted
+dnl too, hence one more quoting than applications).
+dnl
+dnl Then notice the patsubst of the middle: it is in charge of removing
+dnl the leading space. Why not just `patsubst(..., [^ ])'? Because this
+dnl macro will receive the output of the preceding patsubst, i.e. more or
+dnl less [[STRING]]. So if there is a leading space in STRING, then it is
+dnl the *third* character, since there are two leading `['; Equally for
+dnl the outer patsubst.
+define([m4_strip],
+[patsubst(patsubst(patsubst([[[[$1]]]],
+ [[ ]+], [ ]),
+ [^\(..\) ], [\1]),
+ [ \(.\)$], [\1])])
+
+
+dnl ### Implementing m4 loops
+
+
+dnl Implementing loops (`foreach' loops) in m4 is much more tricky than it
+dnl may seem. Actually, the example of a `foreach' loop in the m4
+dnl documentation is wrong: it does not quote the arguments properly,
+dnl which leads to undesired expansions.
+dnl
+dnl The example in the documentation is:
+dnl
+dnl | # foreach(x, (item_1, item_2, ..., item_n), stmt)
+dnl | define(`foreach',
+dnl | `pushdef(`$1', `')_foreach(`$1', `$2', `$3')popdef(`$1')')
+dnl | define(`_arg1', `$1')
+dnl | define(`_foreach',
+dnl | `ifelse(`$2', `()', ,
+dnl | `define(`$1', _arg1$2)$3`'_foreach(`$1', (shift$2), `$3')')')
+dnl
+dnl But then if you run
+dnl
+dnl | define(a, 1)
+dnl | define(b, 2)
+dnl | define(c, 3)
+dnl | foreach(`f', `(`a', `(b', `c)')', `echo f
+dnl | ')
+dnl
+dnl it gives
+dnl
+dnl => echo 1
+dnl => echo (2,3)
+dnl
+dnl which is not what is expected.
+dnl
+dnl Once you understood this, you turn yourself into a quoting wizard,
+dnl and come up with the following solution:
+dnl
+dnl | # foreach(x, (item_1, item_2, ..., item_n), stmt)
+dnl | define(`foreach', `pushdef(`$1', `')_foreach($@)popdef(`$1')')
+dnl | define(`_arg1', ``$1'')
+dnl | define(`_foreach',
+dnl | `ifelse($2, `()', ,
+dnl | `define(`$1', `_arg1$2')$3`'_foreach(`$1', `(shift$2)', `$3')')')
+dnl
+dnl which this time answers
+dnl
+dnl => echo a
+dnl => echo (b
+dnl => echo c)
+dnl
+dnl Bingo!
+
+dnl M4_FOREACH(VARIABLE, LIST, EXPRESSION)
+dnl --------------------------------------
+dnl Expand EXPRESSION assigning to VARIABLE each value of the LIST
+dnl (LIST should have the form `[(item_1, item_2, ..., item_n)]'),
+dnl i.e. the whole list should be *quoted*. Quote members too if
+dnl you don't want them to be expanded.
+dnl
+dnl This macro is robust to active symbols:
+dnl define(active, ACTIVE)
+dnl m4_foreach([Var], [([active], [b], [active])], [-Var-])end
+dnl => -active--b--active-end
+define(m4_foreach,
+[pushdef([$1], [])_m4_foreach($@)popdef([$1])])
+
+dnl Low level macros used to define m4_foreach
+define(_m4_car, [[$1]])
+define(_m4_foreach,
+[ifelse($2, [()], ,
+ [define([$1], [_m4_car$2])$3[]_m4_foreach([$1],
+ [(m4_shift$2)],
+ [$3])])])
+
+
dnl ### Defining macros
dnl | else
dnl | IF-FALSE
dnl | fi
-dnl | with simplifications is IF-TRUE and/or IF-FALSE is empty.
+dnl with simplifications is IF-TRUE and/or IF-FALSE is empty.
define([AC_SHELL_IFELSE],
[ifset([$2$3],
[if [$1]; then
dnl from `a' to `\0' never ends...
dnl
dnl Include a protection against `%' (used as a sed separator) in FROM and TO.
-dnl Forbid appearence of `-' in FROM elsewhere than in the last position,
+dnl Forbid appearance of `-' in FROM elsewhere than in the last position,
dnl since we might otherwise trigger a GNU m4 bug (version 1.4 included).
dnl ALPHABET may contain characters interval.
dnl define(AC_TR,
dnl ### Implementing m4 loops
-
-dnl Implementing loops (`foreach' loops) in m4 is much more tricky than it
-dnl may seem. Actually, the example of a `foreach' loop in the m4
-dnl documentation is wrong: it does not quote the arguments properly,
-dnl which leads to undesired expansions.
-dnl
-dnl The example in the documentation is:
-dnl
-dnl | # foreach(x, (item_1, item_2, ..., item_n), stmt)
-dnl | define(`foreach',
-dnl | `pushdef(`$1', `')_foreach(`$1', `$2', `$3')popdef(`$1')')
-dnl | define(`_arg1', `$1')
-dnl | define(`_foreach',
-dnl | `ifelse(`$2', `()', ,
-dnl | `define(`$1', _arg1$2)$3`'_foreach(`$1', (shift$2), `$3')')')
-dnl
-dnl But then if you run
-dnl
-dnl | define(a, 1)
-dnl | define(b, 2)
-dnl | define(c, 3)
-dnl | foreach(`f', `(`a', `(b', `c)')', `echo f
-dnl | ')
-dnl
-dnl it gives
-dnl
-dnl | echo 1
-dnl | echo (2,3)
-dnl
-dnl which is not what is expected.
-dnl
-dnl Once you understood this, you turn yourself into a quoting wizard,
-dnl and come up with the following solution:
-dnl
-dnl | # foreach(x, (item_1, item_2, ..., item_n), stmt)
-dnl | define(`foreach', `pushdef(`$1', `')_foreach($@)popdef(`$1')')
-dnl | define(`_arg1', ``$1'')
-dnl | define(`_foreach',
-dnl | `ifelse($2, `()', ,
-dnl | `define(`$1', `_arg1$2')$3`'_foreach(`$1', `(shift$2)', `$3')')')
-dnl
-dnl which this time answers
-dnl
-dnl | echo a
-dnl | echo (b
-dnl | echo c)
-dnl
-dnl Bingo!
-
-dnl AC_FOREACH_COMMA(VARIABLE, LIST, EXPRESSION)
-dnl --------------------------------------------
-dnl Expand EXPRESSION assigning to VARIABLE each value of the LIST
-dnl (LIST should have the form `[(item_1, item_2, ..., item_n)]'),
-dnl i.e. the whole list should be *quoted*. Quote members too if
-dnl you don't want them to be expanded.
-define(AC_FOREACH_COMMA,
-[pushdef([$1], [])_AC_FOREACH($@)popdef([$1])])
-
-dnl Low level macros used to define AC_FOREACH_COMMA.
-define(_AC_CAR, [[$1]])
-define(_AC_FOREACH,
-[ifelse($2, [()], ,
- [define([$1], [_AC_CAR$2])$3[]_AC_FOREACH([$1],
- [(m4_shift$2)],
- [$3])])])
-
-dnl _AC_COMMATIZE(LIST)
-dnl -------------------
-
-dnl Transform a shell LIST (i.e., white space separated) into a m4 list
-dnl (i.e., separated with commas). This is used to implement AC_FOREACH
-dnl with AC_FOREACH_COMMA.
-dnl
-dnl It quite tricky for several reasons:
-dnl - if there are quoted active symbols in input, on the output they
-dnl should still be quoted. I didn't manage to reach this goal yet,
-dnl but it doesn't seem to be such a necessity. FIXME: do it.
-dnl - if there are parentheses in the input, make sure *not* to think
-dnl this is an m4 list. This is especially important for
-dnl AC_HELP_STRING.
-dnl
-dnl This means that `_AC_COMMATIZE([a] [(b] [c)])' should expand into
-dnl `[a], [(b], [c)]'. Currently parentheses are correctly handled, but
-dnl the macro are expanded, i.e., the output is `[1],[(2],[3)]'.
-dnl
-dnl Do not use `patsubst([$2], [\>\W+\<], [,])', since it swallows
-dnl the `$' from the variable names, so, 1. swallow `\[CR]' (I don't
-dnl understand why I need two backslashes), 2. remove trailing spaces, 3.
-dnl replace remaining sequences of spaces with commas.
-dnl
-dnl Pay attention to the changequotes. Inner changequotes exist for
-dnl obvious reasons (we want to insert square brackets). Outer
-dnl changequotes are needed because otherwise the m4 parser, when it
-dnl sees the closing bracket we add to the result, believes it is the
-dnl end of the body of the macro we define.
-changequote(<<, >>)
-define(<<_AC_COMMATIZE>>,
-<<changequote(``, '')dnl
-pushdef(``one_line'', translit(patsubst(``$1'', ``\\
-''), ``
-'', `` ''))dnl
-pushdef(``no_trailing_space'', patsubst(one_line, ``[ ]+$''))dnl
-[patsubst(no_trailing_space, ``[ ]+'', ``],['')]dnl
-changequote([, ])dnl
-popdef(``no_trailing_space'')dnl
-popdef(``one_line'')>>)
-changequote([, ])
-
dnl AC_FOREACH(VARIABLE, LIST, EXPRESSION)
dnl --------------------------------------
dnl
dnl Compute EXPRESSION assigning to VARIABLE each value of the LIST.
-dnl (LIST has the form `item_1 item_2 ... item_n': there are no commas.)
-dnl
+dnl LIST is a /bin/sh list, i.e., it has the form ` item_1 item_2
+dnl ... item_n ': white spaces are separators, and leading and trailing
+dnl spaces are meaningless.
+dnl
+dnl This macro is robust to active symbols:
+dnl AC_FOREACH([Var], [ active
+dnl b act\
+dnl ive ], [-Var-])end
+dnl => -active--b--active-end
define([AC_FOREACH],
-[AC_FOREACH_COMMA([$1], (_AC_COMMATIZE([$2])), [$3])])
+[m4_foreach([$1], (m4_split(m4_strip(m4_join([$2])))), [$3])])
dnl AC_SPECIALIZE(MACRO, ARG1 [, ARGS...])
dnl Typical outputs are:
dnl
dnl AC_WRAP([Short string */], [ ], [/* ], 20)
-dnl | /* Short string */
+dnl => /* Short string */
dnl
dnl AC_WRAP([Much longer string */], [ ], [/* ], 20)
-dnl | /* Much longer
-dnl | string */
+dnl => /* Much longer
+dnl => string */
dnl
dnl AC_WRAP([Short doc.], [ ], [ --short ], 30)
-dnl | --short Short doc.
+dnl => --short Short doc.
dnl
dnl AC_WRAP([Short doc.], [ ], [ --too-wide ], 30)
-dnl | --too-wide
-dnl | Short doc.
+dnl => --too-wide
+dnl => Short doc.
dnl
dnl AC_WRAP([Super long documentation.], [ ], [ --too-wide ], 30)
-dnl | --too-wide
-dnl | Super long
-dnl | documentation.
+dnl => --too-wide
+dnl => Super long
+dnl => documentation.
dnl
-dnl dnl FIXME: there is no checking of a longer PREFIX than WIDTH, but do
-dnl dnl we really want to bother with people trying each single corner
-dnl dnl of a software?
+dnl FIXME: there is no checking of a longer PREFIX than WIDTH, but do
+dnl we really want to bother with people trying each single corner
+dnl of a software?
define([AC_WRAP],
[pushdef([AC_Prefix], m4_default([$2], []))dnl
pushdef([AC_Prefix1], m4_default([$3], [AC_Prefix]))dnl
dnl Format an Autoconf macro's help string so that it looks pretty when
dnl the user executes "configure --help". This macro takes three
dnl arguments, a "left hand side" (LHS), a "right hand side" (RHS), and
-dnl the COLUMN which is a string of wide spaces which leads to the
+dnl the COLUMN which is a string of white spaces which leads to the
dnl the RHS column (default: 26 white spaces).
dnl
dnl The resulting string is suitable for use in other macros that require
dnl AC_INIT_NOTICE()
AC_DEFUN(AC_INIT_NOTICE,
[# Guess values for system-dependent variables and create Makefiles.
-# Generated automatically using autoconf version] AC_ACVERSION [
+# Generated automatically using Autoconf version] AC_ACVERSION [
# Copyright (C) 1992, 93, 94, 95, 96, 98, 1999 Free Software Foundation, Inc.
#
# This configure script is free software; the Free Software Foundation
dnl AC_INIT_PREPARE(UNIQUE-FILE-IN-SOURCE-DIR)
dnl ------------------------------------------
-dnl Called by AC_INIT to buid the preamble of the `configure' scripts.
+dnl Called by AC_INIT to build the preamble of the `configure' scripts.
dnl 1. Trap and clean up various tmp files.
dnl 2. Set up the fd and output files
dnl 3. Remember the options given to `configure' for `config.status --recheck'.
" 1>&AC_FD_CC
# Strip out --no-create and --no-recursion so they do not pile up.
-# Also quote any args containing shell metacharacters.
+# Also quote any args containing shell meta-characters.
ac_configure_args=
for ac_arg
do
dnl AC_CHECK_TYPE(TYPE, DEFAULT[, INCLUDES])
dnl ----------------------------------------
-dnl FIXME: This is an extremely badly choosen name, since this
+dnl FIXME: This is an extremely badly chosen name, since this
dnl macro actually performs an AC_REPLACE_TYPE. Some day we
dnl have to clean this up.
AC_DEFUN(AC_CHECK_TYPE,
# include <stdlib.h>
# include <stddef.h>
#endif
-[$3]
+$3
], AC_VAR_SET(ac_Type, yes), AC_VAR_SET(ac_Type, no))])
AC_SHELL_IFELSE(test AC_VAR_GET(ac_Type) = yes,,
[AC_DEFINE_UNQUOTED($1, $2)])dnl
# configure, is in ./config.log if it exists.
ac_cs_usage="\\
-\\\`$CONFIG_STATUS' instanciates files from templates according to the
+\\\`$CONFIG_STATUS' instantiates files from templates according to the
current configuration.
Usage: $CONFIG_STATUS @BKL@OPTIONS@BKR@ FILE...
--version Print the version of Autoconf and exit
--help Display this help and exit
-dnl Output this only if there are files to instanciate.
+dnl Output this only if there are files to instantiate.
ifset(ifdef([AC_LIST_HEADER], 1)$1,
-[Files to instanciate:
+[Files to instantiate:
ifset($1, [ Configuration files:
AC_WRAP($1, [ ])
])dnl
dnl Using a here document instead of a string reduces the quoting nightmare.
dnl Putting comments in sed scripts is not portable.
dnl One may be tempted to use the same trick to speed up the sed script
-dnl as for CONFIG_FILES (combinasion of :t and t t). Here we cannot,
+dnl as for CONFIG_FILES (combination of :t and t t). Here we cannot,
dnl because of the `#define' templates: we may enter in infinite loops
dnl replacing `#define foo bar' by itself.
dnl We ought to get rid of the #define templates.
changequote([, ])dnl
EOF
+# Break up conftest.vals because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
rm -f conftest.tail
while :
do