summaryrefslogtreecommitdiff
path: root/lib
Commit message (Collapse)AuthorAgeFilesLines
* make update-copyrightZack Weinberg2021-01-2835-50/+55
|
* Restore compatibility with older std-gnu11.m4.Zack Weinberg2020-12-301-186/+258
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Gnulib’s std-gnu11.m4 backports C11 and C++11 detection to autoconf 2.69. It does this by replacing the definitions of AC_PROC_CC and AC_PROG_CXX and most of their subroutines. In particular, it replaces the definitions of _AC_PROG_CC_C11, _AC_PROG_CC_C99, and _AC_C_STD_TRY, but it does *not* replace the definition of _AC_PROG_CC_C89. Autoconf commit 131d8c69f31dc6fc8dc93abe1096d52d1fe19fd3 changed the calling convention of _AC_C_STD_TRY, and changed the internal definitions of _AC_PROG_CC_C{11,99,89} to match. If std-gnu11.m4 is in use, our _AC_PROG_CC_C89 calls their _AC_C_STD_TRY with the new calling convention, and this produces a syntactically invalid configure script. (This is is fortunate: it could easily have been a runtime malfunction that only manifested with compilers that only implement C89, and then we might not have noticed the problem for years.) Gnulib commit a3b3fc85e3e632374811b27cb2111e50fa177e36 makes std-gnu11.m4 do nothing when used with autoconf >=2.70, but older versions of the file will circulate for years to come, so this patch works around the problem in autoconf. It does this by renaming all of the internal macros involved with C and C++ standard edition detection, *except* _AC_PROG_CC_C89. AC_PROG_CC now calls _AC_PROG_CC_STDC_EDITION, which loops over all supported editions calling _AC_PROG_CC_STDC_EDITION_TRY, which uses the data provided by the existing _AC_C_C${edition}_TEST_PROGRAM macros and a new set of macros called _AC_C_C${edition}_OPTIONS to perform the test for that edition of the standard. Similarly, AC_PROG_CXX calls _AC_PROG_CXX_STDCXX_EDITION, which loops calling _AC_PROG_CXX_STDCXX_EDITION_TRY, which uses data from _AC_CXX_CXX${edition}_TEST_PROGRAM and _AC_CXX_CXX${edition}_OPTIONS. _AC_PROG_CC_C89 is the only macro from the old set that we still define, and its definition is reverted to what std-gnu11.m4 expects it to be. Nothing in Autoconf proper uses it anymore. foreign.at grows a test to verify that the compatibility stub version of _AC_PROG_CC_C89 does its job. Since this is now the third test involving an embedded copy of a third-party macro, I broke them all out of foreign.at to separate files in test/data/. In addition to fixing the breakage, this patch should make it easier to extend C / C++ standard edition detection in the future, by getting rid of the if-else chains in AC_PROG_CC/CXX and by disentangling the lists of command-line options to test from the logic. I also changed the manual to suggest people refer to the variables ‘ac_prog_cc_stdc’ and ‘ac_prog_cxx_stdcxx’ to learn which edition of the C and C++ standards are selected; these are much easier to work with than the ac_cv_prog_cc_cNN cache variables. * lib/autoconf/c.m4 (_AC_C_STD_TRY, _AC_PROG_CC_C99, _AC_PROG_CC_C11) (_AC_CXX_STD_TRY, _AC_PROG_CXX_CXX98, _AC_PROG_CXX_CXX11): Remove macro. (_AC_C_C89_OPTIONS, _AC_C_C99_OPTIONS, _AC_C_C11_OPTIONS) (_AC_PROG_CC_STDC_EDITION, _AC_PROG_CC_STDC_EDITION_TRY) (_AC_CXX_CXX98_OPTIONS, _AC_CXX_CXX11_OPTIONS) (_AC_PROG_CXX_STDCXX_EDITION, _AC_PROG_CXX_STDCXX_EDITION_TRY): New macros. (_AC_PROG_CC_C89): Convert to compatibility stub for std-gnu11.m4. (AC_PROG_CC): Use _AC_PROG_CC_STDC_EDITION. (AC_PROG_CXX): Use _AC_PROG_CXX_STDCXX_EDITION. * tests/data/ax_prog_cc_for_build_v18.m4 * tests/data/ax_prog_cxx_for_build_v3.m4 * tests/data/gnulib_std_gnu11_2020_08_17.m4: New files. * tests/foreign.at (AX_PROG_CC_FOR_BUILD, AX_PROG_CXX_FOR_BUILD): Remove embedded copy of ax_prog_cc_for_build_v18.m4, ax_prog_cxx_for_build_v3.m4 respectively. (gnulib-std-gnu11.m4): New test. * tests/local.mk: Distribute tests/data/*.m4. * doc/autoconf.texi (AC_PROG_CC, AC_PROG_CXX): Document use of ac_prog_cc_stdc / ac_prog_cxx_stdcxx, respectively, to tell which edition of the C / C++ standards are selected, instead of looking through a series of cache variables with awkward definitions.
* Use -fno-builtin, not -Werror, in AC_CHECK_DECLS (#110400)Zack Weinberg2020-12-231-74/+84
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | clang issues only a warning, not an error, when an undeclared identifier that names a built-in function is used: for instance char *(*p)(const char *, int) = strchr; (with no `#include <string.h>`) is an error with most compilers, a warning with clang. This broke the 2.69 implementation of AC_CHECK_DECL. In commit 82ef7805faffa151e724aa76c245ec590d174580, we tried to work around this quirk by using -Werror, but that put us at risk of being tripped up by other warnings. Bug 110400 reports, for instance, that this fragment (which is roughly what you get, after preprocessing, when AC_CHECK_DECL is applied to a function that *is* properly declared) extern void ac_decl (int, char *); int main (void) { (void) ac_decl; ; return 0; } provokes a warning from clang (and thus an error) when -Wextra-semi-stmt has been added to CFLAGS earlier in the configure script. The extra semicolon comes from AC_LANG_PROGRAM, and we can’t get rid of it because we have no way of telling reliably when someone wrote something like AC_LANG_PROGRAM([[#include <stdio.h>]], [[puts("hello world")]]) with no semicolon at the end of the statement; this has been acceptable for decades. Besides, that’s just one warning, who knows what compilers will start complaining about tomorrow? So: change AC_CHECK_DECL to compile its programs with -fno-builtin, instead, when the default compilation mode fails to detect an undeclared strchr. The code is restructured so that we can try other options as well, if we find another compiler with the same quirk but different command-line syntax. (All of this logic is very C-family specific, but it appears to me that AC_CHECK_DECL has never worked with other languages, so we can continue to live with that for now.) Fixes bug 110400; partially reverts 82ef7805faffa151e724aa76c245ec590d174580. * lib/autoconf/general.m4 (_AC_UNDECLARED_WARNING): Rename to _AC_UNDECLARED_BUILTIN. Instead of looking at diagnostic output, loop trying to find a command-line option that makes the compiler error out on undeclared builtins. (_AC_CHECK_DECL_BODY): Don’t AC_REQUIRE anything here. Make shell code language-agnostic, except for the actual test program. Add arguments to the shell function for additional compiler options to use. (AC_CHECK_DECL): AC_REQUIRE _AC_UNDECLARED_BUILTIN here. Supply $ac_{AC_LANG_ABBREV}_undeclared_builtin_options to ac_fn_check_decl. * tests/local.at (AT_CONFIG_CMP): Update list of variables to ignore when comparing C and C++ configure runs. * tests/semantics.at (AC_CHECK_DECLS): Add memcpy and strchr to AC_CHECK_DECLS call for functions that may be known to the compiler. * doc/autoconf.texi (AC_CHECK_DECL, AC_CHECK_DECLS): Remove note about compiler warnings.
* Improve AC_USE_SYSTEM_EXTENSIONS port to HP-UX 11.11Paul Eggert2020-12-111-0/+6
| | | | | | * lib/autoconf/specific.m4 (AC_USE_SYSTEM_EXTENSIONS): Define _HPUX_ALT_XOPEN_SOCKET_API, for HP-UX 11.11. This patch is adapted from Gnulib.
* Port minor AC_HEADER_MAJOR fixes from GnulibPaul Eggert2020-12-111-4/+4
| | | | | * lib/autoconf/headers.m4 (AC_HEADER_MAJOR): Improve m4 quoting.
* Port minor AC_FUNC_ALLOCA fixes from GnulibPaul Eggert2020-12-111-5/+5
| | | | | | | * lib/autoconf/functions.m4 (_AC_LIBOBJ_ALLOCA, AC_FUNC_ALLOCA): Use ' not ` in generated comments, as per current GNU coding style. (_AC_LIBOBJ_ALLOCA): Use plain # instead of unnecessary quadrigraph. This patch is adapted from Gnulib.
* Improve port of AC_C_RESTRICT to Oracle C++Paul Eggert2020-12-111-6/+7
| | | | | | | | Problem reported by Christian Biesinger in: https://lists.gnu.org/r/bug-gnulib/2019-12/msg00159.html * lib/autoconf/c.m4 (AC_C_RESTRICT): Port better to Oracle Developer Studio C++ 12.5 or later. This patch is adapted from Gnulib.
* _AC_PROG_CC_C99: fix typo (#110396)Zack Weinberg2020-12-081-1/+1
| | | | | | | | | _AC_PROG_CC_C99 was using the wrong test program. Fixes #110396, reported anonymously. * lib/autoconf/c.m4 (_AC_PROG_CC_C99): Use the C99 test program, not the C89 test program.
* lib/autotest/general.m4: typo fixZack Weinberg2020-12-081-1/+1
| | | | | | | | | The absolute-path case in AT_TESTED had a typo in it, causing bizarre error messages and preventing programs identified by absolute path from being logged properly. * lib/autotest/general.m4 (AT_TESTED): Fix typoed shell syntax in handling of programs identified by absolute path.
* Update documentation of AC_USE_SYSTEM_EXTENSIONS.Zack Weinberg2020-12-071-44/+64
| | | | | | | | | | | | | | | | | | | | | | | The list of macros documented as being defined by AC_USE_SYSTEM_EXTENSIONS had gotten out of sync with the actual list. Update it thoroughly. Also, I introduced an error into the commentary when I merged Julien ÉLIE’s patch to define _NETBSD_SOURCE and _OPENBSD_SOURCE in AC_USE_SYSTEM_EXTENSIONS. _OPENBSD_SOURCE does something on NetBSD and *doesn’t* do anything on OpenBSD. This is corrected. Clean up the code in AC_USE_SYSTEM_EXTENSIONS a bit while I’m in there; we now had a redundant definition of _NETBSD_SOURCE (one unconditional and one conditional on minix/config.h existing). Reorganize the macro to make it easier to catch problems like this in the future. * lib/autoconf/specific.m4 (AC_USE_SYSTEM_EXTENSIONS): Reorganize; remove redundant AC_DEFINE of _NETBSD_SOURCE; add some missing AC_BEFOREs; use _AC_CHECK_HEADER_ONCE for header checks; revise all commentary. * doc/autoconf.texi (AC_USE_SYSTEM_EXTENSIONS): Update.
* Revise documentation of AC_PROG_CC and comments on conformance checks.Zack Weinberg2020-12-071-54/+33
| | | | | | | | | | | | | Makes the documentation of AC_PROG_CC consistent with the documentation of AC_PROG_CXX. Also removes a bunch of redundant text from c.m4 and adds lists of the headers that *can* be used in the conformance tests, so future hackers don’t have to look them up. * doc/autoconf.texi (AC_PROG_CC): Make description consistent with description of AC_PROG_CXX. * lib/autoconf/c.m4: Clean up some outdated or repetitive commentary and add lists of the freestanding headers above the code that needs to avoid using non-freestanding headers.
* Add checks of __STDC__ and __STDC_VERSION__ to C conformance tests.Zack Weinberg2020-12-071-0/+17
| | | | | | | | | | | | | This makes the C conformance tests more consistent with the C++ conformance tests, and should also speed up cycling through the possible options to turn on C99/C11. Tested with gcc, clang, SunPRO C, and AIX xlc. * lib/autoconf/c.m4 (_AC_C_C89_TEST_GLOBALS): Add preprocessor test for __STDC__ being defined (to any value). (_AC_C_C99_TEST_GLOBALS, _AC_C_C11_TEST_GLOBALS): Add preprocessor test of the value of __STDC_VERSION__.
* Don’t use hosted headers when testing for C(++) standard level (#110393)Zack Weinberg2020-12-061-251/+407
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The tests for the level of the C and C++ standard supported by their respective compilers should also avoid using any headers that are not guaranteed to be available in the respective freestanding environment. Unlike the previous change, the only user-visible consequence of this one should be that C11/C99/C89/C++11/C++98 *compiler* support is now correctly detected when the compilation target is a freestanding environment. This patch also refactors how we “emit [the text of the C/C++ standard-conformance test programs] only once per [configure script], into shell variables which can then be referenced repeatedly,” from c3853873, because editing them just a little made the M4 quotation break. Clearly too fragile. I believe this completes the fix for bug #110393. * lib/autoconf/c.m4 (_AC_PROG_CC_C89, _AC_PROG_CC_C99, _AC_PROG_CC_C11) _AC_C_C99_TEST_HEADER, _AC_C_C99_TEST_BODY): Move all test program fragments into new macros that can be AC_REQUIREd individually: _AC_C_C89_TEST_GLOBALS, _AC_C_C89_TEST_MAIN, _AC_C_C89_TEST_PROGRAM, _AC_C_C99_TEST_GLOBALS, _AC_C_C99_TEST_MAIN, _AC_C_C99_TEST_PROGRAM, _AC_C_C11_TEST_GLOBALS, _AC_C_C11_TEST_MAIN, _AC_C_C11_TEST_PROGRAM. Each emits test code at most once, into a shell variable in the INIT_PREPARE diversion. Revise each test program to use only library features of the respective standard’s freestanding environment. (_AC_C_STD_TRY): Take the *name* of the shell variable holding the complete test program as an argument, not the code itself. All callers adjusted to match. (_AC_PROG_CXX_CXX98, _AC_PROG_CXX_CXX11, _AC_CXX_STD_TRY) (_AC_CXX_CXX98_TEST_HEADER, _AC_CXX_CXX98_TEST_BODY) (_AC_CXX_CXX11_TEST_HEADER, _AC_CXX_CXX11_TEST_BODY): Similarly. New macros are: _AC_CXX_CXX98_TEST_GLOBALS, _AC_CXX_CXX98_TEST_MAIN, _AC_CXX_CXX98_TEST_PROGRAM, _AC_CXX_CXX11_TEST_GLOBALS, _AC_CXX_CXX11_TEST_MAIN, _AC_CXX_CXX11_TEST_PROGRAM.
* AC_INCLUDES_DEFAULT: Check for presence of C90 hosted headers (#110393)Zack Weinberg2020-12-061-22/+25
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Since 1993, Autoconf has been assuming that it is safe to include any of the headers defined by ISO C90 without checking for them; this is inaccurate, since only a subset are necessarily available in a C90 *freestanding* environment. It is OK to assume the presence of a header in a macro that checks specifically for something declared by that header (if the header is not present, we will think the specific declaration is unavailable, which is probably accurate for modern embedded environments). It is also OK to continue recommending that user code use these headers unconditionally—anyone working with a freestanding environment knows it. But it is not OK for very generic code within Autoconf itself, such as AC_INCLUDES_DEFAULT, to make this assumption. Note that the set of headers that are not always available includes stdio.h, which we have been assuming can be included unconditionally for even longer. In AC_INCLUDES_DEFAULT, revert to checking for string.h and stdlib.h before including them. Also revert to defining STDC_HEADERS only when string.h and stdlib.h are available (but do not check for float.h and stdarg.h, as these are part of the freestanding set). Add a new check for stdio.h. Sort the inclusion list by standard (C90 freestanding; C90 hosted; C99; POSIX) and alphabetically within each group. Revise all the documentation and update the testsuite. This partially reverts commit 86c213d0e355296f026a36e3203c0813041aae89 and is a partial fix for bug #110393. * lib/autoconf/headers.m4 (AC_CHECK_INCLUDES_DEFAULT): Check for stdio.h, stdlib.h, and string.h before including them. Define STDC_HEADERS only when string.h and stdlib.h are both available. Organize includes list by standard, then alphabetically. * doc/autoconf.texi, NEWS: Update to match. * tests/local.at (AT_CHECK_DEFINES): Make regexes more specific. Also expect a definition of HAVE_STDIO_H. * tests/c.at, tests/semantics.at, tests/tools.at: Use <float.h>, not <stdio.h>, as a header that we expect always to exist. Add HAVE_STDIO_H to various lists of macros that are expected to appear in config.h.
* Define _NETBSD_SOURCE and _OPENBSD_SOURCE in AC_USE_SYSTEM_EXTENSIONS (#110392)Julien ÉLIE2020-12-061-18/+34
| | | | | | | | | | | | | | | | | These expose additional extensions specific to those operating systems, similar to _DARWIN_C_SOURCE, _GNU_SOURCE, etc. (DragonflyBSD and FreeBSD currently do not have any equivalent macros.) Fixes bug #110392. See also https://git.savannah.gnu.org/cgit/gnulib.git/tree/m4/extensions.m4 https://git.eyrie.org/?p=devel/rra-c-util.git;a=commitdiff;h=f8a922cf31804dcc25ac176dcc22fdcdffcb5fdf * lib/autoconf/specific.m4 (AC_USE_SYSTEM_EXTENSIONS): Also define _NETBSD_SOURCE and _OPENBSD_SOURCE. Add comment explaining that there are (currently) no equivalent macros on DragonflyBSD and FreeBSD. Put macro list in alphabetical order.
* Revert "AC_PROG_CC: define via AC_DEFUN_ONCE". (#110350)Zack Weinberg2020-12-041-3/+13
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Revert commit 18c140b50b0619454d4da50d58a318cc257d580a, restoring AC_PROG_CC to being defined as an ordinary AC_DEFUN. This broke third-party macros (e.g. the Autoconf Macro Archive’s AX_PROG_CC_FOR_BUILD) that intentionally invoked AC_PROG_CC a second time with its guts redefined via a whole bunch of ‘pushdef’s. I don’t think we want to support this long-term, but needing access to a build-native compiler in cross-compilation is common enough that we should have *some* supported way to do it, and it may as well be AX_PROG_CC_FOR_BUILD until we come up with something better. If we go back to AC_DEFUN_ONCE for AC_PROG_CC in the future, we should do it consistently for all the “find me a compiler” macros -- it was *only* done for AC_PROG_CC in 18c140b5. The rationale for AC_DEFUN_ONCE seems to have been to reduce the size of the generated configure script. The bulk of the size accountable to AC_PROG_CC is the test programs for figuring out which version of the C standard is available, so I tweaked _AC_C_STD_TRY (and _AC_CXX_STD_TRY) to emit that text only once per program, into shell variables which can then be referenced repeatedly. Fixes bug #110350. * NEWS, doc/autoconf.texi: Revert documentation changes associated with AC_PROG_CC being a one-shot macro. * lib/autoconf/c.m4 (AC_PROG_CC): Revert to defining with AC_DEFUN. (_AC_C_STD_TRY, _AC_CXX_STD_TRY): Emit the test program only once, even if invoked multiple times with the same arguments. * tests/foreign.at (AX_PROG_CC_FOR_BUILD, AX_PROG_CXX_FOR_BUILD): New tests.
* Autotest: add official way to execute code before all/each test.Zack Weinberg2020-12-021-33/+82
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Currently, there isn’t any documented way for an Autotest testsuite to add custom code to be run either right before the main driver loop, or at the point of each AT_SETUP. For instance, there’s no good place to put environment variable sanitization that should apply to the entire testsuite (but isn’t universally relevant), or shell function definitions to be used by custom test macros. Autoconf’s test suite is poking shell functions directly into the PREPARE_TESTS diversion, and doing environment variable sanitization in each individual test. Both of these are obviously undesirable. This patch adds three new AT_* macros that can be used to do these things in an officially-supported way: AT_PREPARE_TESTS adds code to be run right before the main driver loop, AT_PREPARE_EACH_TEST adds code to be run at the beginning of each test, and AT_TEST_HELPER_FN defines a shell function that will be available to each test. In Autoconf’s test suite, I use AT_PREPARE_TESTS to factor out environment variable sanitization that *ought* to apply across the board, and AT_TEST_HELPER_FN for the helper function used by AT_CHECK_ENV. (This fixes the testsuite bug reported by Jannick at https://lists.gnu.org/archive/html/autoconf/2020-10/msg00052.html : CONFIG_SITE in the parent environment will no longer be visible to tests.) It would be nice to give an example of when AT_PREPARE_EACH_TEST is useful, in the documentation, but I didn’t find one in the autoconf test suite. * lib/autotest/general.m4 (AT_PREPARE_TESTS, AT_PREPARE_EACH_TEST) (AT_TEST_HELPER_FN): New macros. (AT_INIT, AT_TESTED): Emit the code to report tested programs only if it’s needed, and make sure it’s after any code added by AT_PREPARE_TESTS. * tests/local.at: Add AT_PREPARE_TESTS block that ensures $MAKE is set sensibly and $MAKEFLAGS and $CONFIG_SITE are unset. Use AT_TEST_HELPER_FN for the helper function needed by AT_CHECK_ENV. (AT_CHECK_MAKE): No need to sanitize $MAKE or $MAKEFLAGS here. * tests/base.at, tests/compile.at, tests/m4sh.at, tests/torture.at: No need to unset or neutralize $CONFIG_SITE in individual tests. * tests/autotest.at: Add tests for new macros. * doc/autoconf.texi, NEWS: Document new macros.
* Overhaul Erlang support.Zack Weinberg2020-11-302-89/+38
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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.
* 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-301-9/+8
| | | | | | | | | | | | | | | | | | | | | | | 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.
* AC_INIT: better handling of unusual arguments (#110349)Zack Weinberg2020-11-161-46/+39
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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-161-4/+13
| | | | | | | | | | | | | | | | | | | | | | | 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-151-6/+33
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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-111-15/+9
| | | | | | | | | | | | | | | | | 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.
* m4sh: Require shell to support $(...) command substitution.Zack Weinberg2020-11-091-0/+11
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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 $(...).
* 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++.
* 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-051-1/+1
| | | | | | | | | 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.
* fix ‘make syntax-check’ complaints (only affects comments).Zack Weinberg2020-11-033-3/+3
|
* _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.
* Revert to 2.69-compatible behavior in AC_PROG_LEX (#110346)Zack Weinberg2020-11-021-18/+76
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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-021-41/+77
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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.
* 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-011-12/+24
| | | | | | | | | | | | | | | | | | | | | | 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.
* Treat msys(2) the same as cygwin when looking at host_os.Jannick2020-10-282-4/+7
| | | | | | | | | | | | | | | 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-202-2/+13
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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-204-76/+181
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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.
* _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-103-45/+46
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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.
* Don’t issue obsoletion warnings for AC_DIAGNOSE.Zack Weinberg2020-10-072-21/+38
| | | | | | | | | | | | | | | | | | | | | | | | | | | | 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.
* mktmpdir: Ensure that $tmp is always an absolute pathname.Zack Weinberg2020-09-241-24/+17
| | | | | | | | | | | | | | | | | | | | | | | | | | | | 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.
* Autoupdate AC_{DIAGNOSE,FATAL,OBSOLETE,WARNING} and _AC_COMPUTE_INT.Zack Weinberg2020-09-229-62/+62
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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.
* Disable all warnings when running autoconf as a subprocess.Zack Weinberg2020-09-221-1/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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.
* New utility function Autom4te::ChannelDefs::merge_WARNINGS.Zack Weinberg2020-09-221-1/+64
| | | | | | | | | | | | | | | | 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.
* Manually sync ChannelDefs.pm from automake.Zack Weinberg2020-09-223-39/+177
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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.
* Consistently use ‘our’ instead of ‘use vars’ in Perl.Zack Weinberg2020-09-213-26/+15
| | | | | | | | | | | | | | | | | | | 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.
* make fetch yet againZack Weinberg2020-09-215-51/+40
|