+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_
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.
** 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
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])
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 ------------------------------------------------------------
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...)
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
])
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])])
+ [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)))])dnl
+dnl
+popdef([AC_Sources])dnl
+popdef([AC_Dests])dnl
+])dnl AC_LINK_FILES
-pushdef([AC_Sources], m4_split(m4_strip(m4_join([$1]))))
-pushdef([AC_Dests], m4_split(m4_strip(m4_join([$2]))))
-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)))])
+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 -----------------------------------------
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
])
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
# 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, [ ])"
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:
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
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
])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.
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
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.
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.
#
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
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.
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
@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
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
(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
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
@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
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
(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
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])
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 ------------------------------------------------------------
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...)
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
])
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])])
+ [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)))])dnl
+dnl
+popdef([AC_Sources])dnl
+popdef([AC_Dests])dnl
+])dnl AC_LINK_FILES
-pushdef([AC_Sources], m4_split(m4_strip(m4_join([$1]))))
-pushdef([AC_Dests], m4_split(m4_strip(m4_join([$2]))))
-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)))])
+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 -----------------------------------------
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
])
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
# 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, [ ])"
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:
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
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
])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.
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
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.
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.
#
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
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.