autoconf-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 2/2 RFC] Improve handling of missing aux scripts.


From: Zack Weinberg
Subject: [PATCH 2/2 RFC] Improve handling of missing aux scripts.
Date: Sat, 10 Oct 2020 14:00:08 -0400

Another regression identified by the Debian archive rebuild was that
more macros require the presence of config.sub and config.guess now.
‘autoreconf --install’ doesn’t install these itself, it relies on
‘automake --add-missing’ to do that; so, packages that don’t use
Automake will fail at the configure stage after configure is
regenerated.  To make matters worse, AC_CONFIG_AUX_DIRS assumes that
everyone who needs config.sub and config.guess also needs install-sh,
so in about half of the affected packages, the failure manifested as a
complaint about install-sh being missing -- technically true but
adding install-sh wouldn’t have resolved the problem by itself.

We *could* make ‘autoreconf --install’ add config.sub, config.guess,
and install-sh itself when necessary, but then we’d have to ship those
files and we’d have to worry about them being out of sync with
automake’s copies.  And people with hand-written Makefiles might not
realize they need to add them to ‘make dist’, so they would ship
broken tarballs.  I haven’t taken that step yet.

What this patch does do is overhaul the AC_CONFIG_AUX_DIR(S) mechanism
so that a configure script knows the complete set of aux scripts that
were AC_REQUIRE_AUX_FILE’d for it, and checks for the existence of all
of them.  Thus, this configure script

    AC_INIT([test], [1.0])
    AC_FUNC_MALLOC
    AC_CONFIG_HEADERS([config.h])
    AC_OUTPUT

if run in a directory not containing config.guess or config.sub, now
prints an accurate error message

    configure: error: cannot find required auxiliary files: config.guess 
config.sub

instead of the misleading

    configure: error: cannot find install-sh, install.sh, or shtool in "." 
"./.." "./../.."

I also made autoreconf trace AC_REQUIRE_AUX_FILE and detect missing
aux files, so that one gets an error at autoreconf time, where it’s
more likely to be caught by maintainers.  (It is not currently
practical to make autoconf itself issue this error message, because of
how the autoconf wrapper script is different from all the other
wrapper scripts.  Also, autoreconf runs automake *after* autoconf, so
we’d get spurious errors from packages that do use automake.)  And I
documented the expanded need for config.sub and config.guess in NEWS
as well as the manual.

A side-effect: it doesn’t make sense for AC_CONFIG_SUBDIRS to demand
the presence of Cygnus configure in the aux dir, on the off-chance
that one of the subdirectories *might* be using it -- I have no idea
where someone would even get a copy of that nowadays -- so I dropped
that feature.  I rather suspect nobody has needed it in over a decade.

Unlike the previous patch, this one has not been pushed.  I would
appreciate comments on the general approach, and on whether we
_should_ teach autoreconf to install config.sub, config.guess, and/or
install-sh itself.  I would also appreciate someone carefully going
over the M4 quotation in the changed macros, I'm not sure it's right.

zw

* NEWS: Document expanded need for config.sub and config.guess.
  Document removed support for Cygnus configure in subdirectories.

* doc/autoconf.texi: Clarify exactly when install-sh, config.sub,
  and/or config.guess are required.  Document canonical online sources
  for these scripts.  Revise documentation of AC_CONFIG_AUX_DIR and
  AC_REQUIRE_AUX_FILE.  Minor improvements to documentation of
  AC_CONFIG_SRCDIR.  Remove mentions of Cygnus configure in
  subdirectories.

* bin/autoreconf.in (find_missing_aux_files): New sub.
  (autoreconf_current_directory): Trace AC_REQUIRE_AUX_FILE.
  After running all tools that might install aux files, report on
  any that are still missing.

* lib/autoconf/general.m4
  (_AC_INIT_PARSE_ARGS): Remove mention of Cygnus configure;
  clarify function of configure.gnu.
  (AC_CONFIG_AUX_DIR): Support multiple invocations.
  (AC_CONFIG_AUX_DIRS): Now an undocumented compatibility interface
  rather than an internal subroutine; just runs AC_CONFIG_AUX_DIR on
  each of its arguments.
  (AC_CONFIG_AUX_DIR_DEFAULT): Now a backward compatibility stub that
  requires _AC_INIT_AUX_DIR without adding anything to _AC_AUX_FILES.

  (AC_REQUIRE_AUX_FILE): Now adds the named aux file to _AC_AUX_FILES
  and requires _AC_INIT_AUX_DIR, as well as being a trace hook.

  (_AC_INIT_AUX_DIR): New home of the loop searching for necessary aux
  files (formerly in AC_CONFIG_AUX_DIRS).  Looks for all the necessary
  aux files, not just for install-sh.

  (ac_config_guess, ac_config_sub, ac_configure): Issue deprecation
  warnings if these undocumented shell variables are actually used.

  (AC_CANONICAL_BUILD, AC_CANONICAL_HOST, AC_CANONICAL_TARGET):
  No need to require AC_CONFIG_AUX_DIR_DEFAULT.
  Can rely on $ac_aux_dir ending with a slash.

  * lib/autoconf/programs.m4 (AC_PROG_INSTALL, AC_PROG_MKDIR_P):
  No need to require AC_CONFIG_AUX_DIR_DEFAULT.

  * lib/autoconf/status.m4 (_AC_CONFIG_SUBDIRS):
  No need to require AC_CONFIG_AUX_DIR_DEFAULT.
  Remove check for Cygnus configure; clarify function of configure.gnu.

  * lib/autotest/general.m4: Remove mention of Cygnus configure.

  * lib/autom4te.in (Autoreconf-preselections): Add AC_REQUIRE_AUX_FILE.
  Make list order consistent with list order in autoreconf.in.
---
 NEWS                     |  41 +++++++
 bin/autoreconf.in        |  74 ++++++++++++-
 doc/autoconf.texi        | 195 +++++++++++++++++----------------
 lib/autoconf/general.m4  | 228 ++++++++++++++++++++++++++++-----------
 lib/autoconf/programs.m4 |   6 +-
 lib/autoconf/status.m4   |   7 +-
 lib/autom4te.in          |   5 +-
 lib/autotest/general.m4  |   2 -
 8 files changed, 385 insertions(+), 173 deletions(-)

diff --git a/NEWS b/NEWS
index be82eab9..b72b7379 100644
--- a/NEWS
+++ b/NEWS
@@ -47,8 +47,35 @@ GNU Autoconf NEWS - User visible changes.
    - AC_REQUIRE cannot be applied to macros that need to be used with
      arguments.  Instead, invoke the macro normally, with its arguments.
 
+*** More macros use config.sub and config.guess internally.
+
+  As a consequence of improved support for cross compilation (see below),
+  more macros now use the auxiliary scripts ‘config.sub’ and ‘config.guess’.
+  If you use any of the affected macros, these scripts must be available
+  when your configure script is run, even if you have no intention of
+  ever cross-compiling your program.
+
+  autoreconf will issue an error if any auxiliary scripts are needed but
+  cannot be found.  (It is not currently possible to make autoconf
+  itself issue this error.)
+
+  If you are using Automake, the auxiliary scripts your configure script
+  needs will be added to your source tree by ‘autoreconf --install’ or
+  ‘automake --add-missing’, and will be automatically included in your
+  distribution tarball.  If you are not using Automake, you will need
+  to add them yourself.  See the “Input” section of the manual for
+  where to get the auxiliary scripts that may be needed by autoconf macros.
+
 *** Older versions of automake and aclocal (< 1.8) are no longer supported.
 
+*** AC_CONFIG_SUBDIRS no longer directly supports Cygnus configure.
+
+  If you are still using an Autoconf script to drive configuration of
+  a multi-package build tree where some subdirectories use Cygnus
+  configure, copy or link $ac_aux_dir/configure into each subdirectory
+  where it is needed.  Please also contact us; we were under the
+  impression nobody used this very old tool anymore.
+
 *** AC_CHECK_HEADER and AC_CHECK_HEADERS only do a compilation test.
 
   This completes the transition from preprocessor-based header tests
@@ -188,6 +215,20 @@ GNU Autoconf NEWS - User visible changes.
   useful effect is to trigger those checks, with this macro.  It is
   unlikely to be useful otherwise.
 
+*** AC_REQUIRE_AUX_FILE has been improved.
+
+  Configure scripts now check, on startup, for the availability of all
+  the aux files that were mentioned in an AC_REQUIRE_AUX_FILE
+  invocation.  This should help prevent certain classes of packaging
+  errors.
+
+  Also, it is no longer necessary for third-party macros that use
+  AC_REQUIRE_AUX_FILE to mention AC_CONFIG_AUX_DIR_DEFAULT.  However,
+  if you are using AC_CONFIG_AUX_DIR_DEFAULT *without* also using
+  AC_REQUIRE_AUX_FILE, please start using AC_REQUIRE_AUX_FILE to
+  specify the aux files you actually need, so that the check can be
+  effective.
+
 ** Obsolete features and new warnings
 
 *** Use of the long-deprecated name ‘configure.in’ for the autoconf
diff --git a/bin/autoreconf.in b/bin/autoreconf.in
index 2ea917b5..ab80cdc0 100644
--- a/bin/autoreconf.in
+++ b/bin/autoreconf.in
@@ -243,6 +243,49 @@ sub parse_args ()
   verb "export WARNINGS=$ENV{WARNINGS}";
 }
 
+# find_missing_aux_files
+# ----------------------
+# Look in $aux_dir (or, if that is empty, ., .., and ../..) for all of the
+# files in @$aux_files; return a list of those that do not exist.
+sub find_missing_aux_files
+{
+  my ($aux_files, $aux_dir) = @_;
+  my @aux_dirs;
+  if ($aux_dir)
+    {
+      push @aux_dirs, $aux_dir;
+    }
+  else
+    {
+      @aux_dirs = qw(. .. ../..);
+    }
+
+  # If we find all the aux files in _some_ directory in @aux_dirs, we're
+  # good.  But if we don't find all of them in any directory in @aux_dirs,
+  # return the set of missing files from the _first_ directory in @aux_dirs;
+  # this will be less confusing in the common case where AC_CONFIG_AUX_DIR
+  # wasn't used and the parent directories don't provide any aux files.
+  my @missing_aux_files;
+  my @first_missing_aux_files;
+
+  for my $dir (@aux_dirs)
+    {
+      @missing_aux_files = ();
+      for my $file (@{$aux_files})
+        {
+          push @missing_aux_files, $file
+            unless -e "${dir}/${file}";
+        }
+
+      return () if !@missing_aux_files;
+
+      @first_missing_aux_files = @missing_aux_files
+        unless @first_missing_aux_files;
+    }
+
+  return @first_missing_aux_files;
+}
+
 
 # &autoreconf_current_directory
 # -----------------------------
@@ -385,11 +428,12 @@ sub autoreconf_current_directory ($)
 
   # Perform a single trace reading to avoid --force forcing a rerun
   # between two --trace, that's useless.  If there is no AC_INIT, then
-  # we are not interested: it looks like a Cygnus thingy.
+  # it's not an Autoconf script; ignore it.
   # Suppress all warnings from this invocation; they may be spurious
   # due to out-of-date files, and in any case they'll duplicate warnings
   # from the final autoconf invocation.
   my $aux_dir;
+  my @aux_files;
   my $uses_gettext_via_traces;
   my $uses_libtool;
   my $uses_intltool;
@@ -412,14 +456,15 @@ sub autoreconf_current_directory ($)
                'AC_CONFIG_HEADERS',
                'AC_CONFIG_SUBDIRS',
                'AC_INIT',
+               'AC_REQUIRE_AUX_FILE',
                'AC_PROG_LIBTOOL',
                'AM_PROG_LIBTOOL',
                'LT_INIT',
                'LT_CONFIG_LTDL_DIR',
                'AM_GNU_GETTEXT',
                'AM_INIT_AUTOMAKE',
-               'IT_PROG_INTLTOOL',
                'GTK_DOC_CHECK',
+               'IT_PROG_INTLTOOL',
        )
        . ' |');
   }
@@ -428,6 +473,7 @@ sub autoreconf_current_directory ($)
       chomp;
       my ($macro, @args) = split (/::/);
       $aux_dir = $args[0]           if $macro eq "AC_CONFIG_AUX_DIR";
+      push @aux_files, $args[0]     if $macro eq "AC_REQUIRE_AUX_FILE";
       $uses_autoconf = 1            if $macro eq "AC_INIT";
       $uses_gettext_via_traces = 1  if $macro eq "AM_GNU_GETTEXT";
       $uses_libtool = 1             if $macro eq "AC_PROG_LIBTOOL"
@@ -458,9 +504,9 @@ sub autoreconf_current_directory ($)
     }
 
   # Gettext consistency checks...
-  error "$configure_ac: AM_GNU_GETTEXT is used, but not AM_GNU_GETTEXT_VERSION"
+  error $configure_ac, "AM_GNU_GETTEXT is used, but not AM_GNU_GETTEXT_VERSION"
     if $uses_gettext_via_traces && ! $uses_gettext;
-  error "$configure_ac: AM_GNU_GETTEXT_VERSION is used, but not AM_GNU_GETTEXT"
+  error $configure_ac, "AM_GNU_GETTEXT_VERSION is used, but not AM_GNU_GETTEXT"
     if $uses_gettext && ! $uses_gettext_via_traces;
 
 
@@ -616,6 +662,24 @@ sub autoreconf_current_directory ($)
       xsystem ($automake);
     }
 
+  # ---------------------------- #
+  # Checking the aux directory.  #
+  # ---------------------------- #
+  my @missing_aux_files = find_missing_aux_files(\@aux_files, $aux_dir);
+  if (@missing_aux_files)
+    {
+      my $trailer = "";
+      if ($uses_automake || $uses_libtool || $uses_intltool || $uses_gtkdoc)
+        {
+          $trailer = "\n  try running autoreconf --install";
+        }
+
+      for (@missing_aux_files)
+        {
+          error $configure_ac, "required file '$_' not found$trailer";
+          $trailer = "";
+        }
+    }
 
   # -------------- #
   # Running make.  #
@@ -687,6 +751,8 @@ for my $directory (@ARGV)
     autoreconf ($directory);
   }
 
+exit $exit_code;
+
 ### Setup "GNU" style for perl-mode and cperl-mode.
 ## Local Variables:
 ## perl-indent-level: 2
diff --git a/doc/autoconf.texi b/doc/autoconf.texi
index 9f05cee8..9d2bb329 100644
--- a/doc/autoconf.texi
+++ b/doc/autoconf.texi
@@ -2041,81 +2041,27 @@ Notices
 
 
 @node Input
-@section Finding @command{configure} Input
+@section Configure Input: Source Code, Macros, and Auxiliary Files
+
+The following macros help you manage the contents of your source tree.
 
 @anchor{AC_CONFIG_SRCDIR}
 @defmac AC_CONFIG_SRCDIR (@var{unique-file-in-source-dir})
 @acindex{CONFIG_SRCDIR}
-@var{unique-file-in-source-dir} is some file that is in the package's
-source directory; @command{configure} checks for this file's existence to
-make sure that the directory that it is told contains the source code in
-fact does.  Occasionally people accidentally specify the wrong directory
-with @option{--srcdir}; this is a safety check.  @xref{configure
-Invocation}, for more information.
+Distinguish this package's source directory from other source
+directories that might happen to exist in the filesystem.
+@var{unique-file-in-source-dir} should name a file that is unique to
+this package.  @command{configure} will verify that this file exists in
+@file{@var{srcdir}}, before it runs any other checks.
+
+Use of this macro is strongly recommended.  It protects against people
+accidentally specifying the wrong directory with @option{--srcdir}.
+@xref{configure Invocation}, for more information.
 @end defmac
 
-
-@c FIXME: Remove definitively once --install explained.
-@c
-@c Small packages may store all their macros in @code{aclocal.m4}.  As the
-@c set of macros grows, or for maintenance reasons, a maintainer may prefer
-@c to split the macros in several files.  In this case, Autoconf must be
-@c told which files to load, and in which order.
-@c
-@c @defmac AC_INCLUDE (@var{file}@dots{})
-@c @acindex{INCLUDE}
-@c @c FIXME: There is no longer shell globbing.
-@c Read the macro definitions that appear in the listed files.  A list of
-@c space-separated file names or shell globbing patterns is expected.  The
-@c files are read in the order they're listed.
-@c
-@c Because the order of definition of macros is important (only the last
-@c definition of a macro is used), beware that it is @code{AC_INIT} that
-@c loads @file{acsite.m4} and @file{aclocal.m4}.  Note that
-@c @code{AC_INCLUDE}ing a file before @code{AC_INIT} or within
-@c @file{aclocal.m4} is different from doing so after @code{AC_INIT}: in
-@c the latter case, non-macro lines from included files may end up in the
-@c @file{configure} script, whereas in the former case, they'd be discarded
-@c just like any text that appear before @code{AC_INIT}.
-@c @end defmac
-
-Packages that do manual configuration or use the @command{install} program
-might need to tell @command{configure} where to find some other shell
-scripts by calling @code{AC_CONFIG_AUX_DIR}, though the default places
-it looks are correct for most cases.
-
-@defmac AC_CONFIG_AUX_DIR (@var{dir})
-@acindex{CONFIG_AUX_DIR}
-Use the auxiliary build tools (e.g., @file{install-sh},
-@file{config.sub}, @file{config.guess}, Cygnus @command{configure},
-Automake and Libtool scripts, etc.)@: that are in directory @var{dir}.
-These are auxiliary files used in configuration.  @var{dir} can be
-either absolute or relative to @file{@var{srcdir}}.  The default is
-@file{@var{srcdir}} or @file{@var{srcdir}/..} or
-@file{@var{srcdir}/../..}, whichever is the first that contains
-@file{install-sh}.  The other files are not checked for, so that using
-@code{AC_PROG_INSTALL} does not automatically require distributing the
-other auxiliary files.  It checks for @file{install.sh} also, but that
-name is obsolete because some @command{make} have a rule that creates
-@file{install} from it if there is no makefile.
-
-The auxiliary directory is commonly named @file{build-aux}.
-If you need portability to DOS variants, do not name the
-auxiliary directory @file{aux}.  @xref{File System Conventions}.
-@end defmac
-
-@defmac AC_REQUIRE_AUX_FILE (@var{file})
-@acindex{REQUIRE_AUX_FILE}
-Declares that @var{file} is expected in the directory defined above.  In
-Autoconf proper, this macro does nothing: its sole purpose is to be
-traced by third-party tools to produce a list of expected auxiliary
-files.  For instance it is called by macros like @code{AC_PROG_INSTALL}
-(@pxref{Particular Programs}) or @code{AC_CANONICAL_BUILD}
-(@pxref{Canonicalizing}) to register the auxiliary files they need.
-@end defmac
-
-Similarly, packages that use @command{aclocal} should declare where
-local macros can be found using @code{AC_CONFIG_MACRO_DIRS}.
+Packages that use @command{aclocal} to generate @file{aclocal.m4}
+should declare where local macros can be found using
+@code{AC_CONFIG_MACRO_DIRS}.
 
 @defmac AC_CONFIG_MACRO_DIRS (@var{dir1} [@var{dir2} ... @var{dirN}])
 @defmacx AC_CONFIG_MACRO_DIR (@var{dir})
@@ -2158,6 +2104,68 @@ Input
 without any backslash-newlines.
 @end defmac
 
+@prindex @command{config.guess}
+@prindex @command{config.sub}
+@prindex @command{install-sh}
+
+Some Autoconf macros require auxiliary scripts.  @code{AC_PROG_INSTALL}
+and @code{AC_PROG_@w{MKDIR_P}} (@pxref{Particular Programs}) require a
+fallback implementation of @command{install} called @file{install-sh},
+and the @code{AC_CANONICAL} macros (@pxref{Manual Configuration})
+require the system-identification scripts @file{config.sub} and
+@file{config.guess}.  Third-party tools, such as Automake and Libtool,
+may require additional auxiliary scripts.
+
+By default, @command{configure} looks for these scripts next to itself,
+in @file{@var{srcdir}}.  For convenience when working with subdirectories
+with their own configure scripts (@pxref{Subdirectories}), if the
+scripts are not in @file{@var{srcdir}} it will also look in
+@file{@var{srcdir}/..} and @file{@var{srcdir}/../..}.  All of the
+scripts must be found in the same directory.
+
+If these default locations are not adequate, or simply to reduce clutter
+at the top level of the source tree, packages can use
+@code{AC_CONFIG_AUX_DIR} to declare where to look for auxiliary scripts.
+
+@defmac AC_CONFIG_AUX_DIR (@var{dir})
+@acindex{CONFIG_AUX_DIR}
+Look for auxiliary scripts in @var{dir}.  Normally, @var{dir} should be a
+relative path, which is taken as relative to @file{@var{srcdir}}.
+If @var{dir} is an absolute path or contains shell variables, however,
+it is used as-is.
+
+When the goal of using @code{AC_CONFIG_AUX_DIR} is to reduce clutter at
+the top level of the source tree, the conventional name for @var{dir} is
+@file{build-aux}.  If you need portability to DOS variants, do not name
+the auxiliary directory @file{aux}.  @xref{File System Conventions}.
+@end defmac
+
+@defmac AC_REQUIRE_AUX_FILE (@var{file})
+@acindex{REQUIRE_AUX_FILE}
+@vrindex ac_aux_dir
+Declare that @var{file} is an auxiliary script needed by this configure
+script, and set the shell variable @code{ac_aux_dir} to the directory
+where it can be found.  The value of @code{ac_aux_dir} is guaranteed to
+end with a @samp{/}.
+
+Macros that need auxiliary scripts must use this macro to register each
+script they need.
+@end defmac
+
+Some third-party tools can install and update auxiliary scripts in your
+source tree for you; for instance, Automake's @option{--add-missing}
+mode does this for many commonly-needed scripts, including
+@file{install-sh}, @file{config.sub}, and @file{config.guess}.
+If you are only using Autoconf, however, you will need to add auxiliary
+scripts to your source tree yourself, and arrange for them to be
+included in release tarballs.  @command{autoreconf} and
+@command{configure} will both report any missing scripts when run.
+
+The scripts needed by Autoconf core macros are included with the
+Autoconf source tree.  @file{install-sh} can be downloaded from
+@url{https://git.savannah.gnu.org/cgit/automake.git/plain/lib/install-sh}.
+@file{config.sub} and @file{config.guess} can be downloaded from
+@url{https://git.savannah.gnu.org/cgit/config.git/tree/}.
 
 @node Output
 @section Outputting Files
@@ -3759,14 +3767,11 @@ Subdirectories
 fi
 @end example
 
-@c NB: Yes, below we mean configure.in, not configure.ac.
 If a given @var{dir} contains @command{configure.gnu}, it is run instead
 of @command{configure}.  This is for packages that might use a
 non-Autoconf script @command{Configure}, which can't be called through a
 wrapper @command{configure} since it would be the same file on
-case-insensitive file systems.  Likewise, if a @var{dir} contains
-@file{configure.in} but no @command{configure}, the Cygnus
-@command{configure} script found by @code{AC_CONFIG_AUX_DIR} is used.
+case-insensitive file systems.
 
 The subdirectory @command{configure} scripts are given the same command
 line options that were given to this @command{configure} script, with minor
@@ -4098,6 +4103,7 @@ Particular Programs
 @ovindex INSTALL_DATA
 @ovindex INSTALL_SCRIPT
 @caindex path_install
+@prindex @command{install-sh}
 Set output variable @code{INSTALL} to the name of a BSD-compatible
 @command{install} program, if one is found in the current @env{PATH}.
 Otherwise, set @code{INSTALL} to @samp{@var{dir}/install-sh -c},
@@ -4117,14 +4123,15 @@ Particular Programs
 macro requires @command{install} to be able to install multiple files into a
 target directory in a single invocation.
 
-Autoconf comes with a copy of @file{install-sh} that you can use.  If
-you use @code{AC_PROG_INSTALL}, you must include either
+Autoconf comes with a copy of @file{install-sh} that you can use.
+If you use @code{AC_PROG_INSTALL}, you must include either
 @file{install-sh} or @file{install.sh} in your distribution; otherwise
-@command{configure} produces an error message saying it can't find
-them---even if the system you're on has a good @command{install} program.
-This check is a safety measure to prevent you from accidentally leaving
-that file out, which would prevent your package from installing on
-systems that don't have a BSD-compatible @command{install} program.
+@command{autoconf} and @command{configure} produce an error message
+saying it can't find them---even if the system you're on has a good
+@command{install} program.  This check is a safety measure to prevent
+you from accidentally leaving that file out, which would prevent your
+package from installing on systems that don't have a BSD-compatible
+@command{install} program.
 
 If you need to use your own installation program because it has features
 not found in standard @command{install} programs, there is no reason to use
@@ -4139,6 +4146,7 @@ Particular Programs
 @acindex{PROG_MKDIR_P}
 @ovindex MKDIR_P
 @caindex path_mkdir
+@prindex @command{install-sh}
 Set output variable @code{MKDIR_P} to a program that ensures that for
 each argument, a directory named by this argument exists, creating it
 and its parent directories if needed, and without race conditions when
@@ -22002,11 +22010,22 @@ Manual Configuration
 
 A few kinds of features can't be guessed automatically by running test
 programs.  For example, the details of the object-file format, or
-special options that need to be passed to the compiler or linker.  You
-can check for such features using ad-hoc means, such as having
-@command{configure} check the output of the @code{uname} program, or
-looking for libraries that are unique to particular systems.  However,
-Autoconf provides a uniform method for handling unguessable features.
+special options that need to be passed to the compiler or linker.
+Autoconf provides a uniform method for handling unguessable features,
+by giving each operating system a @dfn{canonical system type}, also
+known as a @dfn{canonical name} or @dfn{target triplet}.
+
+@prindex @command{config.guess}
+@prindex @command{config.sub}
+
+If you use any of the macros described in this chapter, you must
+distribute the helper scripts @command{config.guess} and
+@command{config.sub} along with your source code.  Some Autoconf macros
+use these macros internally, so you may need to distribute these scripts
+even if you do not use any of these macros yourself.  @xref{Input}, for
+information about the @code{AC_CONFIG_AUX_DIR} macro which you can use
+to control in which directory @command{configure} looks for helper
+scripts, and where to get the scripts from.
 
 @menu
 * Specifying Target Triplets::  Specifying target triplets
@@ -22137,12 +22156,6 @@ Canonicalizing
 type, run the following macros to get canonical system names.  These
 variables are not set before the macro call.
 
-If you use these macros, you must distribute @command{config.guess} and
-@command{config.sub} along with your source code.  @xref{Output}, for
-information about the @code{AC_CONFIG_AUX_DIR} macro which you can use
-to control in which directory @command{configure} looks for those scripts.
-
-
 @defmac AC_CANONICAL_BUILD
 @acindex{CANONICAL_BUILD}
 @ovindex build
diff --git a/lib/autoconf/general.m4 b/lib/autoconf/general.m4
index eaa1d91b..f10997c2 100644
--- a/lib/autoconf/general.m4
+++ b/lib/autoconf/general.m4
@@ -640,8 +640,6 @@ do
   *)    ac_optarg=yes ;;
   esac
 
-  # Accept the important Cygnus configure options, so we can diagnose typos.
-
   case $ac_dashdash$ac_option in
   --)
     ac_dashdash=yes ;;
@@ -1163,7 +1161,8 @@ if test "$ac_init_help" = "recursive"; then
       continue
     _AC_SRCDIRS(["$ac_dir"])
     cd "$ac_dir" || { ac_status=$?; continue; }
-    # Check for guested configure.
+    # Check for configure.gnu first; this name is used for a wrapper for
+    # Metaconfig's "Configure" on case-insensitive filesystems.
     if test -f "$ac_srcdir/configure.gnu"; then
       echo &&
       $SHELL "$ac_srcdir/configure.gnu" --help=recursive
@@ -1744,60 +1743,174 @@ 
program_transform_name=`AS_ECHO(["$program_transform_name"]) | sed "$ac_script"`
 
 # AC_CONFIG_AUX_DIR(DIR)
 # ----------------------
-# Find install-sh, config.sub, config.guess, and Cygnus configure
-# in directory DIR.  These are auxiliary files used in configuration.
-# DIR can be either absolute or relative to $srcdir.
+# Find auxiliary scripts (e.g. install-sh, config.sub, config.guess)
+# in DIR.  If DIR is a literal shell word and not an absolute path,
+# it is interpreted relative to $srcdir; otherwise it is assumed to be
+# usable as-is.  If this macro is used more than once, it builds up a
+# list of directories to search, first to last.  If this macro is not
+# used at all, the default is to look in $srcdir and two levels of
+# parent directories above $srcdir; see _AC_INIT_SRCDIR.
+#
+# This macro may be used as a trace hook by tools that wish to know
+# where the auxiliary files should be.
+#
+# Note: paths starting with a DOS drive letter count as absolute, but
+# we do *not* check for backslash as a directory separator, because
+# anything with a backslash in it will be considered non-literal by
+# AS_LITERAL_WORD_IF and won't reach the m4_bmatch.  This is correct
+# behavior, because DIR will wind up inside a double-quoted shell string.
 AC_DEFUN([AC_CONFIG_AUX_DIR],
-[AC_CONFIG_AUX_DIRS($1 "$srcdir"/$1)])
+  [m4_append_uniq([_AC_AUX_DIR_CANDIDATES],
+    AS_LITERAL_WORD_IF([$1],
+      [m4_bmatch([$1],
+                 [^/],       [$1],
+                 [^[a-z]:/], [$1],
+                            [${srcdir}/$1])],
+      [$1]),
+    [${PATH_SEPARATOR}])])
+
+
+# AC_CONFIG_AUX_DIRS(DIRS)
+# ------------------------
+# Find auxiliary scripts (e.g. install-sh, config.sub, config.guess)
+# in any of the whitespace-separated directories named DIRS.
+# This macro is not documented; it used to be an internal subroutine,
+# but its name didn't begin with an underscore, so we're preserving it
+# for the small number of configure scripts that used it themselves.
+# It might be promoted to an official interface in the future.
+AC_DEFUN([AC_CONFIG_AUX_DIRS],
+[m4_map_args_w(m4_validate_w([$1]), [AC_CONFIG_AUX_DIR(], [)])])
+
+
+# AC_REQUIRE_AUX_FILE(FILE)
+# -------------------------
+# Declare that FILE is a required auxiliary file.  FILE must be literal.
+# At configure time, if we cannot locate a directory containing all of the
+# required auxiliary files, the script will bomb out.  This macro may also
+# be used as a trace hook by tools that wish to identify all of the required
+# auxiliary files.
+m4_define([AC_REQUIRE_AUX_FILE],
+[AS_LITERAL_WORD_IF([$1],
+  [m4_do(
+    [AC_REQUIRE([_AC_INIT_AUX_DIR])],
+    [m4_set_add([_AC_AUX_FILES], [$1])]
+  )],
+  [m4_fatal([$0: requires a literal argument])])])
 
 
 # AC_CONFIG_AUX_DIR_DEFAULT
 # -------------------------
-# The default is `$srcdir' or `$srcdir/..' or `$srcdir/../..'.
-# There's no need to call this macro explicitly; just AC_REQUIRE it.
+# No longer needed (AC_REQUIRE_AUX_FILE now does the whole job) but
+# preserved for backward compatibility with third-party macros.
+# Not yet being removed by autoupdate, because we don't know if any
+# third-party macros used this without also using AC_REQUIRE_AUX_FILE.
+# That usage is now considered incorrect, but removing it would break
+# those macros.
 AC_DEFUN([AC_CONFIG_AUX_DIR_DEFAULT],
-[AC_CONFIG_AUX_DIRS("$srcdir" "$srcdir/.." "$srcdir/../..")])
+[AC_REQUIRE([_AC_INIT_AUX_DIR])])
 
 
-# AC_CONFIG_AUX_DIRS(DIR ...)
-# ---------------------------
-# Internal subroutine.
-# Search for the configuration auxiliary files in directory list $1.
-# We look only for install-sh, so users of AC_PROG_INSTALL
-# do not automatically need to distribute the other auxiliary files.
-AC_DEFUN([AC_CONFIG_AUX_DIRS],
-[ac_aux_dir=
-for ac_dir in $1
-do
-  if test -f "$ac_dir/install-sh"; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/install-sh -c"
-    break
-  elif test -f "$ac_dir/install.sh"; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/install.sh -c"
-    break
-  elif test -f "$ac_dir/shtool"; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/shtool install -c"
+# _AC_INIT_AUX_DIR
+# ----------------
+# Internal subroutine: AC_REQUIREd by AC_REQUIRE_AUX_FILE and
+# AC_CONFIG_AUX_DIR_DEFAULT.  Emits the shell code that actually
+# searches for the aux directory.  If AC_REQUIRE_AUX_FILE has
+# been used at least once, the aux directory must contain all
+# of the files that were AC_REQUIRE_AUX_FILE'd.  If it was never
+# used, fall back to the old behavior of looking only for install-sh.
+# (This fallback can be removed once we drop AC_CONFIG_AUX_DIR_DEFAULT.)
+AC_DEFUN([_AC_INIT_AUX_DIR],
+[m4_wrap_lifo(
+  [m4_do(
+    [m4_set_empty([_AC_AUX_FILES],
+      [m4_do(
+        [m4_warn([syntax],
+          [AC_CONFIG_AUX_DIR_DEFAULT used without AC_REQUIRE_AUX_FILE])],
+        [m4_set_add([_AC_AUX_FILES], [install-sh])])])],
+  [m4_divert_text([INIT_PREPARE],
+[
+# Auxiliary files required by this configure script.
+ac_aux_files="m4_set_dump([_AC_AUX_FILES], [ ])"
+
+# Locations in which to look for auxiliary files.
+ac_aux_dir_candidates="m4_ifset([_AC_AUX_DIR_CANDIDATES],
+  [m4_defn([_AC_AUX_DIR_CANDIDATES])],
+  [${srcdir}${PATH_SEPARATOR}${srcdir}/..${PATH_SEPARATOR}${srcdir}/../..])"
+
+# Search for a directory containing all of the required auxiliary files,
+# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates.
+# As a special case, if "install-sh" is required, that requirement can be
+# satisfied by any of "install-sh", "install.sh", or "shtool", and
+# $ac_install_sh is set appropriately for whichever one is found.
+_AS_ECHO_LOG([looking for aux files: $ac_aux_files])
+_AS_PATH_WALK([$ac_aux_dir_candidates], [
+  _AS_ECHO_LOG([ trying $as_dir])
+  ac_aux_dir_found=yes
+  ac_install_sh=
+  for ac_aux in $ac_aux_files
+  do
+    if test x"$ac_aux" = x"install-sh"
+    then
+      if test -f "${as_dir}install-sh"; then
+        _AS_ECHO_LOG([  ${as_dir}install-sh found])
+        ac_install_sh="${as_dir}install-sh -c"
+      elif test -f "${as_dir}install.sh"; then
+        _AS_ECHO_LOG([  ${as_dir}install.sh found])
+        ac_install_sh="${as_dir}install.sh -c"
+      elif test -f "${as_dir}shtool"; then
+        _AS_ECHO_LOG([  ${as_dir}shtool found])
+        ac_install_sh="${as_dir}shtool install -c"
+      else
+        ac_aux_dir_found=no
+        break
+      fi
+    else
+      if test -f "${as_dir}$ac_aux"; then
+        _AS_ECHO_LOG([  ${as_dir}$ac_aux found])
+      else
+        ac_aux_dir_found=no
+        break
+      fi
+    fi
+  done
+  if test "$ac_aux_dir_found" = yes; then
+    ac_aux_dir="$as_dir"
     break
   fi
-done
-if test -z "$ac_aux_dir"; then
-  AC_MSG_ERROR([cannot find install-sh, install.sh, or shtool in $1])
-fi
+],
+  [AC_MSG_ERROR([cannot find required auxiliary files: $ac_aux_files])])
 
 # These three variables are undocumented and unsupported,
 # and are intended to be withdrawn in a future Autoconf release.
 # They can cause serious problems if a builder's source tree is in a directory
 # whose full name contains unusual characters.
-ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
-ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
-ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+dnl The quadrigraphs prevent spurious deprecation warnings.
+if test -f "${ac_aux_dir}config.guess"; then
+  ac_@&t@config_guess="$SHELL ${ac_aux_dir}config.guess"
+fi
+if test -f "${ac_aux_dir}config.sub"; then
+  ac_@&t@config_sub="$SHELL ${ac_aux_dir}config.sub"
+fi
+if test -f "$ac_aux_dir/configure"; then
+  ac_@&t@configure="$SHELL ${ac_aux_dir}configure"
+fi
+])])])])
 
-AC_PROVIDE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
-])# AC_CONFIG_AUX_DIRS
+# Deprecation warnings for the unsupported variables above.
+m4_define([ac_config_guess],
+[m4_warn([obsolete],
+ [$ac_config_guess is obsolete and unsafe.  Please stop using it.
+Contact autoconf@gnu.org if you really need it.])ac_@&t@config_guess])
 
+m4_define([ac_config_sub],
+[m4_warn([obsolete],
+ [$ac_config_sub is obsolete and unsafe.  Please stop using it.
+Contact autoconf@gnu.org if you really need it.])ac_@&t@config_sub])
+
+m4_define([ac_configure],
+[m4_warn([obsolete],
+ [$ac_configure is obsolete and unsafe.  Please stop using it.
+Contact autoconf@gnu.org if you really need it.])ac_@&t@config_sub])
 
 
 
@@ -1850,20 +1963,6 @@ AC_DEFUN([AC_CONFIG_MACRO_DIR],
 [_$0S(_$0S_USED()[$0], [$1])])
 
 
-## --------------------- ##
-## Requiring aux files.  ##
-## --------------------- ##
-
-# AC_REQUIRE_AUX_FILE(FILE)
-# -------------------------
-# This macro does nothing, it's a hook to be read with `autoconf --trace'.
-# It announces FILE is required in the auxdir.
-m4_define([AC_REQUIRE_AUX_FILE],
-[AS_LITERAL_WORD_IF([$1], [],
-              [m4_fatal([$0: requires a literal argument])])])
-
-
-
 ## ----------------------------------- ##
 ## Getting the canonical system type.  ##
 ## ----------------------------------- ##
@@ -1904,25 +2003,24 @@ AC_SUBST([$1_os])dnl
 # AC_CANONICAL_BUILD
 # ------------------
 AC_DEFUN_ONCE([AC_CANONICAL_BUILD],
-[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
-AC_REQUIRE_AUX_FILE([config.sub])dnl
+[AC_REQUIRE_AUX_FILE([config.sub])dnl
 AC_REQUIRE_AUX_FILE([config.guess])dnl
 m4_divert_once([HELP_CANON],
 [[
 System types:
   --build=BUILD     configure for building on BUILD [guessed]]])dnl
 # Make sure we can run config.sub.
-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
-  AC_MSG_ERROR([cannot run $SHELL $ac_aux_dir/config.sub])
+$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 ||
+  AC_MSG_ERROR([cannot run $SHELL ${ac_aux_dir}config.sub])
 
 AC_CACHE_CHECK([build system type], [ac_cv_build],
 [ac_build_alias=$build_alias
 test "x$ac_build_alias" = x &&
-  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+  ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"`
 test "x$ac_build_alias" = x &&
   AC_MSG_ERROR([cannot guess build type; you must specify one])
-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
-  AC_MSG_ERROR([$SHELL $ac_aux_dir/config.sub $ac_build_alias failed])
+ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` ||
+  AC_MSG_ERROR([$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed])
 ])
 _AC_CANONICAL_SPLIT(build)
 ])# AC_CANONICAL_BUILD
@@ -1938,8 +2036,8 @@ AC_CACHE_CHECK([host system type], [ac_cv_host],
 [if test "x$host_alias" = x; then
   ac_cv_host=$ac_cv_build
 else
-  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
-    AC_MSG_ERROR([$SHELL $ac_aux_dir/config.sub $host_alias failed])
+  ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` ||
+    AC_MSG_ERROR([$SHELL ${ac_aux_dir}config.sub $host_alias failed])
 fi
 ])
 _AC_CANONICAL_SPLIT([host])
@@ -1957,8 +2055,8 @@ AC_CACHE_CHECK([target system type], [ac_cv_target],
 [if test "x$target_alias" = x; then
   ac_cv_target=$ac_cv_host
 else
-  ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` ||
-    AC_MSG_ERROR([$SHELL $ac_aux_dir/config.sub $target_alias failed])
+  ac_cv_target=`$SHELL "${ac_aux_dir}config.sub" $target_alias` ||
+    AC_MSG_ERROR([$SHELL ${ac_aux_dir}config.sub $target_alias failed])
 fi
 ])
 _AC_CANONICAL_SPLIT([target])
diff --git a/lib/autoconf/programs.m4 b/lib/autoconf/programs.m4
index 86ba3948..a895e59a 100644
--- a/lib/autoconf/programs.m4
+++ b/lib/autoconf/programs.m4
@@ -524,8 +524,7 @@ m4_ifval([$3],
 AN_MAKEVAR([INSTALL], [AC_PROG_INSTALL])
 AN_PROGRAM([install], [AC_PROG_INSTALL])
 AC_DEFUN_ONCE([AC_PROG_INSTALL],
-[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
-AC_REQUIRE_AUX_FILE([install-sh])dnl
+[AC_REQUIRE_AUX_FILE([install-sh])dnl
 # Find a good install program.  We prefer a C program (faster),
 # so one script is as good as another.  But avoid the broken or
 # incompatible versions:
@@ -662,8 +661,7 @@ AC_SUBST(INSTALL_DATA)dnl
 # directories to create.
 AN_MAKEVAR([MKDIR_P], [AC_PROG_MKDIR_P])
 AC_DEFUN_ONCE([AC_PROG_MKDIR_P],
-[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
-AC_REQUIRE_AUX_FILE([install-sh])dnl
+[AC_REQUIRE_AUX_FILE([install-sh])dnl
 AC_MSG_CHECKING([for a race-free mkdir -p])
 if test -z "$MKDIR_P"; then
   AC_CACHE_VAL([ac_cv_path_mkdir],
diff --git a/lib/autoconf/status.m4 b/lib/autoconf/status.m4
index 1389f328..b604368a 100644
--- a/lib/autoconf/status.m4
+++ b/lib/autoconf/status.m4
@@ -1097,7 +1097,6 @@ AC_DEFUN([AC_CONFIG_SUBDIRS],
 [_$0(m4_validate_w([$1]))])
 
 m4_define([_AC_CONFIG_SUBDIRS],
-[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])]dnl
 [AC_REQUIRE([AC_DISABLE_OPTION_CHECKING])]dnl
 [AS_LITERAL_IF([$1], [],
               [m4_warn([syntax], [$0: you should use literals])])]dnl
@@ -1191,14 +1190,12 @@ if test "$no_recursion" != yes; then
 
     cd "$ac_dir"
 
-    # Check for guested configure; otherwise get Cygnus style configure.
+    # Check for configure.gnu first; this name is used for a wrapper for
+    # Metaconfig's "Configure" on case-insensitive filesystems.
     if test -f "$ac_srcdir/configure.gnu"; then
       ac_sub_configure=$ac_srcdir/configure.gnu
     elif test -f "$ac_srcdir/configure"; then
       ac_sub_configure=$ac_srcdir/configure
-    elif test -f "$ac_srcdir/configure.in"; then
-      # This should be Cygnus configure.
-      ac_sub_configure=$ac_aux_dir/configure
     else
       AC_MSG_WARN([no configuration information is in $ac_dir])
       ac_sub_configure=
diff --git a/lib/autom4te.in b/lib/autom4te.in
index 4f1f4799..566c5dca 100644
--- a/lib/autom4te.in
+++ b/lib/autom4te.in
@@ -97,13 +97,14 @@ args: --preselect AC_CONFIG_HEADERS
 args: --preselect AC_CONFIG_MACRO_DIR_TRACE
 args: --preselect AC_CONFIG_SUBDIRS
 args: --preselect AC_INIT
+args: --preselect AC_REQUIRE_AUX_FILE
 args: --preselect AC_PROG_LIBTOOL
 args: --preselect AM_PROG_LIBTOOL
-args: --preselect GTK_DOC_CHECK
-args: --preselect IT_PROG_INTLTOOL
 args: --preselect LT_INIT
 args: --preselect LT_CONFIG_LTDL_DIR
 args: --preselect AM_GNU_GETTEXT
+args: --preselect GTK_DOC_CHECK
+args: --preselect IT_PROG_INTLTOOL
 end-language: "Autoreconf-preselections"
 
 
diff --git a/lib/autotest/general.m4 b/lib/autotest/general.m4
index 6a6d1a47..f29ce490 100644
--- a/lib/autotest/general.m4
+++ b/lib/autotest/general.m4
@@ -479,8 +479,6 @@ do
   *)    at_optarg= ;;
   esac
 
-  # Accept the important Cygnus configure options, so we can diagnose typos.
-
   case $at_option in
     --help | -h )
        at_help_p=:
-- 
2.28.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]