Commit Graph

6753 Commits

Author SHA1 Message Date
Ross Burton
2a94d5b154
autoreconf: remove redundant xsystem calls
xsystem_hint() executes the command, so there's no need to call xsystem()
afterwards.

* bin/autoreconf.in: No need to call xsystem($cmd) immediately after
  calling xsystem_hint("message", $cmd).
2020-10-14 20:33:19 -04:00
Zack Weinberg
b0d20c049b
autoreconf: cope with empty AC_CONFIG_SUBDIRS (bug 110331)
Commit 41edf99f95 made all Perl warnings
fatal.  This caused autoreconf to crash on packages that call
AC_CONFIG_SUBDIRS with no arguments. They probably shouldn’t do that,
but we shouldn’t crash if they do.

Problem reported by Ross Burton.

* bin/autoreconf.in (autoreconf_current_directory):
  Convert undef to '' before attempting to split it.
* tests/torture.at (Empty AC_CONFIG_SUBDIRS): New test.
2020-10-14 20:22:41 -04:00
Paul Eggert
3cdc910d22 doc: improve AS_CASE, AS_IF doc
See the thread containing:
https://lists.gnu.org/r/bug-gnulib/2020-10/msg00033.html
* doc/autoconf.texi: Distinguish between Solaris 10 and later.
(Balancing Parentheses): Mention the Posix syntax for ‘case’,
typically a better solution nowadays.
(AS_CASE, AS_IF): Mention AC_REQUIRE, portability, parens.
(Prerequisite Macros): Tighten up example and make it less dated.
Say that AS_CASE and AS_IF are not needed outside macros.
* NEWS: Don’t mention AS_FOR.  It’s not documented, and for
good reason since it is so ... quirky.
2020-10-11 23:56:26 -07:00
Zack Weinberg
d85fc04ed3
_AS_PATH_WALK: Use AS_IF for IF-NOT-FOUND argument.
The construct _AS_PATH_WALK was using to conditionally execute its
IF-NOT-FOUND argument, was a little too fragile: relatively natural
variations in usage, such as putting the final `])` on a line by
itself, could cause shell syntax errors.  Use AS_IF instead.

* lib/m4sugar/m4sh.m4: Use AS_IF to execute IF-NOT-FOUND conditionally.
2020-10-10 14:07:53 -04:00
Zack Weinberg
326c9a5474
Fix regressions when using the C++ compiler to perform tests.
The Debian project has done an archive rebuild using autoconf 2.69c,
which found several serious regressions from 2.69 where test programs
used to be accepted by a C++ compiler, but are now rejected.  Part of
the problem is that newer C++ compilers are more likely to reject
“traditional” sloppy C, but part of it is that bug fixes since 2.69
did not consider the possibility of test macros being used with
AC_LANG([C++]) in effect.

I’m still working on test suite improvements that will catch these
regressions in the future, but I don’t see any reason to delay the
actual bugfixes.  (I’ve gotten far enough on the test suite changes
that I know they _will_ catch the bugs.)

* NEWS: Document that AC_FUNC_STRERROR_R no longer tries to detect a
  strerror_r that exists in the C library but isn’t declared by string.h.

* lib/autoconf/c.m4
  (AC_LANG_CALL(C++)): New macro.  Use a more robust technique for
  avoiding a type conflict with any intrinsic prototype.
  (AC_LANG_CALL(C)): Remove #ifdef __cplusplus, this macro is no longer
  used to generate C++ code.

* lib/autoconf/functions.m4
  (AC_FUNC_CLOSEDIR_VOID): Rely on <dirent.h> to declare closedir.
  Simplify test program.  Use AC_COMPILE_IFELSE, not AC_RUN_IFELSE.
  (_AC_FUNC_MALLOC_IF, _AC_FUNC_REALLOC_IF): Use void *, not char *,
  for variable holding a value returned by malloc/realloc respectively.
  (AC_FUNC_STRERROR_R): Don’t AC_CHECK_FUNCS_ONCE strerror_r.
  AC_DEFINE HAVE_STRERROR_R if and only if we are also going to define
  HAVE_DECL_STRERROR_R.  Remove AC_RUN_IFELSE fallback when strerror_r
  is not declared.

* lib/autoconf/headers.m4 (AC_USG): Use "", not 0, for the first
  argument to rindex.
2020-10-10 11:23:09 -04:00
Zack Weinberg
09346f1a77
Don’t issue obsoletion warnings for AC_DIAGNOSE.
AC_DIAGNOSE is used in several extremely popular add-on macros,
notably AM_INIT_AUTOMAKE, AM_GNU_GETTEXT, and AC_LIBTOOL_DLOPEN.
Until newer versions of these macros are available, -Wobsolete
warnings for AC_DIAGNOSE will be unhelpful noise.

Therefore, make it so AC_DIAGNOSE(...) will still be replaced with
m4_warn(...) by autoupdate, but autoconf runs will not complain about
AC_DIAGNOSE.  The bulk of the patch is augmenting AU_DEFUN so that it
can define a “silent” autoupdate replacement, and documenting the new
feature.

* lib/autoconf/autoupdate.m4 (AU_DEFUN): Add a fourth argument, SILENT,
  which must be either empty or the word ‘silent’.  If it is ‘silent’,
  the macro being defined will *not* issue a -Wobsolete warning when
  expanded by autoconf.
  Tweak quotation to prevent emacs’ parenthesis matching from getting
  confused.
  (AU_ALIAS): Add the SILENT argument here as well.

* lib/autoconf/general.m4 (AC_DIAGNOSE): Define as a silent AU_DEFUN.
  Add commentary explaining why this was done and when it can be
  changed back.

* doc/autoconf.texi (AU_DEFUN, AU_ALIAS): Revise; document new SILENT
  argument.
2020-10-07 09:18:33 -04:00
Zack Weinberg
1b52a8609b
NEWS: Mention more bug fixes. 2020-10-05 16:22:25 -04:00
Zack Weinberg
04d14ad18a
Reorganize 2.70 NEWS
The changes are now classified into “backward incompatibilities”,
“new features”, “obsolete features and new warnings”,
“notable bug fixes”, and “autotest enhancements”.

Also make the warning about argument-quotation bugs more prominent
and explicit.  (See for instance Savannah bug 110319.)
2020-09-26 13:40:23 -04:00
Zack Weinberg
730f382a92
mktmpdir: Ensure that $tmp is always an absolute pathname.
Several autotools programs use ‘do’ to evaluate Perl code
generated into a file in the temporary directory created by
Autom4te::General::mktmpdir.  If the environment variable
TMPDIR is a relative path, mktmpdir will set $tmp to a
relative path and we’ll end up trying to ‘do’ a relative
path, which searches for the file in @INC.  This doesn’t
work under perl 5.26 or later, because ‘.’ was removed
from @INC in that version (for security reasons).

Ensure that mktmpdir sets $tmp to an absolute pathname.
Also use File::Temp::tempdir to create the temporary
directory, instead of shelling out to ‘mktemp -d’;
this eliminates a subprocess and means we don’t have
to worry about cleaning up the directory on exit.

Problem found by Kent Fredric and reported as
<https://bugs.gentoo.org/625576>.
Supersedes Gentoo’s autoconf-2.69-perl-5.26-2.patch.

* lib/Autom4te/General.pm
  (mktmpdir): Use File::Temp to create temporary directory.
  Ensure that $tmp is an absolute path.
  (END): No need to clean up $tmp.

* tests/tools.at (autotools and relative TMPDIR): New test.
2020-09-24 16:06:23 -04:00
Zack Weinberg
be818a3b94
tests/mktests.sh: fix awk syntax error.
I forgot that you can’t start an awk action block on the next line
from its condition.
2020-09-24 09:13:16 -04:00
Zack Weinberg
62deff7336
build-aux/fetch.pl: Fetch ChannelDefs.pm from automake. 2020-09-24 08:55:28 -04:00
Zack Weinberg
119beb0325
Autoupdate AC_{DIAGNOSE,FATAL,OBSOLETE,WARNING} and _AC_COMPUTE_INT.
While working on the previous patches I noticed that all of these
macros are officially obsolete, but autoupdate doesn’t replace them.

_AC_COMPUTE_INT is easy to autoupdate.  AC_{DIAGNOSE,FATAL,WARNING}
require a little special handling because their replacements are
m4sugar macros, and autoupdate normally expands m4sugar macros as it
goes.  Fortunately, the same workaround as is used for AC_FOREACH can
be applied.  AC_OBSOLETE also needs that workaround, and cannot be
fully replaced automatically.

The bulk of the patch is removing internal uses of AC_DIAGNOSE.

* lib/autoconf/autoupdate.m4
* lib/autoconf/c.m4
* lib/autoconf/functions.m4
* lib/autoconf/general.m4
* lib/autoconf/headers.m4
* lib/autoconf/lang.m4
* lib/autoconf/status.m4
* lib/autoconf/types.m4
* tests/local.at
* tests/tools.at:
  Use, and/or refer to, m4_warn instead of AC_DIAGNOSE.

* lib/autoconf/general.m4 (_AC_COMPUTE_INT): Define using AU_DEFUN.
  (AC_DIAGNOSE, AC_FATAL, AC_WARNING): Autoupdate to m4_warn,
  m4_fatal, and m4_warn([syntax], [$1]) respectively, using the same
  paired AU_DEFUN/AC_DEFUN trick that is used for AC_FOREACH.
  (AC_OBSOLETE): Autoupdate to m4_warn([obsolete], [$1]) and advise
  hand-conversion to AU_DEFUN.

* lib/autoconf/autoupdate.m4 (AU_DEFUN): Tweak quoting so m4_warn([$3])
  is emitted into the edited configure.ac instead of being expanded at
  autoupdate time.

* tests/tools.at (autoupdating AC_FOREACH): Adjust grep expressions.
  (autoupdating AC_DIAGNOSE and AC_WARNING): New test.
  (autoupdating AC_FATAL): New test.
  (autoupdating AC_OBSOLETE): New test.
* tests/mktests.sh (ac_exclude_list, au_exclude_list):
  Exclude AC_DIAGNOSE, AC_FATAL, AC_FOREACH, AC_OBSOLETE, and AC_WARNING
  if not already excluded.
2020-09-22 15:46:44 -04:00
Zack Weinberg
8cb3442318
Update documentation related to warnings.
This makes the Texinfo documentation consistent with the previous
changes.  --help output regarding warnings is already drawn directly
from ChannelDefs.pm and thus does not need to be updated.

* doc/autoconf.texi: Update all ‘invocation’ sections to describe
  -W/--warnings consistently, and to refer to m4_warn for the list
  of categories.
  (m4_warn): Document the complete current list of categories.
  (Reporting Messages): Delete section.
  (AC_DIAGNOSE, AC_WARNING, AC_FATAL): Move to Obsolete Macros.
2020-09-22 15:46:44 -04:00
Zack Weinberg
edcb0925a5
Use WARNINGS to pass down warnings options from autoreconf.
autoreconf runs a bunch of subsidiary tools, and is expected to pass
along various command-line settings, such as those controlling
warnings.  It has historically done this via the command line.
However, not all of the tools recognize the same set of command-line
warnings options.  There’s an existing check for whether aclocal and
automake understand ‘--warnings’ at all, but it currently assumes that
automake will accept the same set of warnings *categories* that
autoconf does.  This hasn’t actually been true for many years
and is known to cause problems; see the discussion starting at
<https://lists.gnu.org/archive/html/autoconf/2020-09/msg00000.html>.

Previous patches in this series (and related patches applied to
automake) have restored agreement between the current development
trunks of the two sets of tools on the set of warnings categories, but
we still need to deal with the possibility of the *installed* tools
not being in agreement.

If we use the WARNINGS environment variable to pass down warnings
options, instead of the command line, then all the tools are already
coded to ignore unknown warning categories, and this ceases to be an
issue.  And we no longer need the check for ‘--warnings’ support in
automake, either.

Also, autoreconf as well should suppress warnings from its first
invocation of autoconf, which is for tracing purposes only and may
emit spurious warnings because aclocal.m4 is not yet in place.

* bin/autoreconf.in
  ($aclocal_supports_warnings, $automake_supports_warnings): Delete.
  (@warning): Make local to sub parse_args.
  (parse_args): Do not add --warnings options to $autoconf,
  $autoheader, $aclocal, or $automake.  Instead, set $ENV{WARNINGS}
  appropriately.  No longer necessary to probe for --warnings support
  from aclocal and automake.
  (autoreconf_current_directory): Set $ENV{WARNINGS} temporarily to
  “none” when running autoconf in trace mode.  Fix typo in comment.
  Close $traces immediately after we’re done with it.

* tests/torture.at (Specific warnings options for autoreconf):
  New test.
2020-09-22 15:46:44 -04:00
Zack Weinberg
218cc1e492
Disable all warnings when running autoconf as a subprocess.
autoheader and autoscan both run autoconf in trace mode, and
autoheader makes a point of passing down the warnings options.
This means autoheader prints warnings that a regular invocation
of autoconf would also print, so in the common case where both
are being run by autoreconf, the warnings are duplicated.
autoscan doesn’t pass down warnings options but it _does_ leave
the WARNINGS environment variable alone, which means it may issue
completely spurious warnings because the configure script is still
under construction.

Change this so that both programs disable all warnings for the
subsidiary invocation of autoconf, by not passing any warnings
options themselves, and by setting the WARNINGS environment variable
to “none” for the subprocess.  For this to work correctly, the
‘args: --warnings syntax’ line has to be removed from autom4te.cfg
(m4sugar section).  Since syntax warnings are on by default anyway,
the sole effect of this is to allow WARNINGS=none to turn off syntax
warnings.

The test suite changes are all to remove expectations of duplicate
diagnostics from autoheader.

* bin/autoheader.in: Do not pass warnings options down to subsidiary
  autoconf, and set WARNINGS=none in the environment for that process.
* bin/autoscan.in: Set WARNINGS=none in the environment for subsidiary
  autoconf.
* lib/autom4te.in (M4sugar): Remove ‘--warnings syntax’.
* tests/semantics.at, tests/torture.at: No longer expect various
  diagnostics from autoheader as well as autoconf.
2020-09-22 15:46:43 -04:00
Zack Weinberg
53f18e7889
New utility function Autom4te::ChannelDefs::merge_WARNINGS.
This function merges a list of warnings categories into the environment
variable WARNINGS, returning a new value to set it to.  The intended use
is in code of the form

{
  local $ENV{WARNINGS} = merge_WARNINGS ("this", "that");

  # run a command here with WARNINGS=this,that,etc
}

This is not used yet, but will be in the next patch.

* lib/Autom4te/ChannelDefs.pm (merge_WARNINGS): New function.
2020-09-22 15:46:42 -04:00
Zack Weinberg
1d4b7c049e
Manually sync ChannelDefs.pm from automake.
ChannelDefs.pm *ought* to be kept in sync between automake and autoconf,
because it defines the set of valid -W options, and autoreconf assumes
that it can pass arbitrary -W options to all of the tools it invokes.
However, it isn’t covered by either project’s ‘make fetch’ and it hasn’t
actually *been* in sync for more than 17 years.

This patch manually brings over all of the changes made on the
automake side.  Once the complementary patch is applied by the
automake team, both versions of the file will be the same, and then we
can add it to the list in fetch.pl and not have this problem any more
in the future.

There are some user-visible consequences to bringing this file back
into sync.  The only one worth mentioning in NEWS is that the ‘obsolete’
category of warnings is now on by default.  This had quite a bit of
fallout throughout the testsuite.  There are also some new warning
categories that get mentioned in --help output, but we don’t actually
generate any warnings in those categories, so people using ‘-Wall’
won’t see any change.  More diagnostics are automatically tagged with
‘warning:’ or ‘error:’, which also had some fallout in the testsuite.
Finally, ‘-Werror’ no longer causes complaints about unknown warning
categories to be treated as hard errors.

Internally, there are some small API changes: ‘parse_warnings’ is no
longer usable as a ‘getopt’ callback function, and we now have a stub
Autom4te/Config.pm to match the automake code’s expectations.  (This
file *should* also be synced from automake by ‘make fetch’, but we
can’t quite do that yet because it’s a generated file and our build
system is not prepared to handle adding *two* directories to @INC when
running a not-yet-installed Perl script.  I plan to fix that after 2.70.)

As a side-effect of adding a Config.pm, ‘prog_error’ now says to
report the bug to bug-autoconf, not bug-automake.  If this is why we
mostly haven’t been using prog_error for internal errors, we can stop
avoiding it.  (I did not change anything to use prog_error in this
patch.)

* lib/Autom4te/ChannelDefs.pm: Merge from automake.
* lib/Autom4te/Config.pm: New file.
* lib/local.mk (dist_perllib_DATA): Add Autom4te/Config.pm.

* bin/autoconf.as: Update list of warning categories to match
  Autom4te::ChannelDefs::usage.
* bin/autoheader.in (@warnings): New global.
  (parse_args): Don’t use parse_warnings as a getopt callback.
  (main): Add warnings options from our command line to $autoconf.
  No need to turn on 'obsolete' warnings explicitly.
  No need to include "warning: " in warning messages.
* bin/autom4te.in (parse_args): Don’t use parse_warnings as a getopt callback.
  (main): No need to include "warning: " in warning messages.
* bin/autoreconf.in (parse_args): parse_warnings now takes only one argument.
* bin/autoupdate.in: Set WARNINGS=none in environment for all child processes.

* tests/local.at
  (AT_CHECK_M4): Handle `autom4te: error: /usr/bin/m4 ...` like
  `autom4te: /usr/bin/m4 ...`.
  (_AT_CHECK_AC_MACRO): Add AUTOCONF-FLAGS argument, passed to both
  autoconf and autoheader.
  (AT_CHECK_MACRO): Default AUTOCONF-FLAGS argument to empty.
  Pass that argument to autoheader as well as autoconf.
  (AT_CHECK_AU_MACRO): Expect a “macro ‘NAME’ is obsolete’ diagnostic
  on the first run of autoconf.  Pass -Wno-obsolete to autoconf on the
  second run, and to autoheader on both runs.

* tests/base.at
* tests/c.at
* tests/compile.at
* tests/m4sh.at
* tests/m4sugar.at
* tests/semantics.at
* tests/tools.at
* tests/torture.at:
  No need to pass -Wobsolete to autoconf.
  Pass -Wno-obsolete to autoheader where needed to avoid handling
  the same warning twice.
  Update various expectations for diagnostics to match behavior
  changes.

* tests/tools.at (autoupdating AU_ALIAS): Add an AC_CONFIG_HEADERS
  line to the test configure.ac to eliminate an unrelated diagnostic.
2020-09-22 15:46:42 -04:00
Jonathan Wakely
8285f302a9
doc: Fix cross-reference for AC_TRY_LINK
The documentation for AC_TRY_LINK has a cross-reference to "Running
the Compiler".  This should be "Running the Linker" instead.  Also
make the link in AC_TRY_LINK_FUNC consistent.
2020-09-22 15:45:10 -04:00
Zack Weinberg
f1dd88da01
bin/autoconf.as: Fix --help.
Commit 9b5c0f1774 introduced a bug where
autoconf --help would only print “Try 'autoconf --help' for more information.”
Correct this.

* bin/autoconf.as: Print $help, not $usage_err, for --help.
  Consistently use AS_ECHO, not bare echo.
2020-09-22 15:35:41 -04:00
Zack Weinberg
904d8e72e5
Consistently use ‘our’ instead of ‘use vars’ in Perl.
At file scope of a file containing at most one ‘package’ declaration,
‘use vars’ is exactly equivalent to ‘our’, and the latter is preferred
starting with Perl 5.6.0, which happens to be the oldest version we
support.

In one place ‘our’ was not actually necessary and was switched to ‘my’.

(This change has already been made in Automake and applied to the
shared Perl code via the previous ‘make fetch’ commit.)

* lib/Autom4te/C4che.pm
* lib/Autom4te/ChannelDefs.pm
* lib/Autom4te/General.pm: Replace all uses of ‘use vars’ with ‘our’.
* bin/autoheader.in: Replace all uses of ‘use vars’ with ‘our’.
  Remove an unnecessary ‘local’.
* bin/autoscan.in: Convert ‘use vars’ variables to ‘my’ variables.
2020-09-21 14:33:52 -04:00
Zack Weinberg
f48d5cee1c
make fetch yet again 2020-09-21 14:26:17 -04:00
Bruno Haible
c1f55d8f0a
doc: Mention two more shell portability problems.
* doc/autoconf.texi (File Descriptors): Mention a problem of Solaris 10.
Mention that a known problem also occurs in dash.
2020-09-18 09:22:10 -04:00
Zack Weinberg
9b8e746a49
make fetch 2020-09-11 16:11:43 -04:00
Zack Weinberg
c7e63de526
Fetch more files from their official upstream.
‘make fetch’ was updating several auxiliary files from the copy
embedded in Gnulib instead of from their official home.  This patch
teaches fetch.pl to update as many as possible of them from their
official homes.  The remaining exception is GNU license files, which,
except for fdl.texi, do not appear to have a public version control
system.  Gnulib has a script for updating them, but it appears one
must be logged into some specific FSF-operated shell host for it to
work.

The files affected, and their official homes, are:

  build-aux/install-sh    automake
  build-aux/mdate-sh      automake
  build-aux/config.guess  config
  build-aux/config.sub    config
  doc/fdl.texi            gnustandards
  doc/gnu-oids.texi       gnustandards
  doc/make-stds.texi      gnustandards
  doc/standards.texi      gnustandards
  doc/texinfo.tex         texinfo

This change exposed a bug in fetch.sh: there is a subtle difference
between File::Spec->catpath and ->catfile and I should have been using
the latter.

* build-aux/fetch.pl: Can now fetch from arbitrary Savannah
  repositories, not just from gnulib and automake.  Fetch as
  many files as possible from their official home, instead of
  from gnulib.  Use File::Spec->catfile, not ->catpath.
  Strip trailing whitespace from all files.
2020-09-11 16:00:39 -04:00
Zack Weinberg
93270f112e
Rewrite fetch.sh in Perl.
Using HTTP::Tiny to talk to the network, instead of wget, means that
we can make just one TCP connection to git.savannah.gnu.org to do the
whole job, which is quite a bit faster.  It should also be more
robust against weird characters in filenames / URLs and stuff.

The script has a higher requirement for Perl than is the standard in
autoconf -- 5.14 (first version with HTTP::Tiny), with IO::Socket::SSL
installed -- but that’s ok, I hope, because it’s maintainer-only and
not installed.

fetch.sh was the sole user of move-if-change, and the Perl script does
that job itself, but I left move-if-change in build-aux and on the fetch
list anyway, in case we discover another use for it in the future.

* build-aux/fetch.sh: Replace with...
* build-aux/fetch.pl: ... reimplementation in Perl.
* cfg.mk (fetch): Update to match.
2020-09-11 14:51:00 -04:00
Zack Weinberg
b560f0a657
AC_PROG_*CPP: Try ‘cpp’ before ‘/lib/cpp’
All of the AC_PROG_*CPP macros fall back to ‘/lib/cpp’ if invoking the
relevant compiler with ‘-E’ doesn’t work.  This is an obsolete
location to find the C preprocessor.  Linux distributions tend to ship
a compatibility symlink, as do Solaris and AIX (as of the versions in the
GCC compile farm, anyway), but the BSDs no longer do.

The tests for this fallback are already expecting ‘cpp’ to be a
command findable via $PATH, so make the probe macros do the same
thing.  (We still try ‘/lib/cpp’ if ‘cpp’ _isn’t_ in $PATH.)

* lib/autoconf/c.m4
  (AC_PROG_CPP, AC_PROG_CXXCPP, AC_PROG_OBJCPP, AC_PROG_OBJCXXCPP):
  If $CC / $CXX / $OBJC / $OBJCXX -E (respectively) does not run the
  preprocessor, look for ‘cpp’ in $PATH before falling back to ‘/lib/cpp’.

* doc/autoconf.texi
  (AC_PROG_CPP, AC_PROG_CXXCPP, AC_PROG_OBJCPP, AC_PROG_OBJCXXCPP):
  Update to match.
2020-09-10 12:10:41 -04:00
Zack Weinberg
14265094af
make fetch 2020-09-03 12:08:31 -04:00
Zack Weinberg
92148f61ad
Add Configure_ac.pm to set of files to be synced from automake.
This file seems to have been accidentally left off of the list of .pm
files that should be kept the same between automake and autom4te.
It’s already almost identical in both codebases.

It would make sense to sync ChannelDefs.pm too, but the copies of that
file in the two codebases have diverged; they would need to be
reconciled by hand first.

* build-aux/fetch.sh (automake_files): Add lib/Automake/Configure_ac.pm.
2020-09-03 12:04:58 -04:00
Zack Weinberg
8af9e92c91
Fetch gnulib files from gitweb.
‘make fetch’ pulls the files maintained by Automake from gitweb, so we
always get the HEAD revision at the time of the operation.  The files
maintained by Gnulib, on the other hand, are just copied from whatever
local gnulib checkout you happen to have on your hard drive at the
time, which might not have been updated recently and might not even be
checked out from gnulib trunk.

This patch makes us use the same logic for Gnulib that we do for
Automake.  It also pulls all of the code out of cfg.mk to a separate
shell script.  The lists of files to update from each repository are
also moved to that file.

 * build-aux/fetch.sh: New script.  Lists of files to fetch from
   Gnulib and Automake are now kept here.
 * cfg.mk (fetch): Run fetch.sh, it does all the work.
   (gnulib-update, autom4te-update, WGETFLAGS, automake_gitweb)
   (autom4te_files, move_if_change): Delete.
2020-09-03 11:40:50 -04:00
Zack Weinberg
41edf99f95
Fatalize all warnings in Perl code.
Search-and-replace change ‘use warnings;’ to ‘use warnings FATAL => 'all';’
in all Perl code.

Notwithstanding the dire cautions in ‘perldoc warnings’ about this,
I think it’s the right call for us.  One file was already doing it.
No new testsuite failures are observed on Linux with Perl 5.30.3
nor on NetBSD with Perl 5.6.1.

* bin/autoheader.in, bin/autom4te.in, bin/autoreconf.in
* bin/autoscan.in, bin/autoupdate.in, bin/ifnames.in
* lib/Autom4te/C4che.pm, lib/Autom4te/ChannelDefs.pm
* lib/Autom4te/Channels.pm, lib/Autom4te/Configure_ac.pm
* lib/Autom4te/FileUtils.pm, lib/Autom4te/General.pm
* lib/Autom4te/Request.pm, lib/Autom4te/XFile.pm:
  Make all warnings from the Perl interpreter into fatal errors.
2020-08-31 13:15:46 -04:00
Zack Weinberg
c14739e7c6
Autom4te::XFile: Remove unnecessary imports.
Autom4te::XFile does not appear to have any use for Carp, DynaLoader,
or File::Basename.

This happened to catch my eye while I was doing the previous two
patches.  I have not done a comprehensive audit of imports in the Perl
code.

* lib/Autom4te/XFile.pm: Remove ‘use’s of Carp, DynaLoader,
  and File::Basename.
  (@ISA): Remove DynaLoader.
2020-08-31 13:15:45 -04:00
Zack Weinberg
6d5e6ba904
Rationalize ‘use’ order in Perl code.
All the Perl scripts and modules now ‘use’ other modules in the
following order:

 - use 5.006; use strict; use warnings; in that order.
   If a file was not already use-ing one of these three, it was added.

 - The BEGIN block that adds the installation directory for the
   Autom4te:: modules to @INC, if necessary.

 - All stdlib modules whose name begins with a capital letter,
   in ASCII sort order.

 - All Autom4te:: modules, in ASCII sort order.

 - ‘use vars qw (...)’, if any, last.

Also, ‘use foo qw (...)’ and @ISA lists have been sorted into ASCII
sort order.  (@EXPORT lists, which often follow immediately after @ISA
lists, have *not* been sorted, as these appear to have been organized
semantically in many cases.)  qw delimiters have been normalized to
round parentheses with a space between the qw and the open paren.

* bin/autoheader.in, bin/autom4te.in, bin/autoreconf.in
* bin/autoscan.in, bin/autoupdate.in, bin/ifnames.in
* lib/Autom4te/C4che.pm, lib/Autom4te/ChannelDefs.pm
* lib/Autom4te/Channels.pm, lib/Autom4te/Configure_ac.pm
* lib/Autom4te/FileUtils.pm, lib/Autom4te/General.pm
* lib/Autom4te/Getopt.pm, lib/Autom4te/Request.pm
* lib/Autom4te/XFile.pm: Rationalize order and format of ‘use’
  directives and @ISA lists.  Add any of ‘use 5.006’, ‘use strict’,
  and ‘use warnings’ that was not already present.
2020-08-31 13:15:45 -04:00
Serhii Popovych
17c048d859
perl: Replace -w option in shebangs with ‘use warnings’ in code
Some downstream redistributors for Autoconf wish to use
‘/usr/bin/env perl’ as the #! line for the installed Perl scripts.
This does not work with command-line options on the #! line, as the
kernel doesn’t support supplying more than one argument to a #!
interpreter (this limitation is universal across Unixes that
support #!, as far as I know).

Remove ‘-w’ from all perl #! lines and instead add ‘use warnings’
to all the scripts and .pm files that didn’t already have it.
This ‘use’ directive was added to Perl in version 5.6.0 (aka 5.006)
so there is no change to our minimum Perl requirement.

(It is necessary to add ‘use warnings’ to all the .pm files as well as
the scripts, because the ‘-w’ command-line option turns on warnings
globally, but ‘use warnings’ does so only for the current lexical scope.)

Patch uplifted from OpenEmbedded, originally by Serhii Popovych.
It’s a mechanical search-and-replace change so I do not believe a
copyright assignment is necessary.

* bin/autom4te.in, bin/autoreconf.in, bin/autoscan.in
* bin/autoupdate.in, bin/ifnames.in: Remove -w from #! line
  and add ‘use warnings’ to imports.

* lib/Autom4te/C4che.pm, lib/Autom4te/ChannelDefs.pm
* lib/Autom4te/Channels.pm, lib/Autom4te/Configure_ac.pm
* lib/Autom4te/FileUtils.pm, lib/Autom4te/General.pm
* lib/Autom4te/Request.pm, lib/Autom4te/XFile.pm:
  Add ‘use warnings’ to imports.
2020-08-31 13:11:46 -04:00
Zack Weinberg
77153965c6
BUGS: Remove mention of old shells lacking functions.
The change to require shell functions in configure scripts happened
circa 2009, well before the release of autoconf 2.69; if this was
causing problems for people we would have heard about it by now.
2020-08-28 16:44:59 -04:00
Zack Weinberg
87a81f44c6
Fix testsuite failures from ‘make maintainer-check-c++’.
‘make maintainer-check-c++’ has two test failures that don’t show in
an ordinary ‘make check’.  One of these is a pair of problems with the
semantics.at test of AC_CHECK_DECL(S):

 * AC_CHECK_DECL cannot handle a function argument whose declared type
   is ‘char []’; it generates a cast to the array type, which is
   invalid in both C and C++.  This was masked by an M4 quotation bug,
   causing it to emit a cast to ‘char’ instead, prodicing code that
   was valid C but invalid C++.  I don’t think it’s practical to teach
   AC_CHECK_DECL to do argument type decay, so I changed the type
   signature in the AC_CHECK_DECL call (not in the actual declaration)
   to ‘char *’.  Conveniently this also avoids the quotation issue.

 * In C++, apparently ‘extern struct { int x; } foo;’ is invalid.
   (clang++ explains at length: “variable ‘foo’ is used but not
   defined in this translation unit, and cannot be defined in any
   other translation unit because its type does not have linkage.”)
   Fixed by giving the struct a tag.

The other failure is an actual bug in AC_PROG_LEX: the test program
used by _AC_PROG_LEX_YYTEXT_DECL uses the flex utility function
‘input’, which is renamed to ‘yyinput’ when the scanner is compiled as
C++.  Fixed with ifdefs in the offending action--it might seem cleaner
to use a macro defined in a %{ %} block, but that would be inserted into
the skeleton *above* the declaration of (yy)input, so I didn’t feel
it was safe.

* tests/semantics.at (AC_CHECK_DECLS): Adjust test programs for C++
  compatibility and to work around lack of support for argument type
  decay.

* programs.m4 (_AC_PROG_LEX_YYTEXT_DECL): Call yyinput(), not input(),
  in scanner action when scanner is compiled as C++.
2020-08-28 16:42:28 -04:00
Zack Weinberg
a2a6641c52
Suppress ‘make syntax-check’ complaint about use of strcmp.
Recently ‘make syntax-check’ added a lint rule discouraging use of
bare ‘strcmp’ (in favor of gnulib’s streq/strneq wrappers), which
triggers on some code in c.m4’s test for C++98 compliance.

This lint rule makes sense for typical C programs coded to GNU’s
standards, but not for autoconf’s test programs.  There is no way to
disable it from outside the code, so this patch adds parentheses
around the name ‘strcmp’, which is sufficient to disable this
grep-based lint but doesn’t change the meaning of the code as
understood by an actual C++ compiler.

* c.m4 (_AC_CXX_CXX98_TEST_HEADER): Suppress ‘make syntax-check’
  error on use of strcmp.
2020-08-28 13:59:05 -04:00
Zack Weinberg
845302b9b6
AS_INIT: ensure fds 0, 1, 2 are open
A patch was recently proposed for GNU libc to make *all* processes
start up with file descriptors 0, 1, and 2 guaranteed to be open.
Part of the rationale for this patch was that configure scripts fail
catastrophically if these fds are closed, even if you just want to run
--help or --version, e.g.

   $ ./configure --version <&-; echo $?
   ./configure: line 555: 0: Bad file descriptor
   1

configure scripts cannot rely on behavior specific to GNU libc, so
whether or not that patch gets committed, it makes sense for us to
make configure scripts robust against being started up with closed
stdin/stdout/stderr.

This patch adds code to ensure fds 0, 1, and 2 are open, early in
_AS_SHELL_SANITIZE.  It uses a construct, ‘(exec 3>&n)’, that’s known
not to work in very old shells, but that’s OK because those shells
will be rejected by _AS_DETECT_BETTER_SHELL anyway.  The worst-case
scenario is that the “This script requires a shell more modern than
all the shells I found on your system” error message won’t get printed.

When these fds are found not to be open, we open them on /dev/null, in
the normal I/O direction (0 for reading, 1 and 2 for writing).  There
is a case for opening them in the *opposite* direction so that, for
instance, writes to fd 1 will fail when fd 1 started out closed.
However, that would expose latent bugs that I think should be dealt
with *after* 2.70.  (See Savannah bug #110300 for more detail.)

I also took the opportunity to rationalize the order of operations in
_AS_SHELL_SANITIZE a little.  All the special shell and environment
variables that we care about are dealt with immediately after
AS_BOURNE_COMPATIBLE, and _AS_PATH_SEPARATOR_PREPARE happens
immediately before the first use of _AS_PATH_WALK.

* lib/m4sugar/m4sh.m4 (_AS_ENSURE_STANDARD_FDS): New macro.
  (_AS_SHELL_SANITIZE): Move the “Unset variables that we do not need”
  and “NLS nuisances” blocks immediately after setting IFS; merge the
  unsetting of CDPATH into the main unsetting loop; move invocation of
  _AS_PATH_SEPARATOR_PREPARE to immediately above the “Find who we are”
  block; invoke _AS_ENSURE_STANDARD_FDS immediately before
  _AS_PATH_SEPARATOR_PREPARE.

* tests/base.at (configure with closed standard fds): New test.
* tests/torture.at (--help and --version in unwritable directory): New test.
2020-08-28 11:19:16 -04:00
Zack Weinberg
f783dd434a
Add ‘START_TIME’ and ‘ToD’ to shell variable filter list.
NetBSD sh has invented more magic shell variables with values related
to the current time: ‘START_TIME’ and ‘ToD’.  Like ‘SECONDS’, these
can cause spurious testsuite failures and should be filtered out when
checking for undesirable changes to the environment.

* tests/local.at (_AT_CHECK_ENV, AT_CONFIG_CMP): Add shell variables
  START_TIME and ToD to filter list.
2020-08-26 15:15:34 -04:00
Zack Weinberg
c42dd55ddd
Pass $(MAKE) down to testsuite.
If Make is not available under the command name ‘make’, only some
other name (e.g. ‘gmake’) then the test suite’s internal invocations
of Make will all fail unless you explicitly set MAKE=<the other name>
in the environment, which is obnoxious.  Pass the value of $(MAKE)
down to the testsuite so that ‘gmake check’ Just Works.

 * tests/local.mk (run_testsuite): Append MAKE=$(MAKE).
2020-08-26 15:12:12 -04:00
Zack Weinberg
88e0d39a46
Add NetBSD /bin/sh to the -n whitelist.
NetBSD’s /bin/sh sets a special variable “NETBSD_SHELL” to identify
itself.  This means we can whitelist it as not having a buggy -n
implementation.

 * configure.ac: Assume -n mode works in shells that have a preset
 variable named NETBSD_SHELL.
2020-08-26 15:08:26 -04:00
Paul Eggert
df1866fd0c * lib/autoconf/types.m4: Say "Microsoft" before "Windows". 2020-08-23 19:27:56 -07:00
Bruno Haible
da4c468de9 AC_TYPE_PID_T: Define pid_t correctly on 64-bit native Windows.
Reported at <https://savannah.gnu.org/support/index.php?110296>.

* lib/autoconf/types.m4 (AC_TYPE_PID_T): Define pid_t to '__int64' on 64-bit
native Windows, and to 'int' otherwise.
2020-08-23 19:27:56 -07:00
Zack Weinberg
9b5c0f1774
Generate manpages directly from source code.
We generate manpages for autoconf’s installed programs (autoconf,
autoheader, etc.) using help2man, which runs each program in order to
learn its --help output.  Each manpage therefore has a dependency on
the existence of the corresponding program, but this dependency is
intentionally left out of the Makefile so that one can build from a
tarball release (which will include prebuilt manpages) without having
help2man installed.

But when building from a git checkout with high levels of
parallelism (-j20 or so), the missing dependency can lead to build
failures, because help2man will try to run the program before it
exists.  In an earlier patch I tried to work around this with a
recursive make invocation in the ‘.x.1’ rule, to ensure the existence
of the program.  That only traded one concurrency bug for another, now
we could have two jobs trying to build the same program simultaneously
and they would clobber each other’s work and the build would still
fail.

Instead, this patch introduces a utility script ‘help-extract.pl’ that
reads --help and --version information directly from the source code
for each program.  This utility, wrapped appropriately for each
program, is what help2man now runs.  Usage is a little weird because
help2man doesn’t let you specify any arguments to the “executable”
that it runs, but it works, and lets us write all of the true
dependencies of each manpage into the Makefile without naming any file
that would be created during a build from a tarball.  help-extract.pl
is a Perl script, so it introduces no new build-time requirements.

A downside is that we have to make sure each of the script sources in
bin/, and also part of lib/Autom4te/ChannelDefs.pm, are parseable by
help-extract.  The most important constraints are that the text output
by --help must be defined in a global variable named ‘help’, and its
definition has to be formatted just the way these definitions are
currently formatted.  Similarly for --version.  Furthermore, only some
non-literal substitutions are possible in these texts; each has to be
explicitly supported in help-extract.pl.  The current list of supported
substitutions is $0, @PACKAGE_NAME@, @VERSION@, @RELEASE_YEAR@, and
Autom4te::ChannelDefs::usage.

The generated manpages themselves are character-for-character
identical before and after this patch.

 * build-aux/help-extract.pl: New build script that extracts --help
  and --version output from manpages.

 * man/autoconf.w, man/autoheader.w, man/autom4te.w, man/autoreconf.w
 * man/autoscan.w, man/autoupdate.w, man/ifnames.w: New shell scripts
   which wrap build-aux/help-extract.pl.

 * man/local.mk: Generate each manpage by running help2man on the
   corresponding .w script, not on the built utility itself.
   Revise all dependencies to match.

 * bin/autoconf.as: Rename ‘usage’ variable to ‘help’ and
   ‘help’ variable to ‘usage_err’.
 * bin/autoheader.in: Call Autom4te::ChannelDefs::usage with no
   function-call parentheses, matching all the other scripts.
 * bin/autom4te.in: Initialize $version with a regular double-quoted
   string, not a heredoc, matching all the other scripts.
 * bin/autoscan.in: Remove global variable $configure_scan.
2020-08-21 16:23:32 -04:00
Zack Weinberg
acf6fb022b
Fix ‘make distcheck’ failure due to generated manpages in build dir.
If we are doing a VPATH build and we generate the manpages,
they will be written to the build directory, and should be
deleted by ‘make distclean’; ‘make distcheck’ fails if this
is not done.  However, if we are doing a build in the source
directory, the manpages might have been shipped to us and we
should *not* delete them in ‘make distclean’.

Correction to 5d3c99e562.

* man/local.mk (distclean-local-man): New rule.  Delete $(dist_man_MANS)
  in VPATH builds only.
  (MOSTLYCLEANFILES, .x.1): Don’t use globs to decide what to delete.
2020-08-21 13:53:18 -04:00
Zack Weinberg
1a5ed45669
tests: New helper macro AT_CHECK_MAKE.
This macro factors out some repeated code surrounding tests that run
make, such as honoring $MAKE, *not* honoring $MAKEFLAGS, and
normalizing the exit status.  Partially addresses bug #110267
(problems with Sun’s make barfing on GNU make options from
$MAKEFLAGS).

Also addresses some unrelated problems I noticed while changing all
the tests that run make to use this macro:

The shtool test is now properly skipped if shtool is not available on
the host system.

Some of the Fortran tests would create an executable and then run it,
others would create an executable and then the AT_CHECK operation that
would run it was commented out.  There’s no evidence in the changelog
or the git history for why this was done.  I uncommented all of the
commented-out cases; this can be undone easily if it causes
problems.  (It can’t be an issue with cross-compilation because some
of the tests do run the executable.)

* tests/local.at (AT_CHECK_MAKE): New macro wrapping an AT_CHECK
  invocation of make.  All tests that run make updated to use this macro.
* tests/fortran.at: Uncomment all AT_CHECKs that run the just-compiled
  program.
* tests/foreign.at (shtool): Skip the test if shtool is not available
  from the host system.  Simplify shell logic.
2020-08-20 14:07:59 -04:00
Zack Weinberg
6c2d3e8edc
Properly skip erlang tests when erl/erlc are not available.
Fallout from the previous change, which I should’ve tested on a
machine without Erlang tools installed, before pushing.

It bugs me a little that we have to put these special exit codes into
autoconf itself instead of the testsuite, but it is what it is.

 * lib/autoconf/erlang.m4 (AC_ERLANG_NEED_ERLC, AC_ERLANG_NEED_ERL):
 Exit with code 77 on failure so testsuite understands to skip Erlang
 tests in this case.
 (AC_ERLANG_CHECK_LIB): Use AC_ERLANG_NEED_ERLC and AC_ERLANG_NEED_ERL
 instead of the _PATH_ versions.
2020-08-20 13:18:42 -04:00
Zack Weinberg
5fd2e37e46
tests/suite.at: m4_include acerlang.at.
This corrects a long-standing oversight; the “blind” tests for the
Erlang macros have never actually gotten run.
2020-08-20 08:51:46 -04:00
Zack Weinberg
fa0754f704
_AC_COMPILER_EXEEXT_CROSS: exit 77 if test program does not run
This causes our testsuite to report a skipped test, rather than a
failure, if the detected compiler for _AC_LANG produces broken
executables.  It matches the behavior of _AC_COMPILER_EXEEXT_DEFAULT,
which has exited with that code for a long time if it hits the
“_AC_LANG compiler cannot *create* executables” failure case.

Partially addresses bug #110267.  The Solaris 10 machine I have access
to, has a broken gccgo installation that generates executables that
crash on startup.   Without this patch, test “358: Go” fails.  With
this patch, it is skipped.
2020-08-18 16:47:42 -04:00
Zack Weinberg
5d3c99e562
Generate manpages in build directory.
It is not necessary to generate the manpages in the source directory
during a split build; ‘make dist’ can still find them in the build
directory and put them in the tarball.

Also add some defensive logic to the .x.1 rule to ensure that
bin/command and tests/command exist before generating man/command.1.
Without this, if you do a sufficiently parallel build, help2man may
generate the manpage from an older installed copy of ‘command’.
(Ideally, we wouldn’t have to run ‘command’ at all and this would not
be an issue, but ‘help2man’ doesn’t appear to support that.)

After this patch, the only files written to the source directory
during the ‘make’ phase of a split build (starting from a clean Git
checkout) are

doc/version.texi
doc/stamp-vti
doc/autoconf.info
doc/standards.info

These are not under our control, they’re being created by automake’s
built-in rules for Texinfo documentation.

* man/local.mk: Replace all instances of $(mansrcdir) with literal ‘man’.
  (.x.1): Ensure that bin/command, tests/command, and the man
  directory exist before creating man/command.1.
2020-08-18 16:32:33 -04:00
Zack Weinberg
924ba17398
Delete a dummy ChangeLog in ‘make distclean’.
‘make distcheck’ from git may create a dummy ChangeLog file in the
build directory.  Delete this on ‘make distclean’, but don’t delete
a real ChangeLog (generated by the gen-ChangeLog rule).

* Makefile.am (distclean-local): Delete ChangeLog if it is the dummy
  created to pacify automake.
2020-08-18 15:09:49 -04:00