1999-10-31 Akim Demaille <akim@epita.fr>

New macro: AC_CONFIG_FILES which is very much like AC_OUTPUT but
      that one associates commands to run when a config file is
      created.  For instance for a shell script `foo', one uses
      AC_CONFIG_FILES(foo, chmod +x foo).

      In addition, check that the same name is never used twice in
      config files, headers, subdirs and links.

      * acgeneral.m4 (m4_append): Don't insert new line between
      elements.
      (m4_list_append): New macro.
      (AC_CONFIG_IF_MEMBER): New macro which tests if a file is member
      of a config list.
      (AC_CONFIG_UNIQUE): New macro which ensures that a config file
      name is not yet used.
      (AC_CONFIG_HEADER, AC_CONFIG_LINKS, AC_CONFIG_SUBDIRS): Use
      AC_CONFIG_UNIQUE.

      * acgeneral.m4 (AC_CONFIG_FILES): New macro.
      (AC_LIST_FILES): New list, which stores arguments of
      AC_CONFIG_LISTS the same as AC_LIST_LINKS stores AC_CONFIG_LINKS
      etc.
      (AC_OUTPUT): No longer rely on $1 to designate the config files:
      register them via AC_CONFIG_FILES.  All uses of $1 replaced by
      uses of AC_LIST_FILES.
      (AC_OUTPUT_FILES): Run the commands associated to the
      CONFIG_FILES.
This commit is contained in:
Akim Demaille 1999-12-20 12:14:28 +00:00
parent de65ecc7bb
commit 5aa38da39b
6 changed files with 355 additions and 100 deletions

View File

@ -1,3 +1,33 @@
1999-10-31 Akim Demaille <akim@epita.fr>
New macro: AC_CONFIG_FILES which is very much like AC_OUTPUT but
that one associates commands to run when a config file is
created. For instance for a shell script `foo', one uses
AC_CONFIG_FILES(foo, chmod +x foo).
In addition, check that the same name is never used twice in
config files, headers, subdirs and links.
* acgeneral.m4 (m4_append): Don't insert new line between
elements.
(m4_list_append): New macro.
(AC_CONFIG_IF_MEMBER): New macro which tests if a file is member
of a config list.
(AC_CONFIG_UNIQUE): New macro which ensures that a config file
name is not yet used.
(AC_CONFIG_HEADER, AC_CONFIG_LINKS, AC_CONFIG_SUBDIRS): Use
AC_CONFIG_UNIQUE.
* acgeneral.m4 (AC_CONFIG_FILES): New macro.
(AC_LIST_FILES): New list, which stores arguments of
AC_CONFIG_LISTS the same as AC_LIST_LINKS stores AC_CONFIG_LINKS
etc.
(AC_OUTPUT): No longer rely on $1 to designate the config files:
register them via AC_CONFIG_FILES. All uses of $1 replaced by
uses of AC_LIST_FILES.
(AC_OUTPUT_FILES): Run the commands associated to the
CONFIG_FILES.
1999-10-31 Akim Demaille <akim@epita.fr>
* autoconf.sh (Looking for bugs): In addition to AC_, match AH_

35
TODO
View File

@ -13,8 +13,25 @@ These are things mandatory to fulfill before releasing 2.15. There
are also suggestions we should either satisfy right now (they're
easy), or remove (obsoleted since then).
** autoconf.texi: config.status in node names.
The info mode of Emacs seems to have problems with this. If the info
reader catches that properly, we should not care. If no info reader
can handle this, we should change the affected node names. Bug
triggered by looking for `CONFIG_FILES' in the index.
** autoconf.texi: Document AC_CONFIG_FILES.
I didn't do it, because I don't know where to do that. I would like
to have all the AC_CONFIG_ together, but it is not currently the
case. An architecture for the docs needs to be decided.
** autoconf.texi, near fubar=27.
This example is *wrong*. fubar is set in configure, not
config.status, therefore the extra commands will not know $fubar, as
the example let us believe.
** AC_C_STRUCT_MEMBER needs a full rewrite.
And once done, the former specialized macros should be adapted.
AC_CHECK_MEMBER/AC_CHECK_MEMBERS is a proposal, see the code.
** AC_CHECK_HEADER should not template config.h entries.
Its entry in autoheader.m4 should be removed.
@ -22,9 +39,27 @@ Its entry in autoheader.m4 should be removed.
** Allow tags for AC_OUTPUT_COMMANDS
so that we can run ./config.status name-of-the command.
** Generalize the association of a commands to an output file.
See AC_CONFIG_FILES: it is possible to associate a command which is
run when the file is creating. This should be extended to all the
other AC_CONFIG entities. But then there is a question: should the
commands associated to a HEADER be in config.status's HEADER section,
ran right after the file is created, or we should just plug the
commands in the section of tagged AC_OUTPUT_COMMANDS. There are two
issues here: if we want to display the commands ran, then we want them
to appear after `creating ...', not at the end. It is also better wrt
trapping (since files are finalized sooner, there are less files to
remove when C-c is caught). On the other hand, it is a bit less
pleasant to program in Autoconf.
** Rename AC_CONFIG_HEADER as AC_CONFIG_HEADERS?
See the FIXME note in the code.
** Allow --recursive to config.status
So that --recheck does not pass --no-recursive to configure.
** Allow --header, --command, --file to config.status.
I don't remember the purpose, ask Alexandre.
** Move AM_PROG_CC_STDC into Autoconf.
Autoconf should provide the means to determine the ANSIsm of the

View File

@ -174,7 +174,7 @@ dnl Redefine MACRO-NAME to hold its former content plus STRING at the
dnl end. It is valid to use this macro with MACRO-NAME undefined.
dnl
dnl This macro is robust to active symbols. It can be used to grow
dnl strings or lists.
dnl strings.
dnl
dnl | define(active, ACTIVE)
dnl | m4_append([sentence], [This is an])
@ -200,8 +200,15 @@ dnl =>
dnl => active
define(m4_append,
[define([$1],
ifdef([$1], [defn([$1])])
[$2])])
ifdef([$1], [defn([$1])])[$2])])
dnl m4_list_append(MACRO-NAME, STRING)
dnl ----------------------------------
dnl Same as `m4_append', but each element is separated by `, '.
define(m4_list_append,
[define([$1],
ifdef([$1], [defn([$1]), ])[$2])])
dnl ------------------------------------------------------------
@ -2872,10 +2879,50 @@ AC_VAR_POPDEF([ac_Type])dnl
dnl ### Creating output files
dnl AC_CONFIG_IF_MEMBER(DEST[:SOURCE], LIST, ACTION-IF-TRUE, ACTION-IF-FALSE)
dnl -------------------------------------------------------------------------
dnl If DEST is member of LIST, expand to ACTION-IF-TRUE, else ACTION-IF-FALSE.
dnl
dnl LIST is an AC_CONFIG list, i.e., a list of DEST[:SOURCE], separated
dnl with spaces.
dnl
dnl FIXME: This macro is badly designed, but I'm not guilty: m4 is. There
dnl is just no way to simply compare two strings in m4, but to use pattern
dnl matching. The big problem is then that the active characters should
dnl be quoted. So an additional macro should be used here. Nevertheless,
dnl in the case of file names, there is not much to worry.
define(AC_CONFIG_IF_MEMBER,
[pushdef([AC_Dest], patsubst([$1], [:.*]))dnl
ifelse(regexp($2, [\(^\| \)]AC_Dest[\(:\| \|$\)]), -1, [$4], [$3])dnl
popdef([AC_Dest])dnl
])
dnl AC_CONFIG_UNIQUE(DEST[:SOURCE]...)
dnl ----------------------------------
dnl Verify that there is no double definition of an output file
dnl (precisely, guarantees there is no common elements between
dnl CONFIG_HEADERS, CONFIG_FILES, CONFIG_LINKS, and CONFIG_SUBDIRS).
define(AC_CONFIG_UNIQUE,
[AC_FOREACH([AC_File], [$1],
[AC_CONFIG_IF_MEMBER(AC_File, [AC_LIST_HEADERS],
[AC_FATAL(`AC_File' [is already registered with AC_CONFIG_HEADER.])])
AC_CONFIG_IF_MEMBER(AC_File, [AC_LIST_LINKS],
[AC_FATAL(`AC_File' [is already registered with AC_CONFIG_LINKS.])])
AC_CONFIG_IF_MEMBER(AC_File, [AC_LIST_SUBDIRS],
[AC_FATAL(`AC_File' [is already registered with AC_CONFIG_SUBDIRS.])])
AC_CONFIG_IF_MEMBER(AC_File, [AC_LIST_FILES],
[AC_FATAL(`AC_File' [is already registered with AC_CONFIG_FILES or AC_OUTPUT.])])])dnl
])
dnl AC_CONFIG_HEADER(HEADER-TO-CREATE ...)
dnl --------------------------------------
dnl FIXME: For sake of uniformity, it should be AC_CONFIG_HEADERS, and
dnl it should be possible to accumulate several calls.
AC_DEFUN(AC_CONFIG_HEADER,
[define(AC_LIST_HEADERS, $1)])
[AC_CONFIG_UNIQUE([$1])dnl
define(AC_LIST_HEADERS, $1)])
dnl AC_CONFIG_LINKS(DEST:SOURCE...)
@ -2884,13 +2931,12 @@ dnl Specify that config.status should establish a (symbolic if possible)
dnl link from TOP_SRCDIR/SOURCE to TOP_SRCDIR/DEST.
dnl Reject DEST=., because it is makes it hard for ./config.status
dnl to guess the links to establish (`./config.status .').
dnl This macro may be called multiple times.
AC_DEFUN(AC_CONFIG_LINKS,
[ifelse(regexp([$1], [^.:]), -1,,
[AC_FATAL([$0: invalid destination: `.'])])
ifelse(regexp([$1], [ .:]), -1,,
[AC_FATAL([$0: invalid destination: `.'])])
define([AC_LIST_LINKS],
ifdef([AC_LIST_LINKS], [AC_LIST_LINKS ],)[$1])
[AC_CONFIG_UNIQUE([$1])dnl
ifelse(regexp([$1], [^\.:\| \.:]), -1,,
[AC_FATAL([$0: invalid destination: `.'])])dnl
m4_append([AC_LIST_LINKS], [$1])dnl
])
@ -2898,27 +2944,49 @@ dnl AC_LINK_FILES(SOURCE..., DEST...)
dnl ---------------------------------
dnl Link each of the existing files SOURCE... to the corresponding
dnl link name in DEST...
dnl This macro, as AC_CONFIG_FILES, produces no sh code, so we don't
dnl dnl.
AC_DEFUN(AC_LINK_FILES,
[AC_OBSOLETE([$0], [; instead use AC_CONFIG_FILES(DEST:SOURCE...)])
[AC_OBSOLETE([$0], [; instead use AC_CONFIG_LINKS(DEST:SOURCE...)])dnl
ifelse($#, 2, ,
[AC_FATAL([$0: incorrect number of arguments])])
pushdef([AC_Sources], m4_split(m4_strip(m4_join([$1]))))
pushdef([AC_Dests], m4_split(m4_strip(m4_join([$2]))))
[AC_FATAL([$0: incorrect number of arguments])])dnl
dnl
pushdef([AC_Sources], m4_split(m4_strip(m4_join([$1]))))dnl
pushdef([AC_Dests], m4_split(m4_strip(m4_join([$2]))))dnl
dnl
m4_foreach([AC_Dummy], (AC_Sources),
[AC_CONFIG_LINKS(m4_car(AC_Dests):m4_car(AC_Sources))
define([AC_Sources], m4_quote(m4_shift(AC_Sources)))
define([AC_Dests], m4_quote(m4_shift(AC_Dests)))])
[AC_CONFIG_LINKS(m4_car(AC_Dests):m4_car(AC_Sources))
define([AC_Sources], m4_quote(m4_shift(AC_Sources)))
define([AC_Dests], m4_quote(m4_shift(AC_Dests)))])dnl
dnl
popdef([AC_Sources])dnl
popdef([AC_Dests])dnl
])dnl AC_LINK_FILES
dnl AC_CONFIG_FILES(FILE...[, COMMANDS])
dnl ------------------------------------
dnl Specify output files, as with AC_OUTPUT, i.e., files that are
dnl configured with AC_SUBST. Associate the COMMANDS to each FILE,
dnl i.e., when config.status creates FILE, run COMMANDS afterwards.
dnl
dnl The commands are stored in a growing string AC_LIST_FILES_COMMANDS
dnl which should be used like this:
dnl
dnl case $ac_file in
dnl AC_LIST_FILES_COMMANDS
dnl esac
AC_DEFUN([AC_CONFIG_FILES],
[AC_CONFIG_UNIQUE([$1])dnl
m4_append([AC_LIST_FILES], [ $1])dnl
dnl
pushdef([AC_Prefix], [ ])dnl
dnl
ifelse([$2],,, [AC_FOREACH([AC_File], [$1],
[m4_append([AC_LIST_FILES_COMMANDS],
[ ]patsubst(AC_File, [:.*])[ ) $2 ;;
])])])dnl
])dnl
popdef([AC_Sources])
popdef([AC_Dests])
])
define([AC_LIST_LINKS],
ifdef([AC_LIST_LINKS], [AC_LIST_LINKS ],)[$2:$1])])
dnl AC_OUTPUT_COMMANDS(EXTRA-CMDS, INIT-CMDS)
dnl -----------------------------------------
@ -2934,9 +3002,11 @@ AC_DIVERT_PUSH(AC_DIVERSION_ICMDS)dnl
AC_DIVERT_POP()])
dnl AC_CONFIG_SUBDIRS(DIR ...)
dnl --------------------------
AC_DEFUN(AC_CONFIG_SUBDIRS,
[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
define([AC_LIST_SUBDIRS], ifdef([AC_LIST_SUBDIRS], [AC_LIST_SUBDIRS ],)[$1])dnl
[AC_CONFIG_UNIQUE([$1])dnl
AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
m4_append([AC_LIST_SUBDIRS], [$1])dnl
subdirs="AC_LIST_SUBDIRS"
AC_SUBST(subdirs)dnl
])
@ -2949,7 +3019,9 @@ dnl The CONFIG_HEADERS are defined in the m4 variable AC_LIST_HEADERS.
dnl Pay special attention not to have too long here docs: some old
dnl shells die. Unfortunately the limit is not known precisely...
define(AC_OUTPUT,
[trap '' 1 2 15
[dnl Store the CONFIG_FILES
AC_CONFIG_FILES([$1])dnl
trap '' 1 2 15
AC_CACHE_SAVE
trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
@ -2990,8 +3062,8 @@ dnl so uname gets run too.
# configure, is in ./config.log if it exists.
# Files that config.status was made for.
ifset([$1], [config_files="\\
AC_WRAP($1, [ ])"
ifdef([AC_LIST_FILES], [config_files="\\
AC_WRAP(AC_LIST_FILES, [ ])"
])dnl
ifdef([AC_LIST_HEADERS], [config_headers="\\
AC_WRAP(AC_LIST_HEADERS, [ ])"
@ -3013,9 +3085,9 @@ Usage: $CONFIG_STATUS @BKL@OPTIONS@BKR@ FILE...
dnl Issue this section only if there were actually config files.
dnl The following test checks if one of AC_LIST_HEADERS, the CONFIG_FILES
dnl which are given via $[1], or AC_LIST_LINKS is set.
ifset(ifdef([AC_LIST_HEADERS], 1)ifdef([AC_LIST_LINKS], 1)[$1],
ifset(ifdef([AC_LIST_HEADERS], 1)ifdef([AC_LIST_LINKS], 1)ifdef([AC_LIST_FILES], 1),
[Files to instantiate:
ifset($1, [ Configuration files:
ifdef([AC_LIST_FILES], [ Configuration files:
\$config_files
])dnl
ifdef([AC_LIST_HEADERS], [ Configuration headers:
@ -3094,15 +3166,15 @@ EOF
dnl Issue this section only if there were actually config files.
dnl The following test checks if one of AC_LIST_HEADERS, the CONFIG_FILES
dnl which are given via $[1], or AC_LIST_LINKS is set.
ifset(ifdef([AC_LIST_HEADERS], 1)ifdef([AC_LIST_LINKS], 1)[$1],
ifset(ifdef([AC_LIST_HEADERS], 1)ifdef([AC_LIST_LINKS], 1)ifdef([AC_LIST_FILES], 1),
[cat >> $CONFIG_STATUS <<EOF
# If there were arguments, don't assign a default value.
if test \$[#] = 0; then
ifset([$1], [ : \${CONFIG_FILES="\$config_files"}
ifdef([AC_LIST_FILES], [ CONFIG_FILES="\$config_files"
])dnl
ifdef([AC_LIST_HEADERS], [ : \${CONFIG_HEADERS="\$config_headers"}
ifdef([AC_LIST_HEADERS], [ CONFIG_HEADERS="\$config_headers"
])dnl
ifdef([AC_LIST_LINKS], [ : \${CONFIG_LINKS="\$config_links"}
ifdef([AC_LIST_LINKS], [ CONFIG_LINKS="\$config_links"
])dnl
fi
@ -3121,10 +3193,10 @@ dnl documenting into $CONFIG_STATUS.
dnl Because AC_OUTPUT_FILES is in charge of undiverting the AC_SUBST
dnl section, it is better to divert it to void and *call it*, rather
dnl than not calling it at all
ifset([$1],
[AC_OUTPUT_FILES([$1])],
ifdef([AC_LIST_FILES],
[AC_OUTPUT_FILES(AC_LIST_FILES)],
[AC_DIVERT_PUSH(AC_DIVERSION_KILL)dnl
AC_OUTPUT_FILES([$1])dnl
AC_OUTPUT_FILES(AC_LIST_FILES)dnl
AC_DIVERT_POP()])dnl
ifdef([AC_LIST_HEADERS], [AC_OUTPUT_HEADER(AC_LIST_HEADERS)])dnl
ifdef([AC_LIST_LINKS], [AC_OUTPUT_LINKS(AC_LIST_LINKS)])dnl
@ -3146,11 +3218,12 @@ ifdef([AC_LIST_SUBDIRS], [AC_OUTPUT_SUBDIRS(AC_LIST_SUBDIRS)])dnl
])dnl AC_OUTPUT
dnl AC_OUTPUT_MAKE_DEFS()
dnl ---------------------
dnl AC_OUTPUT_MAKE_DEFS
dnl -------------------
dnl Set the DEFS variable to the -D options determined earlier.
dnl This is a subroutine of AC_OUTPUT.
dnl It is called inside configure, outside of config.status.
dnl FIXME: This has to be fixed the same way as in AC_OUTPUT_HEADER.
define(AC_OUTPUT_MAKE_DEFS,
[# Transform confdefs.h into DEFS.
dnl Using a here document instead of a string reduces the quoting nightmare.
@ -3193,6 +3266,11 @@ dnl It has to send itself into $CONFIG_STATUS (eg, via here documents).
dnl Upon exit, no here document shall be opened.
define(AC_OUTPUT_FILES,
[cat >>$CONFIG_STATUS <<EOF
#
# CONFIG_FILES section.
#
# Protect against being on the right side of a sed subst in config.status.
dnl Please, pay attention that this sed code depends a lot on the shape
dnl of the sed commands issued by AC_SUBST. So if you change one, change
@ -3342,11 +3420,19 @@ dnl rm -f $ac_file
dnl mv $ac_cs_root.out $ac_file
dnl fi
mv $ac_cs_root.out $ac_file
ifdef([AC_LIST_FILES_COMMANDS],
[ # Run the commands associated to the file.
case "$ac_file" in
AC_LIST_FILES_COMMANDS[]dnl
esac
])dnl
fi; done
rm -f $ac_cs_root.s*
EOF
])dnl AC_OUTPUT_FILES
dnl AC_OUTPUT_HEADER(HEADER-FILE...)
dnl --------------------------------
dnl Create the config.h files from the config.h.in files.
@ -3357,6 +3443,11 @@ dnl Upon exit, no here document shall be opened.
define(AC_OUTPUT_HEADER,
[cat >>$CONFIG_STATUS <<\EOF
changequote(<<, >>)dnl
#
# CONFIG_HEADER section.
#
# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
# NAME is the cpp macro being defined and VALUE is the value it is being given.
#
@ -3511,6 +3602,10 @@ dnl It has to send itself into $CONFIG_STATUS (eg, via here documents).
dnl Upon exit, no here document shall be opened.
define(AC_OUTPUT_LINKS,
[cat >> $CONFIG_STATUS <<\EOF
#
# CONFIG_LINKS section.
#
srcdir=$ac_given_srcdir
dnl Here we use : instead of .. because if AC_LINK_FILES was used
@ -3550,7 +3645,7 @@ changequote([, ])dnl
changequote(, )dnl
[/$]*) ac_rel_source="$srcdir/$ac_source" ;;
changequote([, ])dnl
*) ac_rel_source="$ac_dots$srcdir/$ac_source" ;;
*) ac_rel_source="$ac_dots$srcdir/$ac_source" ;;
esac
# Make a symlink if possible; otherwise try a hard link.

View File

@ -866,9 +866,9 @@ not the parents of that directory). Usually, @file{Makefile}s are
created this way, but other files, such as @file{.gdbinit}, can be
specified as well.
If @code{AC_CONFIG_HEADER}, @code{AC_CONFIG_LINKS}, or
@code{AC_CONFIG_SUBDIRS} has been called, this macro also creates the
files named as their arguments.
If @code{AC_CONFIG_HEADER}, @code{AC_CONFIG_LINKS},
@code{AC_CONFIG_FILES}, or @code{AC_CONFIG_SUBDIRS} has been called,
this macro also creates the files named as their arguments.
A typical call to @code{AC_OUTPUT} looks like this:
@example
@ -5212,8 +5212,8 @@ one of them, perhaps a common library, does. These variables allow a
@defvar CONFIG_FILES
@evindex CONFIG_FILES
The files in which to perform @samp{@@@var{variable}@@} substitutions.
The default is the arguments given to @code{AC_OUTPUT} in
@file{configure.in}.
The default is the arguments given to @code{AC_OUTPUT} and
@code{AC_CONFIG_FILES} in @file{configure.in}.
@end defvar
@defvar CONFIG_HEADERS
@ -5244,7 +5244,7 @@ stamp-h: config.h.in config.status
echo > stamp-h
Makefile: Makefile.in config.status
CONFIG_LINKS CONFIG_FILES=Makefile CONFIG_HEADERS= ./config.status
CONFIG_LINKS= CONFIG_FILES=Makefile CONFIG_HEADERS= ./config.status
@end group
@end example
@ -5252,7 +5252,7 @@ Makefile: Makefile.in config.status
(If @file{configure.in} does not call @code{AC_CONFIG_HEADER}, there is
no need to set @code{CONFIG_HEADERS} in the @code{make} rules.)
Note that this example could also have been written
Note that this example could also have been written:
@example
@group

View File

@ -866,9 +866,9 @@ not the parents of that directory). Usually, @file{Makefile}s are
created this way, but other files, such as @file{.gdbinit}, can be
specified as well.
If @code{AC_CONFIG_HEADER}, @code{AC_CONFIG_LINKS}, or
@code{AC_CONFIG_SUBDIRS} has been called, this macro also creates the
files named as their arguments.
If @code{AC_CONFIG_HEADER}, @code{AC_CONFIG_LINKS},
@code{AC_CONFIG_FILES}, or @code{AC_CONFIG_SUBDIRS} has been called,
this macro also creates the files named as their arguments.
A typical call to @code{AC_OUTPUT} looks like this:
@example
@ -5212,8 +5212,8 @@ one of them, perhaps a common library, does. These variables allow a
@defvar CONFIG_FILES
@evindex CONFIG_FILES
The files in which to perform @samp{@@@var{variable}@@} substitutions.
The default is the arguments given to @code{AC_OUTPUT} in
@file{configure.in}.
The default is the arguments given to @code{AC_OUTPUT} and
@code{AC_CONFIG_FILES} in @file{configure.in}.
@end defvar
@defvar CONFIG_HEADERS
@ -5244,7 +5244,7 @@ stamp-h: config.h.in config.status
echo > stamp-h
Makefile: Makefile.in config.status
CONFIG_LINKS CONFIG_FILES=Makefile CONFIG_HEADERS= ./config.status
CONFIG_LINKS= CONFIG_FILES=Makefile CONFIG_HEADERS= ./config.status
@end group
@end example
@ -5252,7 +5252,7 @@ Makefile: Makefile.in config.status
(If @file{configure.in} does not call @code{AC_CONFIG_HEADER}, there is
no need to set @code{CONFIG_HEADERS} in the @code{make} rules.)
Note that this example could also have been written
Note that this example could also have been written:
@example
@group

View File

@ -174,7 +174,7 @@ dnl Redefine MACRO-NAME to hold its former content plus STRING at the
dnl end. It is valid to use this macro with MACRO-NAME undefined.
dnl
dnl This macro is robust to active symbols. It can be used to grow
dnl strings or lists.
dnl strings.
dnl
dnl | define(active, ACTIVE)
dnl | m4_append([sentence], [This is an])
@ -200,8 +200,15 @@ dnl =>
dnl => active
define(m4_append,
[define([$1],
ifdef([$1], [defn([$1])])
[$2])])
ifdef([$1], [defn([$1])])[$2])])
dnl m4_list_append(MACRO-NAME, STRING)
dnl ----------------------------------
dnl Same as `m4_append', but each element is separated by `, '.
define(m4_list_append,
[define([$1],
ifdef([$1], [defn([$1]), ])[$2])])
dnl ------------------------------------------------------------
@ -2872,10 +2879,50 @@ AC_VAR_POPDEF([ac_Type])dnl
dnl ### Creating output files
dnl AC_CONFIG_IF_MEMBER(DEST[:SOURCE], LIST, ACTION-IF-TRUE, ACTION-IF-FALSE)
dnl -------------------------------------------------------------------------
dnl If DEST is member of LIST, expand to ACTION-IF-TRUE, else ACTION-IF-FALSE.
dnl
dnl LIST is an AC_CONFIG list, i.e., a list of DEST[:SOURCE], separated
dnl with spaces.
dnl
dnl FIXME: This macro is badly designed, but I'm not guilty: m4 is. There
dnl is just no way to simply compare two strings in m4, but to use pattern
dnl matching. The big problem is then that the active characters should
dnl be quoted. So an additional macro should be used here. Nevertheless,
dnl in the case of file names, there is not much to worry.
define(AC_CONFIG_IF_MEMBER,
[pushdef([AC_Dest], patsubst([$1], [:.*]))dnl
ifelse(regexp($2, [\(^\| \)]AC_Dest[\(:\| \|$\)]), -1, [$4], [$3])dnl
popdef([AC_Dest])dnl
])
dnl AC_CONFIG_UNIQUE(DEST[:SOURCE]...)
dnl ----------------------------------
dnl Verify that there is no double definition of an output file
dnl (precisely, guarantees there is no common elements between
dnl CONFIG_HEADERS, CONFIG_FILES, CONFIG_LINKS, and CONFIG_SUBDIRS).
define(AC_CONFIG_UNIQUE,
[AC_FOREACH([AC_File], [$1],
[AC_CONFIG_IF_MEMBER(AC_File, [AC_LIST_HEADERS],
[AC_FATAL(`AC_File' [is already registered with AC_CONFIG_HEADER.])])
AC_CONFIG_IF_MEMBER(AC_File, [AC_LIST_LINKS],
[AC_FATAL(`AC_File' [is already registered with AC_CONFIG_LINKS.])])
AC_CONFIG_IF_MEMBER(AC_File, [AC_LIST_SUBDIRS],
[AC_FATAL(`AC_File' [is already registered with AC_CONFIG_SUBDIRS.])])
AC_CONFIG_IF_MEMBER(AC_File, [AC_LIST_FILES],
[AC_FATAL(`AC_File' [is already registered with AC_CONFIG_FILES or AC_OUTPUT.])])])dnl
])
dnl AC_CONFIG_HEADER(HEADER-TO-CREATE ...)
dnl --------------------------------------
dnl FIXME: For sake of uniformity, it should be AC_CONFIG_HEADERS, and
dnl it should be possible to accumulate several calls.
AC_DEFUN(AC_CONFIG_HEADER,
[define(AC_LIST_HEADERS, $1)])
[AC_CONFIG_UNIQUE([$1])dnl
define(AC_LIST_HEADERS, $1)])
dnl AC_CONFIG_LINKS(DEST:SOURCE...)
@ -2884,13 +2931,12 @@ dnl Specify that config.status should establish a (symbolic if possible)
dnl link from TOP_SRCDIR/SOURCE to TOP_SRCDIR/DEST.
dnl Reject DEST=., because it is makes it hard for ./config.status
dnl to guess the links to establish (`./config.status .').
dnl This macro may be called multiple times.
AC_DEFUN(AC_CONFIG_LINKS,
[ifelse(regexp([$1], [^.:]), -1,,
[AC_FATAL([$0: invalid destination: `.'])])
ifelse(regexp([$1], [ .:]), -1,,
[AC_FATAL([$0: invalid destination: `.'])])
define([AC_LIST_LINKS],
ifdef([AC_LIST_LINKS], [AC_LIST_LINKS ],)[$1])
[AC_CONFIG_UNIQUE([$1])dnl
ifelse(regexp([$1], [^\.:\| \.:]), -1,,
[AC_FATAL([$0: invalid destination: `.'])])dnl
m4_append([AC_LIST_LINKS], [$1])dnl
])
@ -2898,27 +2944,49 @@ dnl AC_LINK_FILES(SOURCE..., DEST...)
dnl ---------------------------------
dnl Link each of the existing files SOURCE... to the corresponding
dnl link name in DEST...
dnl This macro, as AC_CONFIG_FILES, produces no sh code, so we don't
dnl dnl.
AC_DEFUN(AC_LINK_FILES,
[AC_OBSOLETE([$0], [; instead use AC_CONFIG_FILES(DEST:SOURCE...)])
[AC_OBSOLETE([$0], [; instead use AC_CONFIG_LINKS(DEST:SOURCE...)])dnl
ifelse($#, 2, ,
[AC_FATAL([$0: incorrect number of arguments])])
pushdef([AC_Sources], m4_split(m4_strip(m4_join([$1]))))
pushdef([AC_Dests], m4_split(m4_strip(m4_join([$2]))))
[AC_FATAL([$0: incorrect number of arguments])])dnl
dnl
pushdef([AC_Sources], m4_split(m4_strip(m4_join([$1]))))dnl
pushdef([AC_Dests], m4_split(m4_strip(m4_join([$2]))))dnl
dnl
m4_foreach([AC_Dummy], (AC_Sources),
[AC_CONFIG_LINKS(m4_car(AC_Dests):m4_car(AC_Sources))
define([AC_Sources], m4_quote(m4_shift(AC_Sources)))
define([AC_Dests], m4_quote(m4_shift(AC_Dests)))])
[AC_CONFIG_LINKS(m4_car(AC_Dests):m4_car(AC_Sources))
define([AC_Sources], m4_quote(m4_shift(AC_Sources)))
define([AC_Dests], m4_quote(m4_shift(AC_Dests)))])dnl
dnl
popdef([AC_Sources])dnl
popdef([AC_Dests])dnl
])dnl AC_LINK_FILES
dnl AC_CONFIG_FILES(FILE...[, COMMANDS])
dnl ------------------------------------
dnl Specify output files, as with AC_OUTPUT, i.e., files that are
dnl configured with AC_SUBST. Associate the COMMANDS to each FILE,
dnl i.e., when config.status creates FILE, run COMMANDS afterwards.
dnl
dnl The commands are stored in a growing string AC_LIST_FILES_COMMANDS
dnl which should be used like this:
dnl
dnl case $ac_file in
dnl AC_LIST_FILES_COMMANDS
dnl esac
AC_DEFUN([AC_CONFIG_FILES],
[AC_CONFIG_UNIQUE([$1])dnl
m4_append([AC_LIST_FILES], [ $1])dnl
dnl
pushdef([AC_Prefix], [ ])dnl
dnl
ifelse([$2],,, [AC_FOREACH([AC_File], [$1],
[m4_append([AC_LIST_FILES_COMMANDS],
[ ]patsubst(AC_File, [:.*])[ ) $2 ;;
])])])dnl
])dnl
popdef([AC_Sources])
popdef([AC_Dests])
])
define([AC_LIST_LINKS],
ifdef([AC_LIST_LINKS], [AC_LIST_LINKS ],)[$2:$1])])
dnl AC_OUTPUT_COMMANDS(EXTRA-CMDS, INIT-CMDS)
dnl -----------------------------------------
@ -2934,9 +3002,11 @@ AC_DIVERT_PUSH(AC_DIVERSION_ICMDS)dnl
AC_DIVERT_POP()])
dnl AC_CONFIG_SUBDIRS(DIR ...)
dnl --------------------------
AC_DEFUN(AC_CONFIG_SUBDIRS,
[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
define([AC_LIST_SUBDIRS], ifdef([AC_LIST_SUBDIRS], [AC_LIST_SUBDIRS ],)[$1])dnl
[AC_CONFIG_UNIQUE([$1])dnl
AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
m4_append([AC_LIST_SUBDIRS], [$1])dnl
subdirs="AC_LIST_SUBDIRS"
AC_SUBST(subdirs)dnl
])
@ -2949,7 +3019,9 @@ dnl The CONFIG_HEADERS are defined in the m4 variable AC_LIST_HEADERS.
dnl Pay special attention not to have too long here docs: some old
dnl shells die. Unfortunately the limit is not known precisely...
define(AC_OUTPUT,
[trap '' 1 2 15
[dnl Store the CONFIG_FILES
AC_CONFIG_FILES([$1])dnl
trap '' 1 2 15
AC_CACHE_SAVE
trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
@ -2990,8 +3062,8 @@ dnl so uname gets run too.
# configure, is in ./config.log if it exists.
# Files that config.status was made for.
ifset([$1], [config_files="\\
AC_WRAP($1, [ ])"
ifdef([AC_LIST_FILES], [config_files="\\
AC_WRAP(AC_LIST_FILES, [ ])"
])dnl
ifdef([AC_LIST_HEADERS], [config_headers="\\
AC_WRAP(AC_LIST_HEADERS, [ ])"
@ -3013,9 +3085,9 @@ Usage: $CONFIG_STATUS @BKL@OPTIONS@BKR@ FILE...
dnl Issue this section only if there were actually config files.
dnl The following test checks if one of AC_LIST_HEADERS, the CONFIG_FILES
dnl which are given via $[1], or AC_LIST_LINKS is set.
ifset(ifdef([AC_LIST_HEADERS], 1)ifdef([AC_LIST_LINKS], 1)[$1],
ifset(ifdef([AC_LIST_HEADERS], 1)ifdef([AC_LIST_LINKS], 1)ifdef([AC_LIST_FILES], 1),
[Files to instantiate:
ifset($1, [ Configuration files:
ifdef([AC_LIST_FILES], [ Configuration files:
\$config_files
])dnl
ifdef([AC_LIST_HEADERS], [ Configuration headers:
@ -3094,15 +3166,15 @@ EOF
dnl Issue this section only if there were actually config files.
dnl The following test checks if one of AC_LIST_HEADERS, the CONFIG_FILES
dnl which are given via $[1], or AC_LIST_LINKS is set.
ifset(ifdef([AC_LIST_HEADERS], 1)ifdef([AC_LIST_LINKS], 1)[$1],
ifset(ifdef([AC_LIST_HEADERS], 1)ifdef([AC_LIST_LINKS], 1)ifdef([AC_LIST_FILES], 1),
[cat >> $CONFIG_STATUS <<EOF
# If there were arguments, don't assign a default value.
if test \$[#] = 0; then
ifset([$1], [ : \${CONFIG_FILES="\$config_files"}
ifdef([AC_LIST_FILES], [ CONFIG_FILES="\$config_files"
])dnl
ifdef([AC_LIST_HEADERS], [ : \${CONFIG_HEADERS="\$config_headers"}
ifdef([AC_LIST_HEADERS], [ CONFIG_HEADERS="\$config_headers"
])dnl
ifdef([AC_LIST_LINKS], [ : \${CONFIG_LINKS="\$config_links"}
ifdef([AC_LIST_LINKS], [ CONFIG_LINKS="\$config_links"
])dnl
fi
@ -3121,10 +3193,10 @@ dnl documenting into $CONFIG_STATUS.
dnl Because AC_OUTPUT_FILES is in charge of undiverting the AC_SUBST
dnl section, it is better to divert it to void and *call it*, rather
dnl than not calling it at all
ifset([$1],
[AC_OUTPUT_FILES([$1])],
ifdef([AC_LIST_FILES],
[AC_OUTPUT_FILES(AC_LIST_FILES)],
[AC_DIVERT_PUSH(AC_DIVERSION_KILL)dnl
AC_OUTPUT_FILES([$1])dnl
AC_OUTPUT_FILES(AC_LIST_FILES)dnl
AC_DIVERT_POP()])dnl
ifdef([AC_LIST_HEADERS], [AC_OUTPUT_HEADER(AC_LIST_HEADERS)])dnl
ifdef([AC_LIST_LINKS], [AC_OUTPUT_LINKS(AC_LIST_LINKS)])dnl
@ -3146,11 +3218,12 @@ ifdef([AC_LIST_SUBDIRS], [AC_OUTPUT_SUBDIRS(AC_LIST_SUBDIRS)])dnl
])dnl AC_OUTPUT
dnl AC_OUTPUT_MAKE_DEFS()
dnl ---------------------
dnl AC_OUTPUT_MAKE_DEFS
dnl -------------------
dnl Set the DEFS variable to the -D options determined earlier.
dnl This is a subroutine of AC_OUTPUT.
dnl It is called inside configure, outside of config.status.
dnl FIXME: This has to be fixed the same way as in AC_OUTPUT_HEADER.
define(AC_OUTPUT_MAKE_DEFS,
[# Transform confdefs.h into DEFS.
dnl Using a here document instead of a string reduces the quoting nightmare.
@ -3193,6 +3266,11 @@ dnl It has to send itself into $CONFIG_STATUS (eg, via here documents).
dnl Upon exit, no here document shall be opened.
define(AC_OUTPUT_FILES,
[cat >>$CONFIG_STATUS <<EOF
#
# CONFIG_FILES section.
#
# Protect against being on the right side of a sed subst in config.status.
dnl Please, pay attention that this sed code depends a lot on the shape
dnl of the sed commands issued by AC_SUBST. So if you change one, change
@ -3342,11 +3420,19 @@ dnl rm -f $ac_file
dnl mv $ac_cs_root.out $ac_file
dnl fi
mv $ac_cs_root.out $ac_file
ifdef([AC_LIST_FILES_COMMANDS],
[ # Run the commands associated to the file.
case "$ac_file" in
AC_LIST_FILES_COMMANDS[]dnl
esac
])dnl
fi; done
rm -f $ac_cs_root.s*
EOF
])dnl AC_OUTPUT_FILES
dnl AC_OUTPUT_HEADER(HEADER-FILE...)
dnl --------------------------------
dnl Create the config.h files from the config.h.in files.
@ -3357,6 +3443,11 @@ dnl Upon exit, no here document shall be opened.
define(AC_OUTPUT_HEADER,
[cat >>$CONFIG_STATUS <<\EOF
changequote(<<, >>)dnl
#
# CONFIG_HEADER section.
#
# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
# NAME is the cpp macro being defined and VALUE is the value it is being given.
#
@ -3511,6 +3602,10 @@ dnl It has to send itself into $CONFIG_STATUS (eg, via here documents).
dnl Upon exit, no here document shall be opened.
define(AC_OUTPUT_LINKS,
[cat >> $CONFIG_STATUS <<\EOF
#
# CONFIG_LINKS section.
#
srcdir=$ac_given_srcdir
dnl Here we use : instead of .. because if AC_LINK_FILES was used
@ -3550,7 +3645,7 @@ changequote([, ])dnl
changequote(, )dnl
[/$]*) ac_rel_source="$srcdir/$ac_source" ;;
changequote([, ])dnl
*) ac_rel_source="$ac_dots$srcdir/$ac_source" ;;
*) ac_rel_source="$ac_dots$srcdir/$ac_source" ;;
esac
# Make a symlink if possible; otherwise try a hard link.