]> git.ipfire.org Git - thirdparty/autoconf.git/commitdiff
1999-10-31 Akim Demaille <akim@epita.fr>
authorAkim Demaille <akim@epita.fr>
Mon, 20 Dec 1999 12:14:28 +0000 (12:14 +0000)
committerAkim Demaille <akim@epita.fr>
Mon, 20 Dec 1999 12:14:28 +0000 (12:14 +0000)
      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.

ChangeLog
TODO
acgeneral.m4
autoconf.texi
doc/autoconf.texi
lib/autoconf/general.m4

index 014f35b8d46989a5eb38aa9b9a8418f1ee1f1c4e..51e3e9b44069104c5f2d6e34ed3889ff8c3ccc88 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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_
diff --git a/TODO b/TODO
index e6a87b0efb263b2e4b2c4ed340b35400cc122107..c7270803899037b0532daab363c225ff4354bb0b 100644 (file)
--- a/TODO
+++ b/TODO
@@ -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
index d5cea62c93a82e4d75cb1f86b7b97f11edc30571..6d74cd3fe7ae707fa98e30ccc0d7a77e6a10388b 100644 (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])])
+  [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 -----------------------------------------
@@ -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.
index 75fd6185eb2e540f570c1b299034281143e98851..905be4367a2d08e4dd226b0de8215da862f09681 100644 (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
index 75fd6185eb2e540f570c1b299034281143e98851..905be4367a2d08e4dd226b0de8215da862f09681 100644 (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
index d5cea62c93a82e4d75cb1f86b7b97f11edc30571..6d74cd3fe7ae707fa98e30ccc0d7a77e6a10388b 100644 (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])])
+  [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 -----------------------------------------
@@ -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.