| # -*- Autotest -*- | |
| AT_BANNER([Autoconf base layer.]) | |
| # Copyright (C) 2000-2001, 2003, 2005-2017, 2020-2026 Free Software | |
| # Foundation, Inc. | |
| # | |
| # This program is free software: you can redistribute it and/or modify | |
| # it under the terms of the GNU General Public License as published by | |
| # the Free Software Foundation, either version 3 of the License, or | |
| # (at your option) any later version. | |
| # | |
| # This program is distributed in the hope that it will be useful, | |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| # GNU General Public License for more details. | |
| # | |
| # You should have received a copy of the GNU General Public License | |
| # along with this program. If not, see <https://www.gnu.org/licenses/>. | |
| ## ------------------------------- ## | |
| ## AC_REQUIRE: topological sort.. ## | |
| ## ------------------------------- ## | |
| # Check that dependencies are always properly honored. | |
| AT_SETUP([AC_REQUIRE: topological sort]) | |
| AT_KEYWORDS([m4@&t@_require]) | |
| AT_DATA([configure.ac], | |
| [[define([REQUIRE_AND_CHECK], | |
| [AC_REQUIRE([$1]) | |
| test -z "$m4@&t@_translit([$1], [A-Z], [a-z])" && AS_EXIT(1)]) | |
| AC_DEFUN([TEST1], | |
| [REQUIRE_AND_CHECK([TEST2a]) | |
| REQUIRE_AND_CHECK([TEST2b]) | |
| test1=set]) | |
| AC_DEFUN([TEST2a], | |
| [test2a=set]) | |
| AC_DEFUN([TEST2b], | |
| [REQUIRE_AND_CHECK([TEST3]) | |
| test2b=set]) | |
| AC_DEFUN([TEST3], | |
| [REQUIRE_AND_CHECK([TEST2a]) | |
| test3=set]) | |
| AS@&t@_INIT | |
| TEST1 | |
| test -z "$test1" && | |
| AC_MSG_ERROR([\$test1 is empty]) | |
| AS_EXIT(0) | |
| ]]) | |
| AT_CHECK_AUTOCONF([], [0], [], | |
| [[trailer.m4: warning: AC_INIT was never used | |
| trailer.m4: warning: AC_OUTPUT was never used | |
| ]]) | |
| AT_CHECK_CONFIGURE | |
| AT_CLEANUP | |
| ## --------------------------- ## | |
| ## AC_REQUIRE: error message. ## | |
| ## --------------------------- ## | |
| # Check that the message mentions AC_DEFUN, not m4_defun. | |
| AT_SETUP([AC_REQUIRE: error message]) | |
| AT_KEYWORDS([m4@&t@_require]) | |
| AT_DATA([configure.ac], | |
| [[AC_REQUIRE([AC_PROG_CC]) | |
| ]]) | |
| AT_CHECK_AUTOCONF([], [1], [], | |
| [[configure.ac:1: error: AC_REQUIRE(AC_PROG_CC): cannot be used outside of an AC_DEFUN'd macro | |
| configure.ac:1: the top level | |
| autom4te: error: m4 failed with exit status: 1 | |
| ]]) | |
| AT_CLEANUP | |
| ## ----------------------------------------------- ## | |
| ## AC_REQUIRE and AC_DEFUN_ONCE: Require, expand. ## | |
| ## ----------------------------------------------- ## | |
| AT_SETUP([AC_REQUIRE & AC_DEFUN_ONCE: [Require, expand]]) | |
| AT_KEYWORDS([m4@&t@_require m4@&t@_require_once]) | |
| AT_DATA([configure.ac], | |
| [[AC_DEFUN([TEST], | |
| [AC_REQUIRE([MULTI_TEST]) | |
| AC_REQUIRE([SINGLE_TEST])]) | |
| AC_DEFUN([MULTI_TEST], | |
| [multi_test=".$multi_test"]) | |
| AC_DEFUN_ONCE([SINGLE_TEST], | |
| [single_test=".$single_test"]) | |
| AS@&t@_INIT | |
| TEST | |
| TEST | |
| MULTI_TEST | |
| MULTI_TEST | |
| SINGLE_TEST | |
| SINGLE_TEST | |
| case $multi_test:$single_test in | |
| ...:. ) AS_EXIT(0);; | |
| ...:* ) AC_MSG_ERROR([DEFUN_ONCE is broken]);; | |
| *:. ) AC_MSG_ERROR([DEFUN is broken (Wow, congrats!)]);; | |
| esac | |
| ]]) | |
| AT_CHECK_AUTOCONF([], 0, [], | |
| [[trailer.m4: warning: AC_INIT was never used | |
| trailer.m4: warning: AC_OUTPUT was never used | |
| ]]) | |
| AT_CHECK_CONFIGURE | |
| AT_CLEANUP | |
| ## ----------------------------------------------- ## | |
| ## AC_REQUIRE and AC_DEFUN_ONCE: Expand, require. ## | |
| ## ----------------------------------------------- ## | |
| AT_SETUP([AC_REQUIRE & AC_DEFUN_ONCE: [Expand, require]]) | |
| AT_KEYWORDS([m4@&t@_require m4@&t@_require_once]) | |
| AT_DATA([configure.ac], | |
| [[AC_DEFUN([TEST], | |
| [AC_REQUIRE([MULTI_TEST]) | |
| AC_REQUIRE([SINGLE_TEST])]) | |
| AC_DEFUN([MULTI_TEST], | |
| [multi_test=".$multi_test"]) | |
| AC_DEFUN_ONCE([SINGLE_TEST], | |
| [single_test=".$single_test"]) | |
| AS@&t@_INIT | |
| MULTI_TEST | |
| MULTI_TEST | |
| SINGLE_TEST | |
| SINGLE_TEST | |
| TEST | |
| TEST | |
| case $multi_test:$single_test in | |
| ..:. ) AS_EXIT(0);; | |
| ..:* ) AC_MSG_ERROR([DEFUN_ONCE is broken]);; | |
| *:. ) AC_MSG_ERROR([DEFUN is broken (Wow, congrats!)]);; | |
| * ) AC_MSG_ERROR([received '$multi_test:$single_test']);; | |
| esac | |
| ]]) | |
| AT_CHECK_AUTOCONF([], 0, [], | |
| [[trailer.m4: warning: AC_INIT was never used | |
| trailer.m4: warning: AC_OUTPUT was never used | |
| ]]) | |
| AT_CHECK_CONFIGURE | |
| AT_CLEANUP | |
| ## ------------------------- ## | |
| ## AC_REQUIRE & AC_PROVIDE. ## | |
| ## ------------------------- ## | |
| AT_SETUP([AC_REQUIRE & AC_PROVIDE]) | |
| AT_KEYWORDS([m4@&t@_require]) | |
| AT_DATA([configure.ac], | |
| [[AC_DEFUN([TEST], | |
| [AC_REQUIRE([INNER_TEST])]) | |
| AC_DEFUN([INNER_TEST], | |
| [inner_test=".$inner_test"]) | |
| AS@&t@_INIT | |
| AC_PROVIDE([INNER_TEST]) | |
| TEST | |
| case $inner_test in | |
| "" ) AS_EXIT(0);; | |
| * ) AC_MSG_ERROR([received '$inner_test']);; | |
| esac | |
| ]]) | |
| AT_CHECK_AUTOCONF([], 0, [], | |
| [[trailer.m4: warning: AC_INIT was never used | |
| trailer.m4: warning: AC_OUTPUT was never used | |
| ]]) | |
| AT_CHECK_CONFIGURE | |
| AT_CLEANUP | |
| ## -------- ## | |
| ## AC_INIT. ## | |
| ## -------- ## | |
| # Make sure AC_INIT sets PACKAGE_TARNAME properly. | |
| AT_SETUP([AC_INIT]) | |
| AT_DATA([configure.ac], | |
| [[AC_INIT([GNU fu], [1.0], [bug-fu@gnu.org]) | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF | |
| AT_CHECK_CONFIGURE([-q]) | |
| # Ensure we get the expected definition: | |
| AT_CHECK([grep "^PACKAGE_TARNAME='fu'\$" configure], [], [ignore]) | |
| AT_CLEANUP | |
| ## ------------------------------- ## | |
| ## AC_INIT (obsolete invocation). ## | |
| ## ------------------------------- ## | |
| # When AC_INIT is called with only one argument, it is equivalent to | |
| # passing that argument to AC_CONFIG_SRCDIR and then calling AC_INIT | |
| # with _no_ arguments. In particular, PACKAGE should _not_ be set | |
| # to whatever the first argument is. | |
| AT_SETUP([AC_INIT (obsolete invocation)]) | |
| AT_DATA([configure.ac], | |
| [[AC_INIT([program.c]) | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF | |
| # Ensure we get the expected definition: | |
| AT_CHECK([grep "^PACKAGE_NAME=''\$" configure], [], [ignore]) | |
| # Running autoconf right now should fail because program.c doesn't exist. | |
| AT_CHECK_CONFIGURE([], [1], [], | |
| [[configure: error: cannot find sources (program.c) in . or .. | |
| ]]) | |
| # Create program.c and then it should be fine. | |
| AT_DATA([program.c]) | |
| AT_CHECK_CONFIGURE | |
| AT_CLEANUP | |
| ## ------------------------------------- ## | |
| ## AC_INIT with unusual version strings. ## | |
| ## ------------------------------------- ## | |
| AT_SETUP([AC_INIT with unusual version strings]) | |
| if echo 'ab*c' | grep -F 'ab*c' >/dev/null 2>&1; then | |
| FGREP="grep -F" | |
| else | |
| FGREP=fgrep | |
| fi | |
| # In both of the arguments that might contain URLs, make sure we test | |
| # all of the unusual ASCII characters that commonly appear in URLs. | |
| # | |
| # The RFC 3986 "unreserved" characters are ASCII letters and digits, plus | |
| # - . _ ~ | |
| # The RFC 3986 "gen-delims" and "sub-delims" are | |
| # / : ? # [ ] @ ! $ & ' ( ) * + , ; = | |
| # The URL escape character is | |
| # % | |
| # | |
| # Any argument that contains characters significant to M4, | |
| # [ ] ( ) , | |
| # may need to be double-quoted depending on exactly how they are used | |
| # (as would an argument that contains a macro name, but we don't test | |
| # that here). | |
| # | |
| # Characters that are still significant for Bourne shell within a | |
| # single-quoted string, double-quoted string, quoted here-doc, or | |
| # unquoted here-doc are explicitly not allowed: | |
| # ' " ` \ $ | |
| # | |
| # We don't test unbalanced parentheses or brackets here. | |
| AT_DATA([configure.ac], | |
| [[AC_INIT([GNU String++ with spaces | |
| (foo)], | |
| [2.48++ (2010-07-03)], | |
| [[https://example/~bug/cdfijknoqrvw/-._:@!()[]*+,;/?y=z#1234567890]], | |
| [string++], | |
| [[HTTPS://EXAMPLE/~PKG/BCDFIJNOQRUVW/-._:@!()[]*+,;/?y=z#1234567890]]) | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF([-Werror]) | |
| AT_CHECK_CONFIGURE([-q]) | |
| AT_CHECK_CONFIGURE([--help], [], [stdout]) | |
| AT_CHECK([[$FGREP \ | |
| 'https://example/~bug/cdfijknoqrvw/-._:@!()[]*+,;/?y=z#1234567890' \ | |
| stdout]], [], [ignore]) | |
| AT_CHECK([[$FGREP \ | |
| 'HTTPS://EXAMPLE/~PKG/BCDFIJNOQRUVW/-._:@!()[]*+,;/?y=z#1234567890' \ | |
| stdout]], [], [ignore]) | |
| AT_CHECK_CONFIGURE([--version], [], [stdout]) | |
| AT_CHECK([$FGREP 'GNU String++ with spaces (foo)' stdout], [], [ignore]) | |
| AT_CHECK([$FGREP '2.48++ (2010-07-03)' stdout], [], [ignore]) | |
| AT_CHECK([./config.status --help], [], [stdout]) | |
| AT_CHECK([[$FGREP \ | |
| 'https://example/~bug/cdfijknoqrvw/-._:@!()[]*+,;/?y=z#1234567890' \ | |
| stdout]], [], [ignore]) | |
| AT_CHECK([[$FGREP \ | |
| 'HTTPS://EXAMPLE/~PKG/BCDFIJNOQRUVW/-._:@!()[]*+,;/?y=z#1234567890' \ | |
| stdout]], [], [ignore]) | |
| AT_CHECK([./config.status --version], [], [stdout]) | |
| AT_CHECK([$FGREP 'GNU String++ with spaces (foo)' stdout], [], [ignore]) | |
| AT_CHECK([$FGREP '2.48++ (2010-07-03)' stdout], [], [ignore]) | |
| # Repeat the above test using all the unusual characters that might appear | |
| # in a list of email addresses in both BUG-REPORT and URL. (URL isn't | |
| # supposed to contain email addresses, but there's no good reason to | |
| # restrict its syntax.) | |
| # The RFC 5822 "atext" characters are ASCII letters and digits, plus | |
| # ! # $ % & ' * + - / = ? ^ _ ` { | } ~ | |
| # The RFC 5822 "special" characters, all of which might appear somewhere | |
| # in an address list, are | |
| # ( ) < > [ ] : ; @ \ , . " | |
| # As above, characters that are significant for Bourne shell within | |
| # strings and heredocs are explicitly not allowed: | |
| # ' " ` \ $ | |
| # As above, any argument that contains characters significant to M4, | |
| # [ ] ( ) , | |
| # may need to be double-quoted depending on exactly how they are used | |
| # (as would an argument that contains a macro name, but we don't test | |
| # that here). | |
| AT_DATA([configure.ac], | |
| [[AC_INIT([GNU String++ with spaces | |
| (foo)], | |
| [2.48++ (2010-07-03)], | |
| [[bugs: fred <A=B?C^D_E@F>, | |
| G!H!I#J@K.L (wilma), | |
| M%N&O@[156.247.38.49], | |
| P*Q+R-S/T@U, | |
| {jon|chyp~}@kqtvxz.VWXYZ;]], | |
| [string++], | |
| [[contact: jem <A=B?C^D_E@bd>, | |
| F!G!H#I@fv.J (lugh), | |
| K%L&M@[156.247.38.49], | |
| N*O+P-Q/R@STU, | |
| {qik|~prys}@wxz.VWXYZ;]]) | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF([-Werror]) | |
| AT_CHECK_CONFIGURE([-q]) | |
| AT_CHECK_CONFIGURE([--help], [], [stdout]) | |
| AT_CHECK([[$FGREP \ | |
| 'bugs: fred <A=B?C^D_E@F>, G!H!I#J@K.L (wilma), M%N&O@[156.247.38.49], P*Q+R-S/T@U, {jon|chyp~}@kqtvxz.VWXYZ;' \ | |
| stdout]], [], [ignore]) | |
| AT_CHECK([[$FGREP \ | |
| 'contact: jem <A=B?C^D_E@bd>, F!G!H#I@fv.J (lugh), K%L&M@[156.247.38.49], N*O+P-Q/R@STU, {qik|~prys}@wxz.VWXYZ;' \ | |
| stdout]], [], [ignore]) | |
| AT_CHECK_CONFIGURE([--version], [], [stdout]) | |
| AT_CHECK([$FGREP 'GNU String++ with spaces (foo)' stdout], [], [ignore]) | |
| AT_CHECK([$FGREP '2.48++ (2010-07-03)' stdout], [], [ignore]) | |
| AT_CHECK([./config.status --help], [], [stdout]) | |
| AT_CHECK([[$FGREP \ | |
| 'bugs: fred <A=B?C^D_E@F>, G!H!I#J@K.L (wilma), M%N&O@[156.247.38.49], P*Q+R-S/T@U, {jon|chyp~}@kqtvxz.VWXYZ;' \ | |
| stdout]], [], [ignore]) | |
| AT_CHECK([[$FGREP \ | |
| 'contact: jem <A=B?C^D_E@bd>, F!G!H#I@fv.J (lugh), K%L&M@[156.247.38.49], N*O+P-Q/R@STU, {qik|~prys}@wxz.VWXYZ;' \ | |
| stdout]], [], [ignore]) | |
| AT_CHECK([./config.status --version], [], [stdout]) | |
| AT_CHECK([$FGREP 'GNU String++ with spaces (foo)' stdout], [], [ignore]) | |
| AT_CHECK([$FGREP '2.48++ (2010-07-03)' stdout], [], [ignore]) | |
| # Check for invalid characters in each argument. | |
| AT_DATA([configure.ac], | |
| [[AC_INIT([GNU "String++"], | |
| [2.48], [https://example.com/], [string++]) | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF([-Werror], [1], [ignore], [stderr]) | |
| AT_CHECK([grep 'AC_INIT: not a literal: ' stderr], [], [ignore]) | |
| AT_DATA([configure.ac], | |
| [[AC_INIT([GNU String++], | |
| ['codename' 2.48], [https://example.com/], [string++]) | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF([-Werror], [1], [ignore], [stderr]) | |
| AT_CHECK([grep 'AC_INIT: not a literal: ' stderr], [], [ignore]) | |
| AT_DATA([configure.ac], | |
| [[AC_INIT([GNU | |
| String++], [2.48], [https://example.com/], [string++]) | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF([-Werror]) | |
| AT_DATA([configure.ac], | |
| [[AC_INIT([GNU String++], ['2.48'], [https://example.com], [string++]) | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF([-Werror], [1], [ignore], [stderr]) | |
| AT_CHECK([grep 'AC_INIT: not a literal: ' stderr], [], [ignore]) | |
| AT_DATA([configure.ac], | |
| [[AC_INIT([GNU String++], [2.48], ['https://example.com'], [string++]) | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF([-Werror], [1], [ignore], [stderr]) | |
| AT_CHECK([grep 'AC_INIT: not a literal: ' stderr], [], [ignore]) | |
| AT_DATA([configure.ac], | |
| [[AC_INIT([GNU String++], [2.48], [https://example.com], [string++], | |
| ['https://example.com']) | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF([-Werror], [1], [ignore], [stderr]) | |
| AT_CHECK([grep 'AC_INIT: not a literal: ' stderr], [], [ignore]) | |
| # The TARNAME argument is used to construct filenames, so it's even | |
| # more constrained. | |
| AT_DATA([configure.ac], | |
| [[AC_INIT([GNU String++], [2.48], [https://example.com], ['string++']) | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF([-Werror], [1], [ignore], [stderr]) | |
| AT_CHECK([grep 'AC_INIT: unsafe as a filename: ' stderr], [], [ignore]) | |
| AT_DATA([configure.ac], | |
| [[AC_INIT([GNU String++], [2.48], [https://example.com], [string ++]) | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF([-Werror], [1], [ignore], [stderr]) | |
| AT_CHECK([grep 'AC_INIT: unsafe as a filename: ' stderr], [], [ignore]) | |
| AT_DATA([configure.ac], | |
| [[AC_INIT([GNU String++], [2.48], [https://example.com], [string*]) | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF([-Werror], [1], [ignore], [stderr]) | |
| AT_CHECK([grep 'AC_INIT: unsafe as a filename: ' stderr], [], [ignore]) | |
| # Commas and unbalanced close parentheses are especially troublesome for M4. | |
| # They are only expected to work when double-quoted, but even then they can | |
| # cause malfunctions if not handled carefully within Autoconf. | |
| AT_DATA([configure.ac], | |
| [[AC_INIT([[GNU, String]], [2.48], [bugs@gstring.example], | |
| [string], [https://gstring.example/]) | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF | |
| AT_DATA([configure.ac], | |
| [[AC_INIT([[GNU String)]], [2.48], [bugs@gstring.example], | |
| [string], [https://gstring.example/]) | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF | |
| AT_DATA([configure.ac], | |
| [[AC_INIT([GNU String], [[2,48]], [bugs@gstring.example], | |
| [string], [https://gstring.example/]) | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF | |
| AT_DATA([configure.ac], | |
| [[AC_INIT([GNU String], [[2.48)]], [bugs@gstring.example], | |
| [string], [https://gstring.example/]) | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF | |
| AT_DATA([configure.ac], | |
| [[AC_INIT([GNU String], [2.48], [[bugs@gstring.example, | |
| gstring-bugs@example.com]], | |
| [string], [https://gstring.example/]) | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF | |
| AT_DATA([configure.ac], | |
| [[AC_INIT([GNU String], [2.48], [[bugs)@gstring.example]], | |
| [string], [https://gstring.example/]) | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF | |
| AT_DATA([configure.ac], | |
| [[AC_INIT([GNU String], [2.48], [bugs@gstring.example], | |
| [[string,]], [https://gstring.example/]) | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF | |
| AT_DATA([configure.ac], | |
| [[AC_INIT([GNU String], [2.48], [bugs@gstring.example], | |
| [[string)]], [https://gstring.example/]) | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF([], [0], [ignore], [stderr]) | |
| AT_CHECK([grep 'AC_INIT: unsafe as a filename: ' stderr], [], [ignore]) | |
| AT_DATA([configure.ac], | |
| [[AC_INIT([GNU String], [2.48], [bugs@gstring.example], | |
| [string], [[https://gstring.example/docs,html]]) | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF | |
| AT_DATA([configure.ac], | |
| [[AC_INIT([GNU String], [2.48], [bugs@gstring.example], | |
| [string], [[https://gstring.example/weird)/path]]) | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF | |
| AT_CLEANUP | |
| ## -------------- ## | |
| ## AC_COPYRIGHT. ## | |
| ## -------------- ## | |
| # Ensure the FSF notice as well as the user-provided one are present | |
| # in the head of the testsuite as well as the --version output. | |
| AT_SETUP([AC@&t@_COPYRIGHT]) | |
| AT_DATA([configure.ac], | |
| [[AC_INIT([GNU fu], [1.0]) | |
| AC_COPYRIGHT([[This is just a test notice, not a real one, so let's avoid | |
| words that may be matched by scanners for legal things, | |
| causing extra work for distributors. | |
| Multi-line values should be supported. | |
| ]]) | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF | |
| AT_CHECK_CONFIGURE([--version], [], [stdout]) | |
| AT_CHECK([grep 'Copyright.*Free Software Foundation' stdout], [], [ignore]) | |
| AT_CHECK([grep 'This is just a test notice' stdout], [], [ignore]) | |
| AT_CHECK([sed -ne 50q -e '/Copyright/{' -e N -e N -e N -e N -e 's/#//g' ]dnl | |
| [ -e 's/\n//g' -e p -e '}' configure ]dnl | |
| [ | grep 'Copyright.*Free Software Foundation'], | |
| [], [ignore]) | |
| AT_CHECK([sed 50q configure | grep 'This is just a test notice'], [], [ignore]) | |
| AT_CLEANUP | |
| ## ---------------- ## | |
| ## AC_CACHE_CHECK. ## | |
| ## ---------------- ## | |
| # Make sure AC_CACHE_CHECK is silent with -q. | |
| # Also make sure we warn about cache id's not named with '_cv_'. | |
| AT_SETUP([AC_CACHE_CHECK]) | |
| AT_KEYWORDS([CONFIG_SITE]) | |
| AT_DATA([configure.ac], | |
| [[AC_INIT | |
| # m4_define([ac_nothing], [ac_cv_absolutely_nothing]) | |
| AC_CACHE_CHECK([for nothing], | |
| [ac_nothing], | |
| [ac_nothing=found]) | |
| AC_MSG_CHECKING([for some other variable]) | |
| commands_to_set_it_was_run=false | |
| AC_CACHE_VAL([my_cv_variable], [ | |
| # FOO | |
| commands_to_set_it_was_run=true | |
| my_cv_variable=true | |
| ]) | |
| AC_MSG_RESULT([$my_cv_variable]) | |
| # Ensure that the result is available at this point. | |
| if ${my_cv_variable+false} :; then | |
| AC_MSG_ERROR([AC@&@&t@t@_CACHE_VAL did not ensure that the cache variable was set]) | |
| fi | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF([], [], [], [stderr]) | |
| AT_CHECK([grep 'must contain _cv_ to be cached' stderr], [], [ignore]) | |
| # Do not warn about defines: | |
| sed 's/^# m4_define/m4_define/' configure.ac > t | |
| mv -f t configure.ac | |
| AT_CHECK_AUTOCONF | |
| AT_CHECK_CONFIGURE([-q]) | |
| sed '/m4_define/d; s/ac_nothing/ac_cv_nothing/' configure.ac > t | |
| mv -f t configure.ac | |
| AT_CHECK_AUTOCONF | |
| AT_CHECK_CONFIGURE([-q]) | |
| # Print a message saying that the result was cached, iff it was cached. | |
| AT_CHECK_CONFIGURE([], [], [stdout]) | |
| AT_CHECK([grep 'cached' stdout], [1]) | |
| AT_CHECK_CONFIGURE([my_cv_variable='yes it is set'], [], [stdout]) | |
| AT_CHECK([grep 'cached.*yes it is set' stdout], [], [ignore]) | |
| # --cache-file is honored and has caching semantics. | |
| AT_CHECK_CONFIGURE([--cache-file=foobar.cache], [], [stdout]) | |
| AT_CHECK([grep 'cached' stdout], [1]) | |
| AT_CHECK([test ! -f config.cache]) | |
| AT_CHECK([grep 'my_cv_variable.*true' foobar.cache], [], [ignore]) | |
| AT_CHECK_CONFIGURE([--cache-file=foobar.cache], [], [stdout]) | |
| AT_CHECK([grep 'some other variable.*cached.*true' stdout], [], [ignore]) | |
| # A setting on the command line overrides the cache. | |
| AT_CHECK_CONFIGURE([--cache-file=foobar.cache my_cv_variable='override'], [], [stdout]) | |
| AT_CHECK([grep 'cached.*override' stdout], [], [ignore]) | |
| AT_CHECK([grep 'my_cv_variable.*override' foobar.cache], [], [ignore]) | |
| # Values containing braces need special internal treatment. | |
| AT_CHECK_CONFIGURE([-C ac_cv_nothing='{' my_cv_variable='contains } brace'], | |
| [], [stdout]) | |
| AT_CHECK([grep 'ac_cv_nothing.*{' config.cache], [], [ignore]) | |
| AT_CHECK([grep 'my_cv_variable.*contains } brace' config.cache], [], [ignore]) | |
| AT_CHECK_CONFIGURE([-C], [], [stdout]) | |
| AT_CHECK([grep 'nothing.*{' stdout], [], [ignore]) | |
| AT_CHECK([grep 'some other variable.*contains } brace' stdout], [], [ignore]) | |
| rm -f config.cache | |
| # Diagnose common side-effects that are errors in COMMANDS-TO-SET-IT: | |
| sed 's/^# FOO/AC_DEFINE([some-define], [1], [oooh.])/' configure.ac > t | |
| mv -f t configure.ac | |
| AT_CHECK_AUTOCONF([], [], [], [stderr]) | |
| AT_CHECK([grep 'suspicious.*AC_DEFINE' stderr], [], [ignore]) | |
| sed 's/^AC_DEFINE.*/AC_SUBST([some_substitution], [oooh.])/' configure.ac > t | |
| mv -f t configure.ac | |
| AT_CHECK_AUTOCONF([], [], [], [stderr]) | |
| AT_CHECK([grep 'suspicious.*AC_SUBST' stderr], [], [ignore]) | |
| # Ensure the examples from the manual work as intended. | |
| # Taken from autoconf.texi:Caching Results | |
| AT_DATA([configure.ac], | |
| [[AC_INIT | |
| AC_DEFUN([AC_SHELL_TRUE], | |
| [AC_CACHE_CHECK([whether true(1) works], [my_cv_shell_true_works], | |
| [my_cv_shell_true_works=no | |
| (true) 2>/dev/null && my_cv_shell_true_works=yes | |
| if test "x$my_cv_shell_true_works" = xyes; then | |
| AC_DEFINE([TRUE_WORKS], [1], | |
| [Define if 'true(1)' works properly.]) | |
| fi]) | |
| ]) | |
| AC_SHELL_TRUE | |
| ]]) | |
| AT_CHECK_AUTOCONF([-Werror], [1], [], [stderr]) | |
| AT_CHECK([grep 'suspicious.*AC_DEFINE' stderr], [], [ignore]) | |
| # Taken from autoconf.texi:Caching Results | |
| AT_DATA([configure.ac], | |
| [[AC_INIT | |
| AC_DEFUN([AC_SHELL_TRUE], | |
| [AC_CACHE_CHECK([whether true(1) works], [my_cv_shell_true_works], | |
| [my_cv_shell_true_works=no | |
| (true) 2>/dev/null && my_cv_shell_true_works=yes]) | |
| if test "x$my_cv_shell_true_works" = xyes; then | |
| AC_DEFINE([TRUE_WORKS], [1], | |
| [Define if 'true(1)' works properly.]) | |
| fi | |
| ]) | |
| AC_SHELL_TRUE | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF([-Werror]) | |
| AT_CHECK_CONFIGURE([-C], [], [stdout]) | |
| AT_CHECK([grep my_cv_shell_true_works config.cache], [], [ignore]) | |
| AT_CHECK([grep 'true.*works.*yes' stdout], [], [ignore]) | |
| AT_CHECK_CONFIGURE([--config-cache], [], [stdout]) | |
| AT_CHECK([grep 'true.*works.*cached.*yes' stdout], [], [ignore]) | |
| # config.status only pays attention to the cache file with --recheck. | |
| AT_CHECK([./config.status], [], [stdout]) | |
| AT_CHECK([grep cache stdout], [1]) | |
| AT_CHECK([./config.status --recheck], [], [stdout]) | |
| AT_CHECK([grep cache stdout], [0], [ignore]) | |
| # By default, configure uses no cache file, neither loading nor updating it. | |
| : > a-stamp-file | |
| AT_CHECK_CONFIGURE([], [], [stdout]) | |
| AT_CHECK([grep cache stdout], [1]) | |
| AT_CHECK([test config.cache -ot a-stamp-file]) | |
| # Using a symlinked cache file works. | |
| : > cache | |
| rm -f config.cache | |
| AS_LN_S([cache], [config.cache]) | |
| AT_CHECK_CONFIGURE([-C]) | |
| # Either the system does not support symlinks, or the symlinked-to file | |
| # should be updated. | |
| AT_CHECK([test -s cache || test ! -h config.cache]) | |
| # config.site can specify a site-wide cache, accumulating information. | |
| # Also test that we don't run afoul of sourcing a file with leading -. | |
| AT_DATA([-config.site], | |
| [[cache_file=sitecache | |
| ]]) | |
| AT_DATA([sitecache], | |
| [[my_cv_some_preset_cache_var=yes | |
| ]]) | |
| CONFIG_SITE=-config.site | |
| export CONFIG_SITE | |
| AT_CHECK_CONFIGURE | |
| AT_CHECK([grep my_cv_some_preset_cache_var sitecache], [], [ignore]) | |
| AT_CHECK([grep my_cv_shell_true_works sitecache], [], [ignore]) | |
| AT_CHECK_CONFIGURE([], [], [stdout]) | |
| AT_CHECK([grep 'whether true.*works.*cached' stdout], [], [ignore]) | |
| dnl Until we can find a way to avoid catastrophic failure, | |
| dnl skip the rest of this test on such shells. | |
| echo 'if' > syntax | |
| AT_CHECK([${CONFIG_SHELL-$SHELL} -c 'case `. ./syntax; echo $?` in | |
| 0|"") exit 77;; esac'], [0], [ignore], [ignore]) | |
| # Check that config cache scripts must be well-formed. | |
| AT_DATA([bad.site], | |
| [[fi | |
| ]]) | |
| CONFIG_SITE=$PWD/bad.site | |
| AT_CHECK_CONFIGURE([ || exit 1], [1], [stdout], [stderr]) | |
| AT_CHECK([grep 'failed to load site script' stderr], [], [ignore], [ignore], | |
| [AT_CHECK([grep 'whether true' stdout], [1])]) | |
| # However, a missing file is ignored. | |
| CONFIG_SITE=./no-such-file | |
| AT_CHECK_CONFIGURE | |
| # Check that multiple files are loaded | |
| AT_DATA([first.site], | |
| [[my_cv_shell_true_works=no | |
| ]]) | |
| AT_DATA([second.site], | |
| [[my_cv_shell_true_works=maybe | |
| ]]) | |
| CONFIG_SITE="$PWD/first.site $PWD/second.site" | |
| AT_CHECK_CONFIGURE([], [], [stdout]) | |
| AT_CHECK([grep 'whether true.*works.*cached.*maybe' stdout], [], [ignore]) | |
| AT_CLEANUP | |
| ## --------------- ## | |
| ## AC_CACHE_LOAD. ## | |
| ## --------------- ## | |
| # Test AC_CACHE_LOAD. | |
| AT_SETUP([AC_CACHE_LOAD]) | |
| AT_DATA([configure.ac], | |
| [[AC_INIT | |
| $some_test_code | |
| AC_CACHE_LOAD | |
| AC_MSG_NOTICE([some_cv_variable is $some_cv_variable]) | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF | |
| AS_UNSET([some_test_code]) | |
| AT_DATA([new-cache], | |
| [[some_cv_variable=value-from-new-cache | |
| ]]) | |
| AT_CHECK_CONFIGURE([some_test_code='eval cache_file=new-cache'], [], [stdout]) | |
| AT_CHECK([grep 'some_cv_variable.*value-from-new-cache' stdout], [], [ignore]) | |
| AT_CLEANUP | |
| ## ---------------- ## | |
| ## AC_COMPUTE_INT. ## | |
| ## ---------------- ## | |
| # Make sure AC_COMPUTE_INT fails properly. | |
| AT_SETUP([AC_COMPUTE_INT]) | |
| AT_DATA([configure.ac], | |
| [[AC_INIT | |
| AC_COMPUTE_INT([invalid_expression], | |
| [**0**], | |
| [], | |
| [invalid_expression=failed]) | |
| test "$invalid_expression" = failed || | |
| AC_MSG_ERROR([**0** evaluated to $invalid_expression instead of failing]) | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF | |
| AT_CHECK_CONFIGURE | |
| AT_CLEANUP | |
| ## ---------------- ## | |
| ## AC_TRY_COMMAND. ## | |
| ## ---------------- ## | |
| AT_SETUP([AC_TRY_COMMAND]) | |
| AT_DATA([configure.ac], | |
| [[AC_INIT | |
| if AC_TRY_COMMAND([(echo "The Cat in the Hat"; | |
| echo "The Hat in the Cat" >&2) | | |
| grep \^The\ Cat\ in\ the\ Hat\$ >/dev/null]); then | |
| : | |
| else | |
| AC_MSG_ERROR([didn't see the Cat in the Hat]) | |
| fi | |
| if AC_TRY_COMMAND([(echo "The Cat in the Hat"; | |
| echo "The Hat in the Cat" >&2) | | |
| grep \^The\ Hat\ in\ the\ Cat\$ >/dev/null]); then | |
| AC_MSG_ERROR([saw the Hat in the Cat]) | |
| fi | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF | |
| AT_CHECK_CONFIGURE([-q]) | |
| AT_CLEANUP | |
| ## ------------ ## | |
| ## Input/Output ## | |
| ## ------------ ## | |
| AT_SETUP([Input/Output]) | |
| AT_DATA([configure.ac], | |
| [[AC_INIT | |
| cat <&AS@&t@_ORIGINAL_STDIN_FD >&AS@&t@_MESSAGE_FD | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF | |
| AT_CHECK([echo Hello | | |
| ./configure $configure_options | | |
| grep -v '^configure: '],, | |
| [Hello | |
| ]) | |
| AT_CHECK([echo Hello | ./configure $configure_options --silent]) | |
| AT_CLEANUP | |
| ## ------------------- ## | |
| ## configure arguments ## | |
| ## ------------------- ## | |
| AT_SETUP([configure arguments]) | |
| AT_DATA([configure.ac], | |
| [[AC_INIT | |
| echo "$@" | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF | |
| AT_CHECK_CONFIGURE([FOO=bar --enable-baz --without-zork --silent], [0], [stdout], [ignore]) | |
| AT_CHECK([grep 'FOO=bar --enable-baz --without-zork --silent' stdout], [0], [ignore], [ignore]) | |
| dnl check that syntax error is detected | |
| AT_CHECK_CONFIGURE([=], [1], [], [ignore], [ignore]) | |
| AT_CHECK_CONFIGURE([1=2], [1], [], [ignore], [ignore]) | |
| AT_CLEANUP | |
| ## ------------------------------ ## | |
| ## AC_ARG_ENABLE and AC_ARG_WITH. ## | |
| ## ------------------------------ ## | |
| AT_SETUP([AC_ARG_ENABLE and AC_ARG_WITH]) | |
| AT_DATA_M4SH([configure.ac], | |
| [[AC_INIT | |
| # Taken from autoconf.texi:Pretty Help Strings. | |
| AC_ARG_WITH([foo], | |
| [AS_HELP_STRING([--with-foo], | |
| [use foo (default is no)])], | |
| [use_foo=$withval], | |
| [use_foo=no]) | |
| AC_ARG_WITH([c++], | |
| [AS_HELP_STRING([--with-c++], | |
| [with c++])], | |
| [choice_with=$withval]) | |
| AC_ARG_ENABLE([c++], | |
| [AS_HELP_STRING([--enable-c++], | |
| [enable c++])], | |
| [choice_enable=$enableval]) | |
| echo "use_foo: $use_foo" | |
| echo "with_c++: $with_c__, $choice_with" | |
| echo "enable_c++: $enable_c__, $choice_enable" | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF | |
| AT_CHECK_CONFIGURE([--help | grep foo], [0], | |
| [[ --with-foo use foo (default is no) | |
| ]], [ignore]) | |
| AT_CHECK_CONFIGURE([--with-foo=yes --with-c++ --disable-c++], | |
| [], [stdout], [ignore]) | |
| AT_CHECK([grep 'use_foo: yes' stdout], [], [ignore]) | |
| AT_CHECK([grep 'with_c++: yes, yes' stdout], [], [ignore]) | |
| AT_CHECK([grep 'enable_c++: no, no' stdout], [], [ignore]) | |
| AT_CHECK([grep 'unrecognized option' stdout], [1]) | |
| AT_CHECK_CONFIGURE([--without-foo --with-c++=no --enable-c++=maybe], | |
| [], [stdout], [ignore]) | |
| AT_CHECK([grep 'use_foo: no' stdout], [], [ignore]) | |
| AT_CHECK([grep 'with_c++: no, no' stdout], [], [ignore]) | |
| AT_CHECK([grep 'enable_c++: maybe, maybe' stdout], [], [ignore]) | |
| AT_CHECK([grep 'unrecognized option' stdout], [1]) | |
| AT_CHECK_CONFIGURE([], [], [stdout], [ignore]) | |
| AT_CHECK([grep 'use_foo: no' stdout], [], [ignore]) | |
| AT_CHECK([grep 'with_c++: , $' stdout], [], [ignore]) | |
| AT_CHECK([grep 'enable_c++: , $' stdout], [], [ignore]) | |
| AT_CHECK([grep 'unrecognized option' stdout], [1]) | |
| AT_CLEANUP | |
| ## --------------------- ## | |
| ## configure directories ## | |
| ## --------------------- ## | |
| AT_SETUP([configure directories]) | |
| AT_DATA([foo.in], | |
| [[prefix=@prefix@ | |
| exec_prefix=@exec_prefix@ | |
| libdir=@libdir@ | |
| ]]) | |
| AT_DATA([configure.ac], | |
| [[AC_INIT | |
| AC_CONFIG_FILES([foo]) | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF | |
| dnl check that relative paths are rejected | |
| AT_CHECK_CONFIGURE([--libdir=.], [1], [ignore], [stderr]) | |
| AT_CHECK([grep 'expected an absolute directory name for --libdir: \.' stderr], | |
| [0], [ignore]) | |
| dnl check that extra slashes are stripped, and that defaults are not expanded | |
| AT_CHECK_CONFIGURE([--prefix=/usr//]) | |
| AT_CHECK([cat foo], [0], [[prefix=/usr | |
| exec_prefix=${prefix} | |
| libdir=${exec_prefix}/lib | |
| ]]) | |
| AT_CLEANUP | |
| ## ---------- ## | |
| ## AC_SUBST. ## | |
| ## ---------- ## | |
| AT_SETUP([AC_SUBST]) | |
| AT_KEYWORDS([AS@&t@_IDENTIFIER_IF]) | |
| # Check that a valid variable name is used. | |
| AT_DATA([configure.ac], | |
| [[AC_INIT([test], [1]) | |
| AC_SUBST([1], [bar]) | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF([], [1], [], [stderr]) | |
| AT_CHECK([grep 'not a valid shell variable' stderr], [], [ignore]) | |
| AT_DATA([configure.ac], | |
| [[AC_INIT([test], [1]) | |
| AC_SUBST([], [bar]) | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF([], [1], [], [stderr]) | |
| AT_CHECK([grep 'not a valid shell variable' stderr], [], [ignore]) | |
| AT_DATA([configure.ac], | |
| [[AC_INIT([test], [1]) | |
| AC_SUBST([*], [bar]) | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF([], [1], [], [stderr]) | |
| AT_CHECK([grep 'not a valid shell variable' stderr], [], [ignore]) | |
| # Make sure AC_SUBST handles variables as expected. | |
| AT_DATA([file.in], | |
| [[@FOO@ | |
| @BAR@ | |
| FOO | |
| ]]) | |
| AT_DATA([configure.ac], | |
| [[AC_INIT([test], [0]) | |
| m4_define([FOO], [baz]) | |
| AC_SUBST([FOO], [bar]) | |
| BAR=one | |
| AC_SUBST([B@&t@AR]) | |
| BAR=two | |
| AC_CONFIG_FILES([file]) | |
| AC_OUTPUT | |
| ]]) | |
| AT_CHECK_AUTOCONF([], [], [], [stderr]) | |
| AT_CHECK_CONFIGURE | |
| AT_CHECK([cat file], [], | |
| [[bar | |
| two | |
| FOO | |
| ]]) | |
| AT_CLEANUP | |
| ## ----------------------------------- ## | |
| ## configure with closed standard fds ## | |
| ## ----------------------------------- ## | |
| AT_SETUP([configure with closed standard fds]) | |
| AT_KEYWORDS([AS@&t@_INIT]) | |
| # Create a configure script that runs a relatively complicated but | |
| # self-contained test. Run it. | |
| AT_CONFIGURE_AC([[AC_PROG_CC]]) | |
| AT_CHECK_AUTOCONF | |
| AT_CHECK_AUTOHEADER | |
| AT_CHECK_CONFIGURE([], [], [stdout], [stderr]) | |
| AT_CHECK_ENV | |
| mv stdout stdout-expected | |
| mv stderr stderr-expected | |
| mv state-env.after state-env-expected | |
| mv config.status config-status-expected | |
| mv config.h config-h-expected | |
| # Run it again with stdin (fd 0) closed. | |
| # There should be no change to the stdout or stderr output and the | |
| # result of configuration should be the same. | |
| AT_CHECK_CONFIGURE([ 0<&- ], [], [stdout], [stderr]) | |
| AT_CHECK_ENV | |
| AT_CMP([stdout-expected], [stdout]) | |
| AT_CMP([stderr-expected], [stderr]) | |
| AT_CONFIG_CMP([state-env-expected], [state-env.after]) | |
| mv stdout stdout-closed-0 | |
| mv stderr stderr-closed-0 | |
| mv state-env.after state-env-closed-0 | |
| mv config.status config-status-closed-0 | |
| mv config.h config-h-closed-0 | |
| # Run it again with stdout (fd 1) closed. | |
| # There should be no change to the stderr output and the | |
| # result of configuration should be the same. (Any output | |
| # that would have gone to stdout, of course, is lost.) | |
| AT_CHECK_CONFIGURE([ 1>&- ], [], [stdout], [stderr]) | |
| AT_CHECK_ENV | |
| AT_CHECK([test -f stdout && test ! -s stdout]) | |
| AT_CMP([stderr-expected], [stderr]) | |
| AT_CONFIG_CMP([state-env-expected], [state-env.after]) | |
| mv stdout stdout-closed-1 | |
| mv stderr stderr-closed-1 | |
| mv state-env.after state-env-closed-1 | |
| mv config.status config-status-closed-1 | |
| mv config.h config-h-closed-1 | |
| # Run it again with stderr (fd 2) closed. | |
| # There should be no change to the stdout output and the | |
| # result of configuration should be the same. (Any output | |
| # that would have gone to stderr, of course, is lost.) | |
| AT_CHECK_CONFIGURE([ 2>&- ], [], [stdout], [stderr]) | |
| AT_CHECK_ENV | |
| AT_CMP([stdout-expected], [stdout]) | |
| AT_CHECK([test -f stderr && test ! -s stderr]) | |
| AT_CONFIG_CMP([state-env-expected], [state-env.after]) | |
| mv stdout stdout-closed-2 | |
| mv stderr stderr-closed-2 | |
| mv state-env.after state-env-closed-2 | |
| mv config.status config-status-closed-2 | |
| mv config.h config-h-closed-2 | |
| AT_CLEANUP |