summaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* Add a note to NEWS about ac_cv_header_stdlib_h not being set...v2.69eZack Weinberg2020-12-011-0/+3
| | | | ... even though HAVE_STDLIB_H is.
* Make autoreconf --force --install overwrite existing files (#110371)Zack Weinberg2020-11-302-6/+102
| | | | | | | | | | | | | | | | | | | | | | | | | | | The new feature of autoreconf --install installing config.guess, config.sub, and install-sh itself didn’t implement --force mode correctly; existing files would not be overwritten. The fix has two parts. If --force is in effect, we try to install everything that we can from the needed-auxfiles list *before* checking which of them already exist. But also, we don’t overwrite existing files unconditionally, even with --force; we only do so if the file we can install has a newer “timestamp” line than the copy at the destination. This is because Automake can also install all of the files we can install. Suppose someone is using autoconf 2.70 with a newly released automake 1.17; automake 1.17 will presumably ship with a newer config.guess than autoconf 2.70 did; that version should win. Fixes bug #110371. * bin/autoreconf.in (extract_time_stamp, our_aux_file_is_newer): New functions. (install_aux_file): If the destination exists, and our copy is not newer, do not overwrite it. (autoreconf_current_directory): When $force is true, attempt to install all needed aux files *before* scanning for missing aux files. (throughout): Remove extra \n from various error messages. * tests/torture.at (Missing auxiliary files (--force)): New test.
* Add more release notes about compatibility problems.Zack Weinberg2020-11-301-0/+32
| | | | | See https://savannah.gnu.org/support/?110382 and https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97998 for background.
* AT_CHECK_MACRO: test C++ as well as C, cross as well as nativeZack Weinberg2020-11-306-167/+777
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Many of the reported regressions in Autoconf 2.70 betas went unnoticed for years because Autoconf’s bundled test suite didn’t test most of the macros with a C++ compiler and/or in cross compilation mode. There’s a special makefile target ‘maintainer-check-c++’ that runs all the tests with CC=g++, but that doesn’t catch the regressions either, because it doesn’t compare the configure results with what you’d have gotten with a C compiler. Also, C and C++ have diverged to the point where setting CC to a C++ compiler doesn’t work reliably anymore. This patch overhauls AT_CHECK_MACRO to test each macro four times: (C compiler, C++ compiler) x (native mode, cross-compilation mode). All four tests are expected to produce the same config.cache and config.h, except for certain predictable differences due to running AC_PROG_CXX instead of AC_PROG_CC, and a short list of known, acceptable differences, maintained in mktests.pl. There are two classes of known, acceptable differences. Macros that use AC_RUN_IFELSE aren’t tested in cross-compilation mode at all, because they may crash the script (this is temporary and will be revisited after 2.70). Macros that correctly detect a difference between C and C++ (e.g. AC_HEADER_STDBOOL will notice that C++ doesn’t have the _Bool type) are annotated with the specific cache variable and #define that varies. mktests.pl now also has the capability to provide values for the MACRO-USE, ADDITIONAL-COMMANDS, and AUTOCONF-FLAGS arguments to AT_CHECK_(AU_)MACRO, on a per-macro basis, but that’s not used in this patch. Some of the manual uses of AT_CHECK_MACRO do not need to test C++ and/or cross compilation; for them, there is a new test helper, AT_CHECK_CONFIGURE_AC. Another new helper, AT_PRESERVE_CONFIG_STATUS, is used extensively in AT_CHECK_(AU_)MACRO but may be also useful in manual tests that need to do multiple configure runs. This change supersedes AT_CHECK_MACRO_CROSS and ‘make maintainer-check-c++’, which are removed. In my testing, setting CC to a C++ compiler no longer works at all, for reasons that are impractical to fix (e.g. C++ compilers choke on the test for C2011 features) so I have added a note to NEWS saying that this is not supported anymore. * tests/local.at (AT_CHECK_MACRO): Default behavior is now to test the macro in both native and cross-compilation mode, and expect the results to be identical. If the macro transitively required AC_PROG_CC, and a C++ compiler is available, then test it twice more with AC_LANG([C++]) in effect, and again expect the results to be identical. New fifth argument TEST-PARAMETERS can modify this behavior. (_AT_FILTER_CXX_CV_VARIES, _AT_FILTER_CXX_DEFINE_VARIES): New, subroutines of AT_CHECK_MACRO. (AT_CHECK_MACRO_CROSS): Remove, subsumed by new AT_CHECK_MACRO behavior. (AT_CHECK_AU_MACRO): Forward to AT_CHECK_MACRO for the basic test; then do the same autoupdate test as before, as a separate test group. (at_check_env): Also ignore OPENMP_CXXFLAGS. (AT_CONFIG_CMP): Add third argument EXTRA-VARIANCE that specifies additional variables that are expected to vary in a particular test. (_AT_CONFIG_CMP_PRUNE): New, subroutine of AT_CONFIG_CMP. (AT_DEFINES_CMP): New helper macro that compares config.h headers, with the ability to ignore variation in specific defines. (_AT_DEFINES_CMP_PRUNE): New, subroutine of AT_DEFINES_CMP. (AT_PRESERVE_CONFIG_STATUS): New helper that makes copies of config.h, config.log, config.status, and state-env.after under names that won’t be clobbered by a subsequent run of configure. (AT_CHECK_CONFIGURE_AC): New helper that defines a complete test group consisting of a single invocation of _AT_CHECK_AC_MACRO; effectively what AT_CHECK_MACRO used to be. (_AT_CHECK_AC_MACRO): Correct documentation comment; the PRE-TESTS argument has always been optional. * tests/mktests.pl (test_parameters): New global data object giving extra arguments to pass to AT_CHECK_MACRO/AT_CHECK_AU_MACRO on a per-macro basis. (emit_test): New function that handles emitting calls to AT_CHECK_(AU_)MACRO with the desired arguments. (scan_m4_files): Use emit_test. (au_exclude_list): Add AC_HAVE_LIBRARY, AC_COMPILE_CHECK, AC_TRY_CPP, AC_TRY_COMPILE, AC_TRY_LINK, and AC_TRY_RUN. * tests/semantics.at (AC_CHECK_LIB, AC_SEARCH_LIBS): Rewrite test using symbols from zlib instead of libm, to get consistent behavior from C and C++. (AC_SEARCH_LIBS (none needed)): Revise to clarify what is being tested. (AC_CHECK_DECLS): Use _AC_LANG_ABBREV when inspecting cache variables. (AC_CHECK_ALIGNOF, AC_CHECK_ALIGNOF struct) (AC_CHECK_SIZEOF, AC_CHECK_SIZEOF struct) No need for AT_CHECK_MACRO_CROSS. (AC_CHECK_FILES): Switch to AT_CHECK_CONFIGURE_AC. (AC_SYS_RESTARTABLE_SYSCALLS, AC_FUNC_WAIT3): Do not test in cross compilation mode. (AC_TRY_CPP, AC_TRY_COMPILE, AC_TRY_LINK, AC_TRY_RUN) (AC_COMPILE_CHECK, AC_HAVE_LIBRARY): New manual AT_CHECK_AU_MACRO tests. * tests/c.at (Extensions, C keywords, AC_PROG_CPP requires AC_PROG_CC) (AC_NO_EXECUTABLES (working linker), AC_NO_EXECUTABLES (broken linker)): Switch to AT_CHECK_CONFIGURE_AC. Also convert case statements to AS_CASE. (Broken/missing compilers): Pass CC=no-such-compiler on the command line instead of hardwiring it in the configure script. * tests/local.mk (maintainer-check-c++): Remove target. (maintainer-check): Run the ordinary ‘make check’ as well as ‘make maintainer-check-posix’.
* Rewrite mktests.sh in Perl.Zack Weinberg2020-11-303-254/+310
| | | | | | | | | | | | | | | | This is probably marginally faster since it doesn’t have to read the .m4 files twice or muck around with temporary files and subprocesses, but the actual point of this rewrite is that it will make it easier to provide additional arguments to AT_CHECK_MACRO and AT_CHECK_AU_MACRO on a per-macro basis; this capability will be added and used in the next patch. In *this* patch, the ac*.at files are not functionally changed at all. (The comments come out slightly differently, though.) * tests/mktests.sh: Delete and... * tests/mktests.pl: ...rewrite in Perl. * tests/local.mk: Update to match.
* Overhaul Erlang support.Zack Weinberg2020-11-304-148/+84
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Erlang is similar to Java in that it doesn’t compile to standalone machine code; the output of ‘erlc’ is byte-code files that are then interpreted by ‘erl’. We handle this poorly in a whole bunch of ways, particularly when cross-compiling. This patch fixes up the more serious problems: - AC_COMPILE_IFELSE now actually works when AC_LANG([Erlang]) is in effect. - ‘conftest.beam’ is now deleted in several more places where it could be created. - The various AC_ERLANG_* macros that interrogate the runtime environment do so by invoking ‘$ERL’ directly, rather than using AC_RUN_IFELSE, and thus do not crash the configure script when we think we’re cross-compiling. (It is not clear to me whether they get the correct answer when cross-compiling, but this should still be strictly an improvement.) - The Erlang-related tests have been streamlined. Further improvements are definitely possible, but we’d have to teach the infrastructure to make $ac_objext language-specific first, which seems like too big of a change for 2.70. (This patch is all fallout from a logically unrelated testsuite change which is coming up next. Gotta love the fundamental interconnectedness of things.) * lib/autoconf/general.m4 (_AC_COMPILE_IFELSE_BODY) (_AC_LINK_IFELSE_BODY): Delete conftest.beam as well as conftest.$ac_objext. * lib/autoconf/erlang.m4 (AC_ERLANG_PATH_ERLC, AC_ERLANG_PATH_ERL): Don’t repeat work done by AC_PATH_TOOL. (Erlang $ac_compile): Fake an .o file so AC_TRY_COMPILE will be happy. (AC_LANG_COMPILER(Erlang)): AC_REQUIRE AC_ERLANG_NEED_ERLC, not AC_ERLANG_PATH_ERLC. Also AC_REQUIRE AC_ERLANG_NEED_ERL so AC_RUN_IFELSE works reliably. (AC_ERLANG_CHECK_LIB, AC_ERLANG_SUBST_ROOT_DIR) (AC_ERLANG_SUBST_LIB_DIR, AC_ERLANG_SUBST_ERTS_VER): Use $ERL -eval, not AC_RUN_IFELSE. No need to AC_REQUIRE AC_ERLANG_NEED_ERLC. * tests/erlang.at: Don’t test anything here that’s tested adequately by acerlang.at; document which macros those are expected to be. Remove unnecessary AC_ERLANG_PATH_ERL/ERLC invocations throughout. (AT_CHECK_MACRO([Erlang])): Rename test to ‘Erlang basic compilation’; expect both AC_COMPILE_IFELSE and AC_RUN_IFELSE to work; handle cross compilation mode properly. * tests/mktests.sh: Exclude from acerlang.at all macros completely covered by erlang.at.
* Make “redefining AS_ECHO internals” test more robust.Zack Weinberg2020-11-301-4/+14
| | | | | | | | | M4-redefining ‘printf’ as ‘echo’ brings back all the variations in ‘echo’ behavior that we were trying to get away from by switching to ‘printf’ in the first place. This caused a spurious failure on AIX. * tests/m4sh.at (Redefining AS_ECHO internals): Redefine ‘printf’ as a shell function with fully predictable output, not as ‘echo’.
* torture.at: Insulate more tests from buggy third-party m4 files.Zack Weinberg2020-11-301-6/+16
| | | | | | | | | | | All tests that run autoreconf need to defend against the possibility of aclocal not existing and/or barfing on bugs in third-party m4 files installed on the build system. Two of the “Missing auxiliary files” tests were missing this defensive code. * tests/torture.at (Missing auxiliary files (install-sh)) (Missing auxiliary files (foreign)): Prevent autoreconf from running aclocal.
* Avoid ‘new File::Temp’ in Perl scripts.Zack Weinberg2020-11-302-16/+9
| | | | | | | | | | Despite what the documentation says, ‘new File::Temp’ does not work reliably in perl 5.6.x. Rather than figure out exactly what is wrong with it, let’s just stick to ‘tempfile’. * bin/autom4te.in (handle_output): Use tempfile function instead of object-oriented File::Temp interface. * bin/autoreconf.in (install_aux_file): Likewise.
* Disentangle HAVE__BOOL from ac_cv_header_stdbool_h.Zack Weinberg2020-11-301-45/+89
| | | | | | | | | | | | | | | | | | | | | AC_CHECK_HEADER_STDBOOL is documented to make two checks: whether the C99 header <stdbool.h> is available and fulfills its specification (i.e. including it makes the type ‘bool’ and the constants ‘true’ and ‘false’ available), and, independently, whether the type ‘_Bool’ is available. In C++, the type ‘_Bool’ is usually _not_ available, but <stdbool.h> is still supposed to be include-able and the type ‘bool’ and the constants ‘true’ and ‘false’ are still supposed to be available (unconditionally). However, the test for <stdbool.h> fulfilling its specification freely used _Bool, and would therefore fail spuriously. Correct this by checking for _Bool first, and then refactoring the test program for <stdbool.h> so that it does all its tests using bool, then repeats them with _Bool only when available. * lib/autoconf/headers.m4 (AC_CHECK_HEADER_STDBOOL): Do the test for _Bool before the test for stdbool.h. Test semantics of bool unconditionally; test _Bool only when HAVE__BOOL is defined.
* AC_FUNC_SETPGRP: Don’t depend on the return type of setpgrp.Zack Weinberg2020-11-302-12/+15
| | | | | | | | | | | | | | | | | | | | | | | AC_FUNC_SETPGRP determines whether you have the historic BSD setpgrp, which takes two arguments and returns int, or the historic POSIX setpgrp, which takes no arguments and returns int. Solaris has yet a third variant, which takes no arguments and returns a pid_t (the new process group ID). This difference causes AC_FUNC_SETPGRP’s test program to fail to compile under AC_LANG([C++]), which in turn causes the macro to report that setpgrp does take arguments, which is wrong. It is not worth adding a new result #define for this variant, since *all* forms of setpgrp are deprecated in favor of setpgid, which is old enough that it can be used unconditionally. However, it is worth documenting that this variant exists, and fixing AC_FUNC_SETPGRP to produce the right value for its existing result #define on Solaris with C++. * lib/autoconf/functions.m4 (AC_FUNC_SETPGRP): Redesign test program to not depend on the return type of setpgrp. * doc/autoconf.texi (AC_FUNC_SETPGRP): Mention that the macro does not check for the Solaris variant of setpgrp that returns pid_t. Change programming advice to recommend use of setpgid.
* AC_C_CHAR_UNSIGNED: Remove check of $GCC.Zack Weinberg2020-11-301-2/+3
| | | | | | | | | | | | | | | | | | | | On systems where plain ‘char’ is unsigned (e.g. AIX) we would define __CHAR_UNSIGNED__ only when $GCC was not true at configure time. If AC_LANG([C++]) has been in effect since the beginning of the script (so AC_PROG_CC was never invoked), $GCC will be false regardless; this causes an inconsistency between the C and C++ behaviors, even when both compilers are GNU. The point of checking $GCC here is that GCC has command line options to override the signedness of plain ‘char’, and it predefines __CHAR_UNSIGNED__ to indicate what the signedness actually is. We don’t want config.h to override that. However, there is already a special autoheader template for __CHAR_UNSIGNED__ that prevents it being redefined if it’s defined already, so checking $GCC at configure time is redundant and can safely be removed. * lib/autoconf/c.m4 (AC_C_CHAR_UNSIGNED): Do not make result depend on value of $GCC. Adjust commentary.
* sc_error_message_uppercase: allow fully uppercased wordsZack Weinberg2020-11-301-2/+5
| | | | | | | | | | | | | | | | | | | If an error message starts with an entire fully uppercased word, that’s probably a proper noun and it should stay that way. For instance, autoreconf has an error message that starts with "AM_GNU_GETTEXT is used, but ..."; AM_GNU_GETTEXT is the name of an Automake macro, it needs to stay uppercased. This subsumes the existing exception for the words FATAL and WARNING. While I was in there I generalized the exception for PRIuMAX to cover all of the inttypes.h PRI* and SCN* macros. This patch has been submitted to Gnulib; until it is merged there, anyone running ‘make fetch’ should take care not to drop this change. * maint.mk (sc_error_message_uppercase): Allow error messages that begin with any fully uppercased word, or with any of the inttypes.h PRI[dioux]\w+ or SCN[dioux]\w+ macros.
* make fetch and update savannah gitweb urls to cgit.Zack Weinberg2020-11-308-130/+128
| | | | | | | | | | Several of the files updated by make fetch have made this change, so we follow suit for consistency: * README-hacking * build-aux/fetch.pl * doc/autoconf.texi: Replace all git.savannah.gnu.org/gitweb URLs with equivalent /cgit URLs.
* AC_INIT: better handling of unusual arguments (#110349)Zack Weinberg2020-11-163-72/+342
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Fix some subtle quotation bugs in _AC_INIT_PACKAGE that made it impossible to put ‘,’ or an unbalanced close parenthesis in some of the arguments to AC_INIT. Document that arguments to AC_INIT containing parentheses, square brackets, ‘,’ or ‘#’ may need to be double-quoted. Provide more detailed examples and exposition re computing the arguments to AC_INIT when autoconf is run (e.g. with git-version-gen). Add a whole bunch more tests for unusual arguments to AC_INIT, and a test that the backward-compatibility behavior of AC_INIT with only one argument is still correct. This may still break some of the existing configure scripts described in the threads at https://lists.gnu.org/r/autoconf/2020-10/msg00013.html and https://lists.gnu.org/r/bug-autoconf/2020-10/msg00012.html but, I hope, only in ways covered by the existing warning in NEWS about pickier M4 quotation. * lib/autoconf/general.m4 (_AC_INIT_PACKAGE): Redo argument normalization and default value selection in a simpler, less error-prone fashion. (_AC_INIT_PACKAGE_N): New helper subroutine. (AC_INIT): Always call _AC_INIT_PACKAGE, but supply no arguments if we were called with only one argument. * tests/base.at (AC_INIT (obsolete invocation)): New test. (AC_INIT with unusual version strings): Expand test. * doc/autoconf.texi (AC_INIT): Revise.
* AS_ECHO(_N): Do not expand macros named ‘s’ or ‘n’ (#110377)Zack Weinberg2020-11-162-4/+103
| | | | | | | | | | | | | | | | | | | | | | | AS_ECHO expands to ‘printf "%s\n" $1’. If a configure script defines an M4 macro named ‘s’ or ‘n’ it will be expanded in the first argument to printf, which is almost certainly not what was intended. The configure script for ruby 2.7.2 uses ‘AS_VAR_PUSHDEF([s], ...)’ and breaks with 2.69d because of this. Add some extra quoting so that the ‘%s\n’ is treated as literal; similarly for AS_ECHO_N and the legacy shell variables $as_echo and $as_echo_n. For now, anyway, don’t quote the word ‘printf’; if someone does define that as a M4 macro they might well mean to affect AS_ECHO. (Whether this is something we *want* to allow, we can worry about when it comes up.) Fixes bug #110377. * lib/m4sugar/m4sh.m4 (_AS_ECHO_N_PREPARE, AS_ECHO, AS_ECHO_N): Add another layer of quoting around the first argument to printf. * tests/m4sh.at (Redefining AS_ECHO internals): New test.
* Don’t issue obsoletion warnings for AC_LANG_SAVE/RESTORE (#110375)Zack Weinberg2020-11-151-8/+13
| | | | | | | | | | | | | | | | The most recently released version of libtool.m4 is five years old as of this commit, and no new release is likely to appear anytime soon. It uses AC_LANG_SAVE and AC_LANG_RESTORE, in a way that doesn’t obviously translate to AC_LANG_PUSH and AC_LANG_POP. This will need to be fixed by libtool upstream. Until that actually happens, disable the -Wobsolete warnings for AC_LANG_SAVE and AC_LANG_RESTORE. (They are still documented as obsolete in the manual, as they have been for many years.) Fixes bug #110375. * lib/autoconf/lang.m4 (AC_LANG_SAVE, AC_LANG_RESTORE): Define with AC_DEFUN, not AU_DEFUN; remove manual -Wobsolete warnings.
* AS_IF: Handle else clause being empty after macro expansion (#110369)Zack Weinberg2020-11-154-17/+41
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | AS_IF can emit a syntactically invalid shell if-then-else, if CONDITION then : # ... else fi when its IF-FALSE argument consists of macros that don’t produce any shell code. This was a documented limitation in AS_IF, but it’s a bad limitation to have, because macros that *used* to expand to shell commands might start expanding to nothing in future releases. For instance, this broke the libzmq configure script, which did AC_PROG_CC AX_CHECK_COMPILE_FLAG([-std=gnu11], [CFLAGS+=" -std=gnu11"], [AC_PROG_CC_C99]) Perfectly valid in 2.69, but in 2.70 AC_PROG_CC_C99 doesn’t produce any shell code and the script crashes. We had that limitation for good reason: we can’t just put ‘:’ at the beginning of the else-clause, like we do for the then-clause, because that would clobber $? and the IF-FALSE commands might want to inspect it. (This doesn’t matter for the then-clause, because $? is always zero at the beginning of a then-clause anyway.) The simplest and least inefficient shell construct I can find that works in this context is a shell function that does ‘return $?’. Due to awkward M4sh initialization ordering constraints (AS_IF gets used before we can safely use shell functions) an indirection through a shell variable is necessary. The structure of a m4sh script is now #! /bin/sh ## M4sh Initialization as_nop=: ... ## M4sh Shell Functions as_fn_nop () { return $?; } as_nop=as_fn_nop ... and AS_IF emits if CONDITION then : # ... else $as_nop # ... fi The uses of AS_IF that appear before the beginning of the M4sh Shell Functions section are all under our control and they don’t need to look at $?. If anyone has a better idea for how to make this work I will be glad to hear it. Fixes bug #110369. * lib/m4sugar/m4sh.m4 (_AS_IF_ELSE): When $1 is nonempty, invoke _AS_EMPTY_ELSE_PREPARE. Emit $as_nop at beginning of else clause. (_AS_BOURNE_COMPATIBLE): Initialize as_nop to ‘:’. (_AS_EMPTY_ELSE_PREPARE): New macro which emits a definition of as_fn_nop and resets as_nop to as_fn_nop. (AS_PREPARE, _AS_PREPARE): Invoke _AS_EMPTY_ELSE_PREPARE. (_AS_UNSET_PREPARE): Tweak white space. * tests/m4sh.at (AS_IF and AS_CASE): Test AS_IF’s IF-FALSE argument being empty after macro expansion. * doc/autoconf.texi (AS_IF): Remove warning about use with ‘run-if-false’ argument empty after macro expansion.
* Support CONFIG_SITE being a list of entries.Ross Burton2020-11-113-17/+22
| | | | | | | | | | | | | | | | | Instead of treating CONFIG_SITE as a single path, treat it as a space-separated list of paths and load them in order. Also remove the special-casing of entries starting with a dash, this is redundant as they'll be caught by the wildcard case. Finally add a test case to verify that multiple files are loaded correctly. * lib/autoconf/general.m4 (AC_SITE_LOAD): Treat CONFIG_SITE as a space-separated list of scripts to be sourced. Simplify handling of default config.site locations using this capability. * tests/base.at (AC_CACHE_CHECK): Test loading of multiple site files. * doc/autoconf.texi (Site Defaults): Update documentation of CONFIG_SITE.
* tests/compile.at (AC_RUN_IFELSE): typo fixZack Weinberg2020-11-111-1/+1
|
* autom4te: replace output file atomically (#110305)Ben Pfaff2020-11-101-10/+30
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In 2003, Joey Hess reported the following bug against Debian's autoconf package (see http://bugs.debian.org/221483): I noticed that if I ctrl-c autoconf, it can leave a partially written, executable configure script. I was lucky enough to get a configure script that exited with a shell parse error, but if I had been unlucky, it might have exited 0 without doing all the tests I expected it to do. That would have sucked to ship to users. There are many ways to update a file in a way that is not prone to these problems, and I suggest that autoconf adopt one of them. Ben Pfaff wrote a patch to make autom4te replace the output file atomically; Debian has carried it since 2006. He submitted it to autoconf upstream in 2008 but it never went anywhere. I (Zack) have dusted off the patch and made some minor improvements: using File::Temp (with DIR set to the directory of the output file) instead of a predictable temporary file name, and using Autom4te::FileUtils::update_file instead of File::Copy::move. I do not attempt to test the fix (the test would be inherently racey) nor do I have autom4te delete the temp file if it crashes while the file is being written (there is no way to do this with 100% reliability and it strikes me as likely to cause more problems than it solves). Fixes our bug #110305. * bin/autom4te.in (handle_output): When $output is to a regular or nonexistent file, write to a temporary file in the same directory and then rename it over $output after completion.
* make fetchZack Weinberg2020-11-092-113/+113
|
* m4sh: Require shell to support $(...) command substitution.Zack Weinberg2020-11-092-0/+24
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | As of the 2020-11-07 update, config.sub and config.guess unconditionally use $(...) command substitution; see <https://lists.gnu.org/archive/html/config-patches/2020-11/msg00011.html>. Therefore, add this to the set of required shell features, searched for by _AS_DETECT_BETTER_SHELL. On a system where /bin/sh doesn’t support $(...), $CONFIG_SHELL will be set to one that does (and the primary configure script will be re-executed using that shell). AC_CANONICAL_* use $CONFIG_SHELL to execute config.guess/sub, so they will keep working. This also means that configure scripts and third-party macros that use $(...) will quietly start working correctly on such ancient systems. The test code is simple, but sufficient to weed out Solaris 10’s /bin/sh, which doesn’t support $(...) but *does* support shell functions. I’m not going to touch any of the existing uses of `...` command substitution in Autoconf proper for now, but it might make sense to bulk upgrade them early in the 2.71 release cycle; if nothing else, it would remove a major obstacle to running shellcheck over our scripts. * lib/m4sugar/m4sh.m4 (_AS_MODERN_CMDSUBST_WORKS): New macro. (AS_INIT, AS_SHELL_SANITIZE): Call _AS_DETECT_REQUIRED for _AS_MODERN_CMDSUBST_WORKS. * NEWS: Mention the requirement for $(...).
* Check in install-sh as synced from automake (#110368)Zack Weinberg2020-11-093-10/+535
| | | | | | | | | | | | | | | | | | | | | | | | | As pointed out in sr #110368, since install-sh is now being installed as part of autoconf, we should make sure to ship the latest version rather than the version shipped by the automake that was used to bootstrap the autoconf release tarball. The build-aux/fetch.pl script is already supposed to fetch the latest version, but install-sh is listed in .gitignore so any updates are discarded when starting from a clean tree. Correct this. At the same time, since mdate-sh is *not* installed by autoconf nor is it directly referenced in any code maintained in the autoconf repository, remove it from the list of files to fetch and keep it in .gitignore. This change exposed a bug in fetch.pl where it would crash when there was no old copy of a file being updated. * .gitignore: Remove /build-aux/install-sh. * build-aux/fetch.pl (%to_fetch): Remove build-aux/mdate-sh. (slurp): Don’t die on ENOENT, return undef. (replace_if_change): Handle $oldcontents being undef. * build-aux/install-sh: Is now checked in.
* Mention AM_GNU_GETTEXT_REQUIRE_VERSION support in NEWS.Zack Weinberg2020-11-091-0/+6
|
* autoreconf: Support AM_GNU_GETTEXT_REQUIRE_VERSIONMichał Górny2020-11-092-13/+18
| | | | | | | | | | | | | | As reported in https://github.com/gentoo/gentoo/pull/163, gettext 0.19.6 supports using AM_GNU_GETTEXT_REQUIRE_VERSION (specifying a *minimum* required version of gettext) instead of AM_GNU_GETTEXT_VERSION (which specifies a *fixed* required version of gettext). Update autoreconf to support both. * bin/autoreconf.in (autoreconf_current_directory): Check for AM_GNU_GETTEXT_REQUIRE_VERSION as well as AM_GNU_GETTEXT_VERSION. Update diagnostics about using AM_GNU_GETTEXT_VERSION but not AM_GNU_GETTEXT, or vice versa, to match. * doc/autoconf.texi (autoreconf Invocation): Update to match.
* Fix more bugs in specific tests under AC_LANG(C++).Zack Weinberg2020-11-092-2/+5
| | | | | | | | | | Found by exhaustive testing for differences between probe results under AC_LANG(C) and AC_LANG(C++). * lib/autoconf/c.m4 (AC_C_FLEXIBLE_ARRAY_MEMBER): Cast result of malloc for C++ compatibility. * lib/autoconf/programs.m4 (_AC_PROG_LEX_YYTEXT_DECL): Declare yywrap as extern "C" when compiling as C++.
* Make ‘forbidden tokens, basic’ test more robust.Zack Weinberg2020-11-051-1/+10
| | | | | | | | | While testing the previous patch I noticed that the ‘forbidden tokens, basic’ test can fail if it runs too fast, because the autom4te cache files aren’t considered newer than configure.ac. * tests/tools.at (forbidden tokens, basic): Add delays to ensure autom4te.cache files are newer than configure.ac.
* Do not apply --program-transform-name to build-aux scripts.Zack Weinberg2020-11-051-2/+21
| | | | | | | | | | | | autoreconf expects to find $(pkgdatadir)/build-aux/config.sub etc under those names, not names modified by --program-transform-name. Placing them in $(pkgdatadir) is sufficient to keep parallel installations of autoconf separate: anyone doing that would need to adjust @PACKAGE@ anyway. * lib/local.mk: Use a _DATA rule, not a _SCRIPTS rule, to install config.guess, config.sub, and install-sh. (install-data-hook-make-aux-scripts-executable): New hook rule.
* AC_FUNC_STRERROR_R: Include string.h in test program.Zack Weinberg2020-11-051-1/+1
| | | | | | | | | | | | I misremembered how AC_LANG_PROGRAM works. We don’t need to invoke AC_INCLUDES_DEFAULT here but we *do* need to explicitly include string.h. Unfortunately we have no good way of testing for this regression with the testsuite as it is today. * lib/autoconf/functions.m4 (AC_FUNC_STRERROR_R): Include string.h in test program.
* Define AC_REQUIRE_AUX_FILE with AC_DEFUN.Zack Weinberg2020-11-052-2/+49
| | | | | | | | | Some widely used Automake recipes involve putting AC_REQUIRE_AUX_FILE at top level of a configure script, and it uses AC_REQUIRE now, so it needs to be defined with AC_DEFUN. * lib/autoconf/general.m4 (AC_REQUIRE_AUX_FILE): Define with AC_DEFUN. * tests/torture.at (Missing auxiliary files (foreign)): New test.
* make fetchv2.69dZack Weinberg2020-11-033-15/+63
|
* fix ‘make syntax-check’ complaints (only affects comments).Zack Weinberg2020-11-034-4/+4
|
* _AC_PROG_YYTEXT_DECL: Forward declare yywrap (#110312)Jannick2020-11-031-0/+3
| | | | | | | | | | Some versions of lex need you to forward-declare yywrap in a %{ %} block before the rules section, if you’re going to define it yourself. May help with bug #110312. * lib/autoconf/programs.m4 (_AC_PROG_LEX_YYTEXT_DECL): In the test input to lex, forward-declare yywrap before the rules.
* autoreconf.in: improve compatibility with old perlZack Weinberg2020-11-021-4/+7
| | | | | | | | | | In very old perls (I noticed this with 5.8.4), File::Temp objects are not automatically stringified in all contexts where we expect them to be, causing autoreconf to crash. * bin/autoreconf.in (install_aux_file): Explicitly extract the temporary file’s name from $temp, and use that in all the places we were using $temp.
* Revert to 2.69-compatible behavior in AC_PROG_LEX (#110346)Zack Weinberg2020-11-025-42/+272
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Commit 29ede6b96feee29c0c477d1659081bbdb82cd8b3 caused AC_PROG_LEX to stop looking for a library that provides yywrap. This broke several packages in a Debian archive rebuild. Revert all the way to the 2.69 behavior, which was to set LEXLIB to -ll or -lfl if that library defines yywrap, but allow AC_PROG_LEX to succeed if neither -ll nor -lfl exists on the system, even if a lex program that doesn't define yywrap would need it. (This behavior was a bug, but people have come to depend on it. See https://savannah.gnu.org/support/index.php?110269 and the thread starting from https://lists.gnu.org/r/autoconf-patches/2020-07/msg00013.html for gory details.) To provide a path away from bug-compatibility, AC_PROG_LEX now takes one argument, documented as a whitespace-separated list of options. Two options are defined: ‘yywrap’ means to look for yywrap and behave as if lex is unavailable if it isn’t found; ‘noyywrap’ means to not look for yywrap at all. These are mutually exclusive. Fixes bug #110346. * lib/autoconf/programs.m4 (AC_PROG_LEX): Add an argument which can be either ‘yywrap’, meaning to look for yywrap in -ll, or ‘noyywrap’, meaning to not look for yywrap at all. In the absence of either option, issue an obsoletion warning and revert to behavior bug-compatible with 2.69. * tests/semantics.at: Add more tests of AC_PROG_LEX. * tests/mktests.sh: Exclude AC_PROG_LEX from autogenerated tests. * doc/autoconf.texi: Update documentation of AC_PROG_LEX. * NEWS: Update notes on AC_PROG_LEX.
* AC_OPENMP: Avoid clobbering ‘mp’ and/or ‘penmp’ (#110353)Zack Weinberg2020-11-024-41/+159
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Some of the compiler options that AC_OPENMP tests, mean “enable OpenMP” to one compiler, but “write output to a file named ‘mp’ or ‘penmp’” to other compilers. The author of AC_OPENMP believed that this could only happen if compilation was *successful*, but didn’t realize that one of the options means “write *preprocessed* output to a file named ‘penmp’” to SunPRO C, and that this *would* succeed on the test program. (AC_LINK_IFELSE fails anyway, because the compilation didn’t create conftest$exeext.) The option that actually means “enable OpenMP” to SunPRO C is earlier in the list than the option that means “write preprocessed output to a file named ‘penmp’”, so we might never have noticed this, but for a second bug: if you have a bad combination of Solaris operating system patches installed, it’s possible for this compiler to successfully *compile* a program that uses OpenMP, but then fail to *link* it because the OpenMP runtime library is out of sync with the core C library. AC_OPENMP doesn’t distinguish this case from “that option doesn’t mean ‘enable OpenMP’” so it goes on to other entries in the list and hits the “write preprocessed output” one. Implement four layers of defensive measures against this mess: - Use an #error directive instead of a compile-time syntax error to halt compilation when _OPENMP is not defined. - For each option that might mean “enable OpenMP”, first do an AC_COMPILE_IFELSE to find out whether it really means that, and then an AC_LINK_IFELSE to find out whether it works. If the compilation succeeds but the link fails, bail out of the loop and declare OpenMP to be unsupported. - If a file named ‘mp’ or ‘openmp’ exists in configure’s working directory when AC_OPENMP begins, error out. This means it is safe to delete any file named ‘mp’ or ‘openmp’ that exists at the *end* of AC_OPENMP. - If a file named ‘mp’ or ‘openmp’ exists in the top level of the source tree with a configure.ac that uses AC_OPENMP, have autoconf error out, too. Fixes bug #110353. Problem reported by Dagobert Michelsen. * lib/autoconf/c.m4 (_AC_LANG_OPENMP(C)): Change ‘choke me’ to ‘#error "OpenMP not supported"’. (AC_OPENMP): AC_REQUIRE _AC_OPENMP_SAFE_WD. For each option, do both a compile test and a link test; if the compile test succeeds but the link fails, don’t go on to other candidate options. Delete files named ‘mp’ and ‘penmp’ after the loop. (_AC_OPENMP_SAFE_WD): New macro, subroutine of AC_OPENMP. If files named ‘mp’ or ‘penmp’ exist, error out both at autoconf time and at configure time. * tests/torture.at (Files clobbered by AC_OPENMP): New test. * doc/autoconf.texi: Document requirement not to have files named ‘mp’ or ‘penmp’ next to a configure.ac that uses AC_OPENMP.
* testsuite: Isolate aclocal from third-party macros (#110352).Zack Weinberg2020-11-023-23/+93
| | | | | | | | | | | | | | | | | | | | | | | | | | Several tests in the testsuite run a system-provided aclocal, which will look into its $prefix/share/aclocal for third-party macros. If those macros are buggy, aclocal may bomb out even though the test doesn’t use them, causing the test to fail spuriously. In all tests that need to run aclocal, create an empty directory and give aclocal the --system-acdir option pointing at that directory. This masks out all these potentially buggy macros. (It does *not* mask out AM_INIT_AUTOMAKE, which aclocal will find in a different directory.) In all tests that run autoreconf but *don’t* need to run aclocal, create an empty aclocal.m4 and set ACLOCAL=true in the environment. Fixes bug #110352. Problem reported by Dagobert Michelsen. * tests/fortran.at * tests/tools.at * tests/torture.at: Set ACLOCAL=true in the environment in all tests that run autoreconf but don’t need to run aclocal. Set ACLOCAL="aclocal --system-acdir <empty directory>" in all tests that do need to run aclocal.
* AC_LANG_CALL(C++): Use ‘int’ for return type of conftest::$2.Zack Weinberg2020-11-011-7/+12
| | | | | | | | | | | | | | | | | | | | | | | | Commit 326c9a547423d25c621bc5c0ef76edbf6eda8c92 introduced a custom AC_LANG_CALL for C++. Jani Välimaa reports in https://lists.gnu.org/archive/html/bug-autoconf/2020-10/msg00054.html that the new code does not handle AC_CHECK_LIB([foo], [main]) correctly. This is not the recommended way to use AC_CHECK_LIB, but it’s what you get if you autoupdate from AC_HAVE_LIBRARY, and some people may not have bothered replacing main with a more appropriate symbol. This patch changes the return type of the fake function declaration for AC_CHECK_LIB’s second argument to be ‘int’, which is sufficient to make g++ 10.2.0 happy again. We’re still on thin ice, unfortunately; the code generated by AC_LANG_CALL *always* has undefined behavior, in both C and C++, unless by chance the real prototype of the function we’re probing for happens to match our fake declaration. The only permanent cure is to stop faking declarations, and that’s going to be a challenge. * lib/autoconf/c.m4 (AC_LANG_CALL(C++)): Use ‘int’ for the return type of the fake function declaration, to avoid problems when the function whose declaration we’re faking is ‘main’.
* Don’t search for X11 when cross compiling (#110345)Zack Weinberg2020-11-012-12/+35
| | | | | | | | | | | | | | | | | | | | | | This is undesirable because X11 development headers and libraries found by searching /usr are much more likely to belong to the build operating system than the host operating system (being cross-compiled for). A particularly problematic case, from the original bug report, is “using a sysroot where the target is binary compatible with the host. In this case AC_PATH_X will happily look at /usr and say that yes, X is available, even if the sysroot doesn't have X.” To cross-compile X client applications, the recommended procedure is to put X11 headers and libraries for the host system in the cross compiler’s default search path; alternatively, --x-includes and --x-libraries can be used. Fixes bug #110345. Problem reported by Ross Burton. * lib/autoconf/libs.m4 (_AC_PATH_X): Before doing anything else, see whether a test compilation with no special options (just -lX11) will work. If it doesn’t, only invoke _AC_PATH_X_XMKMF and _AC_PATH_X_DIRECT when not cross compiling.
* Ignore stderr when testing parallel autotest (#110351).Zack Weinberg2020-10-311-6/+17
| | | | | | | | | | | | | | | | | | | Non-release versions of bash (notably 5.1.0(1)-rc1, which was uploaded to Debian unstable) print internal debugging messages like TRACE: pid 411364: bgp_delete: deleting 432074 to the test driver’s stderr while executing the parallel test driver. This causes spurious failures in the test suite. Chet Ramsey assures me these are not a symptom of a bug in either bash or the driver code (see https://lists.gnu.org/archive/html/bug-autoconf/2020-10/msg00047.html) so have the test suite ignore them. This fixes Savannah bug #110351. * tests/autotest.at: Ignore stderr whenever running a micro-suite in parallel mode, to avoid spurious failures due to internal debugging messages that may be printed by bash.
* tests/m4sh.at: prevent an undesirable expansion of __oline__.Zack Weinberg2020-10-291-1/+1
| | | | | | | | | The descriptive comment for AT_DATA_LINENO mentions __oline__, and this is expanded when generating the testsuite, which is confusing to anyone reading the generated testuite. Defang it with @&t@. * tests/m4sh.at (AT_DATA_LINENO): Prevent expansion of __oline__ in the descriptive comment.
* Treat msys(2) the same as cygwin when looking at host_os.Jannick2020-10-283-5/+9
| | | | | | | | | | | | | | | In most cases, checks depending on the value of $host_os should treat *-*-cygwin*, *-*-msys*, and *-*-mingw* all the same. * lib/autoconf/fortran.m4 (_AC_FC_LIBRARY_LDFLAGS): Discard -lkernel32 on msys* as well. When not discarding -lkernel32, deduplicate it, like other -l options. * lib/autoconf/functions.m4 (AC_FUNC_MALLOC, AC_FUNC_REALLOC): msys* also guarantee to return nonnull for malloc(0)/realloc(0). * tests/local.at (at_check_env): Also ignore MSYS as an environment variable.
* Improve handling of missing aux scripts (autoreconf)Zack Weinberg2020-10-207-31/+304
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Make ‘autoreconf --install’ add config.sub, config.guess, and install-sh to the source tree when necessary. This is only relevant for packages that don’t use Automake, because ‘automake --add-missing’ already adds these scripts to the source tree, but apparently there are plenty of packages out there that don’t use Automake, didn’t need config.{sub,guess} with autoconf 2.69, and do need them with 2.70. Such packages will need to have their equivalent of ‘make dist’ manually updated to ship the new files, of course. This patch also has ‘autoreconf’ issue an error if aux files are missing and ‘--install’ *wasn’t* used, or if --install *was* used but could not install all the missing files. This error is more likely to be caught by maintainers than the configure-time error added in the previous patch. 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. * bin/autoreconf.in ($buildauxdir): New package global, initialized to $pkgdatadir/build-aux, or to $ENV{autom4te_buildauxdir} if that’s set. (find_missing_aux_files, can_install_aux_files, try_install_aux_files) (install_aux_file, make_executable): New subs. (autoreconf_current_directory): Trace AC_REQUIRE_AUX_FILE. After running all tools that might install aux files, try to install aux files ourself if --install was given. After that, report on any that are still missing. * lib/autom4te.in (Autoreconf-preselections): Add AC_REQUIRE_AUX_FILE. Make list order consistent with list order in autoreconf.in. * tests/wrapper.as: Set autom4te_buildauxdir to point to location of config.guess, config.sub, and install-sh within the source tree. * lib/local.mk: Install config.guess, config.sub, and install-sh into $(pkgdatadir)/build-aux. * doc/autoconf.texi: Document that autoreconf can now install config.guess, config.sub, and install-sh itself without help from automake, but packages not using automake will need to arrange for tarball distribution of these files by hand. * tests/torture.at (Missing auxiliary files): Test autoreconf as well.
* Improve handling of missing aux scripts.Zack Weinberg2020-10-207-167/+359
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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. This patch overhauls 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, checks for the existence of all of them, and not any others. Thus, this configure script AC_INIT([test], [1.0]) AC_FUNC_MALLOC AC_CONFIG_HEADERS([config.h]) AC_OUTPUT will work fine in a directory that contains config.sub and config.guess but not install-sh. Also, if it’s in a directory that *doesn’t* contain config.sub and config.guess, it will print 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 "." "./.." "./../.." 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. I also documented the expanded need for config.sub and config.guess in NEWS as well as the manual. * 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. * 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. * tests/torture.at (Missing auxiliary files): New test.
* autoreconf: remove redundant xsystem callsRoss Burton2020-10-141-4/+4
| | | | | | | | 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).
* autoreconf: cope with empty AC_CONFIG_SUBDIRS (bug 110331)Zack Weinberg2020-10-142-2/+25
| | | | | | | | | | | | | Commit 41edf99f9515f3f83398428c39d79e11266a5a0d 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.
* doc: improve AS_CASE, AS_IF docPaul Eggert2020-10-112-46/+77
| | | | | | | | | | | | | 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.
* _AS_PATH_WALK: Use AS_IF for IF-NOT-FOUND argument.Zack Weinberg2020-10-101-1/+1
| | | | | | | | | 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.
* Fix regressions when using the C++ compiler to perform tests.Zack Weinberg2020-10-104-45/+56
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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.