autoconf/tests/tools.at
Zack Weinberg d330dd6273 AC_REPLACE_FUNCS: invoke _AH_CHECK_FUNC and AC_LIBSOURCE unconditionally.
While investigating something else, I noticed that AC_REPLACE_FUNCS
calls _AH_CHECK_FUNC and AC_LIBSOURCE in the success branch of an
AC_CHECK_FUNC.  This doesn’t work; both of those are marker macros
that need to be expanded unconditionally at m4 time so that traces
(placed by autoheader and automake, respectively) will fire.  In order
to fix this while keeping the code readable, I would up doing a major
refactor.  There are now four internal macros implementing AC_REPLACE_FUNCS.

_AC_REPLACE_FUNC_U is called unconditionally for every shell word in
the list passed to AC_REPLACE_FUNCS, and does _AH_CHECK_FUNC +
AC_LIBSOURCE if it can, or issues a warning if it can’t.  (It could
make sense to make this a public function, if we think shell variables
in the AC_REPLACE_FUNCS list need to be supported long-term.  I dunno
if there’s a use case that can’t be handled by AC_REPLACE_FUNCS inside
a shell conditional just as well.)

_AC_REPLACE_FUNC_L and _AC_REPLACE_FUNC_NL implement the actual test
performed for each function to be replaced; the difference is that _L
(for literal) can only be used on a function whose name is known at m4
expansion time, _NL (nonliteral) works regardless.  _AC_REPLACE_FUNCS,
which already existed, handles looping either at m4 time or shell time
as appropriate.  AC_REPLACE_FUNCS remains a thin wrapper that runs
_AC_REPLACE_FUNCS(m4_flatten([$1])).

The _bulk_ of the patch is changes to the testsuite so that it notices
the original bug.  Specifically, AT_CHECK_AUTOHEADER now takes an
argument which is a whitespace-separated list of preprocessor macro
names that ought to appear in the generated config.h.in.  This can be
set to ‘ignore’ to skip the test, and unfortunately that’s what the
“trivial” per-macro tests have to do (AT_CHECK_MACRO and friends), so
coverage is not ideal, but it’s better than what we had.  Also,
AT_CHECK_M4 now normalizes the backtrace lines that appear in the
output of an AC_DIAGNOSE, e.g.

    configure.ac:6: warning: The macro `AC_LANG_SAVE' is obsolete.
    configure.ac:6: You should run autoupdate.
    ../../lib/autoconf/lang.m4:125: AC_LANG_SAVE is expanded from...
    configure.ac:6: the top level

becomes

    configure.ac:6: warning: The macro `AC_LANG_SAVE' is obsolete.
    configure.ac:6: You should run autoupdate.
    lang.m4: AC_LANG_SAVE is expanded from...
    configure.ac:6: the top level

This allows us to write tests for these diagnostics that don’t depend
on the relationship between the source and build directories, and
won’t break when unrelated patches change the line number of a macro
definition.

	* lib/autoconf/functions.m4 (AC_REPLACE_FUNCS, _AC_REPLACE_FUNCS)
        (_AC_REPLACE_FUNC): Refactor into AC_REPLACE_FUNCS,
        _AC_REPLACE_FUNCS, _AC_REPLACE_FUNC_U, _AC_REPLACE_FUNC_L,
        _AC_REPLACE_FUNC_NL.  Ensure that _AH_CHECK_FUNC and
        AC_LIBSOURCE are invoked unconditionally at m4 expansion
        time for each literal function name in the argument to
        AC_CHECK_FUNCS.  Issue warnings about non-literal names.

        * tests/local.at (AT_CHECK_M4): Normalize backtrace lines from
        the output of AC_DIAGNOSE / m4_warn.
        (AT_CHECK_AUTOHEADER): Add arg EXPECTED-TMPLS
        giving a list of preprocessor macro names that should appear
        in the generated config.h.in.  Use AT_CHECK_M4 to invoke autoheader.
        (_AT_CHECK_AC_MACRO, AT_CHECK_MACRO, AT_CHECK_AU_MACRO):
        Update uses of AT_CHECK_AUTOHEADER.
        * tests/fortran.at, tests/semantics.at, tests/tools.at
        * tests/torture.at: Update all uses of AT_CHECK_AUTOHEADER.

        * tests/semantics.at (AC_REPLACE_FUNCS test): Make somewhat
        more thorough, using new functionality of AT_CHECK_M4 and
        AT_CHECK_AUTOHEADER.

Signed-off-by: Zack Weinberg <zackw@panix.com>
2020-06-29 23:17:15 -07:00

1434 lines
33 KiB
Plaintext

# -*- Autotest -*-
AT_BANNER([Executables (autoheader, autoupdate...).])
# Copyright (C) 2000-2001, 2003-2004, 2006-2017, 2020 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/>.
## ----------------------------- ##
## Syntax of the shell scripts. ##
## ----------------------------- ##
# We use `/bin/sh -n script' to check that there are no syntax errors
# in the scripts. Although incredible, there are /bin/sh that go into
# endless loops with `-n', e.g., SunOS's:
#
# $ uname -a
# SunOS ondine 4.1.3 2 sun4m unknown
# $ cat endless.sh
# while false
# do
# :
# done
# exit 0
# $ time sh endless.sh
# sh endless.sh 0,02s user 0,03s system 78% cpu 0,064 total
# $ time sh -nx endless.sh
# ^Csh -nx endless.sh 3,67s user 0,03s system 63% cpu 5,868 total
#
# So before using `/bin/sh -n' to check our scripts, we first check
# that `/bin/sh -n' is not broken to death.
AT_SETUP([Syntax of the shell scripts])
AT_CHECK([test "$SHELL_N" != none || exit 77])
# Specify the absolute name of the tool, as some shells don't honor PATH when
# running `sh PROG'.
AT_CHECK_SHELL_SYNTAX(["$abs_top_builddir/bin/autoconf"])
AT_CHECK_SHELL_SYNTAX(["$abs_top_builddir/tests/autoconf"])
AT_CHECK_SHELL_SYNTAX(["$abs_top_builddir/tests/testsuite"])
# These are not built, they are in the src tree.
AT_CHECK_SHELL_SYNTAX(["$abs_top_srcdir/build-aux/install-sh"])
AT_CHECK_SHELL_SYNTAX(["$abs_top_srcdir/build-aux/missing"])
AT_CLEANUP
## ---------------------------- ##
## Syntax of the Perl scripts. ##
## ---------------------------- ##
AT_SETUP([Syntax of the Perl scripts])
AT_CHECK_PERL_SYNTAX([autoheader])
AT_CHECK_PERL_SYNTAX([autom4te])
AT_CHECK_PERL_SYNTAX([autoreconf])
AT_CHECK_PERL_SYNTAX([autoscan])
AT_CHECK_PERL_SYNTAX([autoupdate])
AT_CHECK_PERL_SYNTAX([ifnames])
AT_CLEANUP
## ------------------ ##
## autom4te's cache. ##
## ------------------ ##
AT_SETUP([autom4te cache])
AT_DATA_M4SUGAR([[script.4s]],
[[m4_include([foo])
]])
# Everything is OK.
touch foo
AT_CHECK_M4SUGAR
# We moved a file: it should fail
mkdir sub
mv foo sub
AT_CHECK_M4SUGAR([], [1], [],
[m4:script.4s:1: cannot open `foo': No such file or directory
autom4te: m4 failed with exit status: 1
])
# But if we change the main file, then we should no longer complain of
# missing files.
AT_DATA_M4SUGAR([[script.4s]],
[[m4_include([sub/foo])
]])
AT_CHECK_M4SUGAR
AT_CLEANUP
# autom4te --force
# ----------------
AT_SETUP([autom4te --force])
AT_DATA([file.m4],
[[right
]])
AT_CHECK_AUTOM4TE([-o file file.m4])
# Create a file whose timestamp is in the future.
# (next year)-01-01 00:01 UTC should always be in the future,
# even on slow machines.
echo BAD >file
this_year=`TZ=UTC0 date +%Y`
AS_VAR_ARITH([next_year], [$this_year + 1])
TZ=UTC0 touch -t ${next_year}01010001 file
AT_CHECK_AUTOM4TE([--force -o file file.m4])
AT_CHECK([cat file], 0,
[[right
]])
AT_CLEANUP
# autom4te and file names containing whitespace
# ---------------------------------------------
AT_SETUP([autom4te and whitespace in file names])
x=
export x
rm -f a b
for funny in \
'with funny '\'' $x & #! name' \
'with funny \ '\'' \'\'' " <a >b * ? name ' # "restore font-lock
do
funny=`func_sanitize_file_name "$funny"`
file=" file $funny"
outfile="$file out "
dir=`func_sanitize_dir_name " dir $funny"`
cachedir=" cache$dir"
TMPDIR=" tmp$dir"
export TMPDIR
# skip if we cannot create such a file or directory
AT_CHECK([mkdir "$dir" "$cachedir" "$TMPDIR" && touch "$file" || exit 77])
cat >"$file" <<'END'
[m4@&t@_init[]m4@&t@_include(foo.m4)
m4@&t@_divert([])d@&t@nl
FOO]
END
cat >"$dir"/foo.m4 <<'END'
[m4@&t@_define([FOO], [bar])]
END
AT_CHECK_AUTOM4TE([-C "$cachedir" -B "$dir" --language=m4sugar -o "$outfile" "$file"])
AT_CHECK([cat "$outfile"], [],
[[bar
]])
rm -rf "$outfile" "$cachedir"
AT_CHECK_AUTOM4TE([-C "$cachedir" -I "$dir" --language=m4sugar -o "$outfile" "$file"])
AT_CHECK([cat "$outfile"], [],
[[bar
]])
# This exercises a slightly different code path and will catch an open with
# trailing whitespace:
cat >"$file" <<'END'
[m4@&t@_init[]m4@&t@_include(foo.m4)
m4@&t@_pattern_forbid([^bar$])
m4@&t@_divert([])d@&t@nl
FOO]
END
rm -rf "$outfile" "$cachedir"
AT_CHECK_AUTOM4TE([-C "$cachedir" -I "$dir" --language=m4sugar -o "$outfile" "$file"],
[1], [], [stderr])
AT_CHECK([grep 'possibly undefined macro' stderr], [], [ignore])
cat >"$file" <<'END'
[m4@&t@_init[]m4@&t@_include(foo.m4)
m4@&t@_divert([])d@&t@nl]
END
rm -rf "$file.m4f"
AT_CHECK_AUTOM4TE([-C "$cachedir" -I "$dir" --language=m4sugar --freeze -o "$file.m4f" "$file"])
AT_CHECK([test -s "$file.m4f"])
# Check --reload-state
AT_CHECK_AUTOM4TE([-C "$cachedir" --language=m4sugar -o "$outfile" "$file.m4f" /dev/null])
test ! -f b
done
AT_CLEANUP
# autom4te --trace and unusual macro names
# ----------------------------------------
AT_SETUP([autom4te --trace and unusual macro names])
AT_DATA([file.m4],
[[
]])
AT_CHECK_AUTOM4TE([-t 'TR A CE' -t 'TR(A)CE' file.m4])
AT_CLEANUP
AT_SETUP([autom4te --trace and whitespace])
dnl line numbering differs between m4 1.4.6 and 1.4.13 if we don't
dnl go through a single line wrapper
AT_DATA_M4SUGAR([file.m4],
[[m4_define([foo], [m4_echo([ a
b c ], [\
d\
])])
foo
]])
AT_CHECK_AUTOM4TE([--language=m4sugar -t 'm4@&t@_echo' file.m4], [0],
[[file.m4:5:m4@&t@_echo: a b c :d
]])
AT_CLEANUP
## ------------------ ##
## autoconf --trace. ##
## ------------------ ##
# autoconf --trace: user macros
# -----------------------------
AT_SETUP([autoconf --trace: user macros])
AT_DATA([configure.ac],
[[m4_define([active], [ACTIVE])
m4_define([TRACE1], [TRACE2(m4_shift($@))])
m4_define([TRACE2], [[$2], $1])
# No arguments.
TRACE1
TRACE2
# With arguments, single line.
TRACE1(foo, @bar, @baz)
TRACE1(foo, TRACE1(bar, baz))
TRACE1(foo, active, baz)
TRACE1(foo, [active], TRACE1(active, [active]))
]])
# Several --traces.
AT_CHECK_AUTOCONF([-t TRACE1 -t TRACE2], 0,
[[configure.ac:6:TRACE1:
configure.ac:6:TRACE2:
configure.ac:7:TRACE2:
configure.ac:10:TRACE1:foo:@bar:@baz
configure.ac:10:TRACE2:@bar:@baz
configure.ac:11:TRACE1:bar:baz
configure.ac:11:TRACE2:baz
configure.ac:11:TRACE1:foo::baz
configure.ac:11:TRACE2::baz
configure.ac:12:TRACE1:foo:ACTIVE:baz
configure.ac:12:TRACE2:ACTIVE:baz
configure.ac:13:TRACE1:ACTIVE:active
configure.ac:13:TRACE2:active
configure.ac:13:TRACE1:foo:active::ACTIVE
configure.ac:13:TRACE2:active::ACTIVE
]])
# Several line requests.
AT_CHECK_AUTOCONF([[-t TRACE1:'
[$1], [$2], [$3].']], 0,
[[
[], [], [].
[foo], [@bar], [@baz].
[bar], [baz], [].
[foo], [], [baz].
[foo], [ACTIVE], [baz].
[ACTIVE], [active], [].
[foo], [active], [].
]])
# ${sep}@.
AT_CHECK_AUTOCONF([-t TRACE2:'${)===(}@'], 0,
[[[]
[]
[@bar])===([@baz]
[baz]
[])===([baz]
[ACTIVE])===([baz]
[active]
[active])===([])===([ACTIVE]
]])
# Arguments spanning multiple lines.
AT_DATA([configure.ac],
[[m4_define([TRACE], [])
TRACE(foo
bar,
bar
foo)
]])
AT_CHECK_AUTOCONF([-t TRACE:'$%'], 0,
[[foo bar:bar foo
]])
AT_CLEANUP
# autoconf --trace: builtins
# --------------------------
AT_SETUP([autoconf --trace: builtins])
AT_DATA([configure.ac],
[[define([active], [ACTIVE])
]])
AT_CHECK_AUTOCONF([[-t define | sed -n '$p']],
0,
[[configure.ac:1:define:active:ACTIVE
]])
# FIXME: Without `$1' the following test dies. Groumphf, once again to
# dive into obscure feature interaction...
# Note that using `-i' means we need the *.m4 files, not the *.m4f files,
# hence we need srcdir, not builddir.
AT_CHECK_AUTOCONF([[-t define:'$1' -i| sed -n '$p']],
0,
[[active
]])
AT_CLEANUP
# autoconf --trace: AC_CONFIG_MACRO_DIRS
# --------------------------------------
AT_SETUP([autoconf --trace: AC_CONFIG_MACRO_DIRS])
AT_KEYWORDS([AC_CONFIG_MACRO_DIR AC_CONFIG_MACRO_DIR_TRACE])
AT_DATA([configure.ac],
[[AC_INIT
AC_CONFIG_MACRO_DIR([dir1])
AC_CONFIG_MACRO_DIRS([dir2 dir3 \
dir4])
AC_CONFIG_MACRO_DIRS([dir5])
]])
# Legacy tracing
AT_CHECK_AUTOCONF([-t AC_CONFIG_MACRO_DIR], 0,
[[configure.ac:2:AC_CONFIG_MACRO_DIR:dir1
]])
# Preferred tracing
AT_CHECK_AUTOCONF([-t AC_CONFIG_MACRO_DIR_TRACE], 0,
[[configure.ac:2:AC_CONFIG_MACRO_DIR_TRACE:dir1
configure.ac:3:AC_CONFIG_MACRO_DIR_TRACE:dir2
configure.ac:3:AC_CONFIG_MACRO_DIR_TRACE:dir3
configure.ac:3:AC_CONFIG_MACRO_DIR_TRACE:dir4
configure.ac:5:AC_CONFIG_MACRO_DIR_TRACE:dir5
]])
# Legacy macro can only be used once
AT_DATA([configure.ac],
[[AC_INIT
AC_CONFIG_MACRO_DIR([dir1])
AC_CONFIG_MACRO_DIR([dir2])
]])
AT_CHECK_AUTOCONF([], [1], [], [stderr])
AT_CHECK([grep 'error: AC_CONFIG_MACRO_DIR can only be used once' stderr],
[], [ignore])
# Legacy macro must be used first, if present
AT_DATA([configure.ac],
[[AC_INIT
AC_CONFIG_MACRO_DIRS([dir1])
AC_CONFIG_MACRO_DIR([dir2])
]])
AT_CHECK_AUTOCONF([], [1], [], [stderr])
AT_CHECK([grep 'error: AC_CONFIG_MACRO_DIR can only be used once' stderr],
[], [ignore])
# Only use the public macros
AT_DATA([configure.ac],
[[AC_INIT
AC_CONFIG_MACRO_DIR_TRACE([dir1])
]])
AT_CHECK_AUTOCONF([], [1], [],
[[configure.ac:2: error: Do not invoke AC_CONFIG_MACRO_DIR_TRACE directly
configure.ac:2: the top level
autom4te: m4 failed with exit status: 1
]])
# Legacy macro use is not required, but still gets traced
AT_DATA([configure.ac],
[[AC_INIT
AC_CONFIG_MACRO_DIRS([dir1])
AC_CONFIG_MACRO_DIRS([dir2])
]])
AT_CHECK_AUTOCONF([], [0], [], [])
AT_CHECK_AUTOCONF([-t AC_CONFIG_MACRO_DIR], [0],
[[configure.ac:2:AC_CONFIG_MACRO_DIR:dir1
]])
AT_CLEANUP
## ---------------------------- ##
## autoconf: forbidden tokens. ##
## ---------------------------- ##
# autoconf: forbidden tokens, basic
# ---------------------------------
AT_SETUP([autoconf: forbidden tokens,[] basic])
AT_DATA_M4SH([configure.ac],
[[AS_INIT
m4_foo
_m4_bar
AS_FOO
_AS_BAR
[dnl]
]])
dnl This test needs autom4te's cache, in spite of any ~/.autom4te.cfg.
AT_DATA([.autom4te.cfg], [[
begin-language: "Autoconf"
args: --cache=autom4te.cache
end-language: "Autoconf"
begin-language: "Autoconf-without-aclocal-m4"
args: --cache=autom4te.cache
end-language: "Autoconf-without-aclocal-m4"
]])
AT_CHECK_AUTOCONF([], 1, [],
[[configure.ac:2: error: possibly undefined macro: m4@&t@_foo
If this token and others are legitimate, please use m4@&t@_pattern_allow.
See the Autoconf documentation.
configure.ac:3: error: possibly undefined macro: _m4@&t@_bar
configure.ac:4: error: possibly undefined macro: AS@&t@_FOO
configure.ac:5: error: possibly undefined macro: _AS@&t@_BAR
configure.ac:6: error: possibly undefined macro: d@&t@nl
]])
# Second run should succeed and yield no output.
AT_CHECK([autoconf])
AT_CLEANUP
# autoconf: forbidden tokens, exceptions
# --------------------------------------
AT_SETUP([autoconf: forbidden tokens,[] exceptions])
AT_DATA_M4SH([configure.ac],
[[AS_INIT
# This is allowed in spite of the name.
# It is on purpose that we check the case where there are several
# tokens on the same line.
m4_pattern_allow([^AS_ALLOWED$])
NOT_AS_ALLOWED AS_ALLOWED AS_ALLOWED_NOT
# Test forbidding.
m4_pattern_forbid([^FORBIDDEN$])
NOT_FORBIDDEN FORBIDDEN FORBIDDEN_NOT
# Test Autoconf's patterns.
AS_THIS_IS_INVALID and _AS_THIS_IS_INVALID_TOO
BUT_AZ_THIS_IS_NOT ALTHOUGH_AS_THIS_IS
# This is legal, although there is `AS_DEFINE' in there.
BAS_DEFINE
# AS_THIS_IS_A_COMMENT so just shut up.
It would be very bad if Autoconf forgot to expand [AS_]INIT!
]])
AT_CHECK_AUTOCONF([], 1, [],
[[configure.ac:1: error: possibly undefined macro: AS@&t@_INIT
If this token and others are legitimate, please use m4@&t@_pattern_allow.
See the Autoconf documentation.
configure.ac:7: error: possibly undefined macro: AS@&t@_ALLOWED_NOT
configure.ac:10: error: possibly undefined macro: FORBIDDEN
configure.ac:14: error: possibly undefined macro: AS@&t@_THIS_IS_INVALID
configure.ac:14: error: possibly undefined macro: _AS@&t@_THIS_IS_INVALID_TOO
]])
AT_CLEANUP
# autoconf: automatically allowed tokens
# --------------------------------------
AT_SETUP([autoconf: automatically allowed tokens])
AT_DATA_M4SH([configure.ac],
[[AC_INIT
m4_pattern_forbid([^FB_])
AC_DEFINE([FB_ONE])
AC_SUBST([FB_TWO])
AC_OUTPUT
]])
AT_CHECK_AUTOCONF
AT_CLEANUP
# autoconf: do not forbid the empty token
# ---------------------------------------
AT_SETUP([autoconf: the empty token])
AT_DATA_M4SH([configure.ac],
[[m4_init[]m4_pattern_allow([^foo$])
m4_divert([])dnl
line that begins with a space
]])
AT_CHECK_AUTOCONF
AT_CLEANUP
# autoconf: subdirectories
# ------------------------
AT_SETUP([autoconf: subdirectories])
AT_DATA([configure.ac],
[[AC_INIT
AC_PROG_MKDIR_P
AC_CONFIG_FILES(sub/foo)
AC_OUTPUT
]])
mkdir sub
AT_DATA([sub/foo.in],
[[@MKDIR_P@
]])
AT_DATA([install-sh])
AT_CHECK_AUTOCONF
AT_CHECK_CONFIGURE
AT_CHECK([[grep '^[^/].*/mkdir -p' sub/foo]], 1)
AT_CLEANUP
# autoconf: input from stdin
# --------------------------
AT_SETUP([autoconf: input from stdin])
# Past Autoconf versions failed to read from stdin when other, non-frozen input
# files were present.
AT_DATA([aclocal.m4])
AT_CHECK([echo 'AC_INIT(X, 1.0, bug-autoconf@gnu.org)' | autoconf -t AC_INIT -],
0, [stdin:1:AC_INIT:X:1.0:bug-autoconf@gnu.org
])
AT_CHECK([echo 'AC_INIT(X, 2.0, bug-autoconf@gnu.org)' | autoconf -t AC_INIT -],
0, [stdin:1:AC_INIT:X:2.0:bug-autoconf@gnu.org
])
AT_CLEANUP
# autoconf: AC_AUTOCONF_VERSION
# -----------------------------
AT_SETUP([autoconf: AC_AUTOCONF_VERSION])
AT_DATA([configure.ac],
[[AC_INIT
version m4@&t@_defn([AC_AUTOCONF_VERSION]) version
AC_OUTPUT
]])
AT_CHECK_AUTOCONF
AT_CHECK([[grep 'version ]]AT_PACKAGE_VERSION[[ version' configure]],
0, [ignore])
AT_CLEANUP
# autoconf: AC_PRESERVE_HELP_ORDER
# --------------------------------
AT_SETUP([autoconf: AC_PRESERVE_HELP_ORDER])
AT_KEYWORDS([m4@&t@_divert_text])
AT_DATA_AUTOCONF([configure.ac],
[[AC_INIT
AC_PRESERVE_HELP_ORDER
AC_ARG_WITH([one], [ --with-one])
AC_ARG_ENABLE([two], [ --enable-two])
m4_divert_text([HELP_ENABLE], [arbitrary $text])
AC_ARG_WITH([three], [ --with-three])
AC_OUTPUT
]])
AT_CHECK_AUTOCONF
AT_CHECK_CONFIGURE([--help], [], [stdout])
AT_CHECK([sed -n '/^Optional/,/^$/p' stdout], [],
[[Optional Features and Packages:
--disable-option-checking ignore unrecognized --enable/--with options
--disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
--with-one
--enable-two
arbitrary $text
--with-three
]])
AT_CLEANUP
## --------- ##
## ifnames. ##
## --------- ##
AT_SETUP([ifnames])
AT_DATA([iftest1.c],
[[#ifdef DEF1
#ifndef DEF2
#if ! defined DEF3 && defined DEF4 /* but not defined DEF5 */
# if SPACES
# if TABS
/* #if C_COMMENTS */
// #if CXX_COMMENTS
#if LINE1 = \
LINE2
#if (VAL1*VAL2)==VAL3+VAL4 /* Not VAL5 !!! */
]])
AT_DATA([iftest2.c],
[[#ifdef IFTEST2
#if VAL1
]])
AT_CHECK([ifnames iftest1.c iftest2.c], 0,
[DEF1 iftest1.c
DEF2 iftest1.c
DEF3 iftest1.c
DEF4 iftest1.c
IFTEST2 iftest2.c
LINE1 iftest1.c
LINE2 iftest1.c
SPACES iftest1.c
TABS iftest1.c
VAL1 iftest1.c iftest2.c
VAL2 iftest1.c
VAL3 iftest1.c
VAL4 iftest1.c
], [])
AT_CLEANUP
## ------------ ##
## autoheader. ##
## ------------ ##
# autoheader is intensively used in its modern form throughout this
# test suite. But we also have to check that acconfig.h still works.
# autoheader uses autoconf --trace, so traces first.
AT_SETUP([autoheader])
AT_DATA([acconfig.h],
[[/* Define this to whatever you want. */
#undef this
]])
# 1. Check that `acconfig.h' is still honored.
AT_DATA([configure.ac],
[[AC_INIT
AC_CONFIG_HEADERS(config.h:config.hin)
AC_DEFINE(this, "whatever you want.")
]])
AT_CHECK_AUTOHEADER([], [this], [0], [], [ignore])
AT_CHECK([cat config.hin], 0,
[[/* config.hin. Generated from configure.ac by autoheader. */
/* Define this to whatever you want. */
#undef this
/* Define to the address where bug reports for this package should be sent. */
#undef PACKAGE_BUGREPORT
/* Define to the full name of this package. */
#undef PACKAGE_NAME
/* Define to the full name and version of this package. */
#undef PACKAGE_STRING
/* Define to the one symbol short name of this package. */
#undef PACKAGE_TARNAME
/* Define to the home page for this package. */
#undef PACKAGE_URL
/* Define to the version of this package. */
#undef PACKAGE_VERSION
]])
# 2. Check that missing templates are a fatal error.
AT_DATA([configure.ac],
[[AC_INIT
AC_CONFIG_HEADERS(config.h:config.hin)
AC_DEFINE(that, "whatever you want.")
]])
# The test suite goes too fast for the cache timestamps...
# Pass --force.
AT_CHECK_AUTOHEADER([--force], [], [1], [], [ignore])
# 3. Check TOP and BOTTOM.
AT_DATA([acconfig.h],
[[/* Top from acconfig.h. */
@TOP@
/* Middle from acconfig.h. */
@BOTTOM@
/* Bottom from acconfig.h. */
]])
AT_DATA([configure.ac],
[[AC_INIT
AC_CONFIG_HEADERS(config.h:config.hin)
AH_TOP([Top1 from configure.ac.])
AH_TOP([Top2 from configure.ac.])
AH_TOP([The Cat in a h@t.])
AH_VERBATIM([Middle], [Middle from configure.ac.])
AH_VERBATIM([Mouse], [The Mouse in a h@t.])
AH_BOTTOM([Bottom1 from configure.ac.])
AH_BOTTOM([Bottom2 from configure.ac.])
AH_BOTTOM([The Dog in a h@t.])
AC_DEFINE([ANT], [@], [The Ant in a h@t.])
]])
# Yes, that's right: the `middle' part of `acconfig.h' is still before
# the AH_TOP part. But so what, you're not supposed to use the two
# together.
# Ignore STDERR which is the longish complaint against autoheader junk
# files.
AT_CHECK_AUTOHEADER([--force], [ANT], [], [], [ignore])
AT_CHECK([cat config.hin], 0,
[[/* config.hin. Generated from configure.ac by autoheader. */
/* Top from acconfig.h. */
/* Middle from acconfig.h. */
Top1 from configure.ac.
Top2 from configure.ac.
The Cat in a h@t.
/* The Ant in a h@t. */
#undef ANT
Middle from configure.ac.
The Mouse in a h@t.
/* Define to the address where bug reports for this package should be sent. */
#undef PACKAGE_BUGREPORT
/* Define to the full name of this package. */
#undef PACKAGE_NAME
/* Define to the full name and version of this package. */
#undef PACKAGE_STRING
/* Define to the one symbol short name of this package. */
#undef PACKAGE_TARNAME
/* Define to the home page for this package. */
#undef PACKAGE_URL
/* Define to the version of this package. */
#undef PACKAGE_VERSION
Bottom1 from configure.ac.
Bottom2 from configure.ac.
The Dog in a h@t.
/* Bottom from acconfig.h. */
]])
AT_CLEANUP
# autoheader should see through m4 macros, just like autoconf
# https://lists.gnu.org/archive/html/bug-autoconf/2009-06/msg00000.html
AT_SETUP([autoheader and macros])
AT_DATA([configure.ac],
[[AC_INIT
AC_CONFIG_HEADER([config.h])
m4_define([PETER], [SIMSALABIM])
m4_define([PAUL], [OPENSESAME])
AC_DEFINE([PETER], [10], [Peter's public info])
AC_DEFINE_UNQUOTED([PAUL], [`expr 4 + 6`], [Paul's public info])
AC_OUTPUT
]])
AT_CHECK_AUTOCONF
AT_CHECK_AUTOHEADER([], [OPENSESAME SIMSALABIM])
AT_CHECK([grep -c SIMSALABIM configure config.h.in], [0],
[[configure:1
config.h.in:1
]])
AT_CHECK([grep -c OPENSESAME configure config.h.in], [0],
[[configure:1
config.h.in:1
]])
AT_CHECK([grep -c PETER configure config.h.in], [1],
[[configure:0
config.h.in:0
]])
AT_CHECK([grep -c PAUL configure config.h.in], [1],
[[configure:0
config.h.in:0
]])
AT_CLEANUP
# autoheader should take all config header inputs into account when
# checking for missing templates.
AT_SETUP([autoheader with multiple headers])
AT_DATA([config-extra.h.in],
[[/* Define this to whatever you want. */
#undef HANNA
]])
AT_DATA([configure.ac],
[[AC_INIT
AC_CONFIG_HEADERS([config.h config-extra.h])
AC_DEFINE([HANNA], ["Hanna"])
AC_DEFINE([SEAN], ["Sean"], [Sean's name])
AC_OUTPUT
]])
AT_CHECK_AUTOCONF
AT_CHECK_AUTOHEADER([], [SEAN])
AT_CHECK([grep HANNA configure], [0], [ignore], [ignore])
AT_CHECK([grep HANNA config.h.in], [1], [ignore], [ignore])
AT_CHECK([grep SEAN configure], [0], [ignore], [ignore])
AT_CHECK([grep SEAN config.h.in], [0], [ignore], [ignore])
AT_CLEANUP
## ------------ ##
## autoupdate. ##
## ------------ ##
# Check that AC_CANONICAL_SYSTEM and AC_OUTPUT are properly updated.
AT_SETUP([autoupdate])
AT_DATA([configure.ac],
[[AC_INIT(Test, 1.0)
AC_CANONICAL_SYSTEM
# The doc says 27 is a valid fubar.
fubar=27
AC_OUTPUT(Makefile, echo $fubar, fubar=$fubar)
]])
AT_DATA([expout],
[[AC_INIT([Test],[1.0])
AC_CANONICAL_TARGET
# The doc says 27 is a valid fubar.
fubar=27
AC_CONFIG_FILES([Makefile])
AC_CONFIG_COMMANDS([default],[echo $fubar],[fubar=$fubar])
AC_OUTPUT
]])
# Checking `autoupdate'.
AT_CHECK_AUTOUPDATE
AT_CHECK([cat configure.ac], 0, [expout])
# Checking that `autoupdate' is idempotent
AT_CHECK_AUTOUPDATE
AT_CHECK([cat configure.ac], 0, [expout])
AT_CLEANUP
# autoupdating AC_LINK_FILES
# --------------------------
AT_SETUP([autoupdating AC_LINK_FILES])
AT_DATA([configure.ac],
[[AC_INIT
AC_LINK_FILES(dst1 dst2, src1 src2)
AC_OUTPUT
]])
AT_DATA([dst1], dst1
)
AT_DATA([dst2], dst2
)
# Checking `autoupdate'.
AT_CHECK_AUTOUPDATE([], 0, [], ignore)
AT_CHECK_AUTOCONF
AT_CHECK_CONFIGURE
AT_CHECK([cat src1], 0, [dst1
])
AT_CHECK([cat src2], 0, [dst2
])
AT_CLEANUP
# autoupdating AC_PREREQ
# ----------------------
AT_SETUP([autoupdating AC_PREREQ])
# Produce `AC_PREREQ(<AUTOUPDATE VERSION>)'.
AT_CHECK([autoupdate --version | sed 's/.*) //;q'], 0, [stdout])
autoupdate_version=`cat stdout`
[echo "AC_PREREQ([$autoupdate_version])" >expout]
AT_CHECK([echo "AC_PREREQ(1.0)" | autoupdate -],
0, [expout], [])
AT_CHECK([echo "AC_PREREQ($autoupdate_version)" | autoupdate -],
0, [expout], [])
AT_CHECK([echo "AC_PREREQ(999.99)" | autoupdate -],
63, [], [ignore])
AT_CLEANUP
# autoupdating AU_ALIAS
# ---------------------
AT_SETUP([autoupdating AU_ALIAS])
AT_DATA([configure.ac],
[[AC_INIT
AC_DEFUN([FOO], [$#])
AU_ALIAS([BAZ],[FOO])
test "FOO:FOO():FOO(x) BAZ:BAZ():BAZ(x)" = "0:1:1 0:1:1" || exit 1
AC_PROG_CC
AC_WORDS_BIGENDIAN
AC_OUTPUT
]])
# Checking `autoupdate'.
AT_CHECK_AUTOUPDATE
AT_CHECK_AUTOCONF
AT_CHECK_CONFIGURE
AT_CHECK([grep 'AC_C_BIGENDIAN[(]' configure.ac], 1, [ignore], [ignore])
AT_CHECK([grep 'AC_C_BIGENDIAN' configure.ac], 0, [ignore], [ignore])
AT_CLEANUP
# autoupdating OLD to NEW
# -----------------------
# The example taken from the code comments.
AT_SETUP([autoupdating OLD to NEW])
AT_DATA([aclocal.m4],
[[AU_DEFUN([OLD], [NEW([$1, $2], m4@&t@_eval([$1 + $2]))])
AC_DEFUN([NEW], [echo "sum($1) = $2"])
]])
AT_DATA([configure.ac],
[[AC_INIT
OLD(1, 2)
NEW([0, 0], [0])
]])
# Checking `autoupdate'.
AT_CHECK_AUTOUPDATE
AT_CHECK_AUTOCONF
AT_CHECK_CONFIGURE
AT_CHECK([[grep 'NEW(\[1, 2], *\[3])' configure.ac]], 0, [ignore], [ignore])
AT_CHECK([[grep 'NEW(\[0, 0], *\[0])' configure.ac]], 0, [ignore], [ignore])
AT_CLEANUP
# autoupdating macros recursively
# -------------------------------
AT_SETUP([autoupdating macros recursively])
AT_XFAIL_IF([:])
AT_DATA([configure.ac],
[[AC_INIT
AC_PROG_CC
AC_TRY_COMPILE([], [choke me], [echo bogus1],
[AC_TRY_COMPILE([], [return 0;], [echo good], [echo bogus2])])
AC_OUTPUT
]])
# Checking `autoupdate'.
AT_CHECK_AUTOUPDATE
AT_CHECK([grep changequote configure.ac], [1])
AT_CHECK([grep TRY_COMPILE configure.ac], [1])
AT_CHECK_AUTOCONF
AT_CHECK_CONFIGURE
AT_CLEANUP
# autoupdating AC_HELP_STRING
# ---------------------------
AT_SETUP([autoupdating AC_HELP_STRING])
AT_DATA([configure.ac],
[[AC_INIT
AC_ARG_ENABLE([foo], [AC_HELP_STRING([--enable-foo], [foo bar])], [:], [:])
]])
# Checking `autoupdate'.
AT_CHECK_AUTOUPDATE([], [], [], [ignore])
AT_CHECK_AUTOCONF
AT_CHECK_CONFIGURE([], [], [], [ignore])
AT_CHECK([[grep '\[--enable-foo], *\[foo bar]' configure.ac]], 0, [ignore], [ignore])
AT_CLEANUP
# autoupdating with m4sugar
# -------------------------
AT_SETUP([autoupdating with m4sugar])
AT_DATA([aclocal.m4],
[[AU_DEFUN([OLD],
[m4@&t@_pushdef([foo], [bar])dn@&t@l
echo "foo $1 foo"
m4@&t@_popdef([foo])dn@&t@l
])
]])
touch foo.in
AT_DATA([configure.ac],
[[AC_PREREQ(2.54)
m4_define([gnumeric_version_epoch], [1])
AC_INIT
OLD([ bla bla ])
AC_FOREACH([name], [n1 n2],
[echo name
])
AC_CHECKING([for feature])
AC_MSG_RESULT_UNQUOTED([`echo done`])
AC_OUTPUT([foo])
]])
# Checking `autoupdate'.
AT_CHECK_AUTOUPDATE([], [], [], [ignore])
AT_CHECK_AUTOCONF
AT_CHECK_CONFIGURE([], [], [], [ignore])
AT_CLEANUP
# autoupdating with m4_pushdef
# ----------------------------
AT_SETUP([autoupdating with m4@&t@_pushdef])
AT_XFAIL_IF([:])
touch foo.in
AT_DATA([configure.ac],
[[AC_INIT
AC_PROG_CC
# temporarily override this macro
m4@&t@_pushdef([AC_MSG_RESULT_UNQUOTED], [:])
AC_C_BIGENDIAN
m4@&t@_popdef([AC_MSG_RESULT_UNQUOTED])
AC_OUTPUT
]])
# Checking `autoupdate'.
AT_CHECK_AUTOUPDATE([], [], [], [ignore])
AT_CHECK([grep changequote configure.ac], [1])
AT_CHECK([grep [pushdef.*AC_MSG_RESULT_UNQUOTED] configure.ac], [0], [ignore])
AT_CHECK_AUTOCONF
AT_CHECK_CONFIGURE([], [], [], [ignore])
AT_CLEANUP
# autoupdating with AC_REQUIRE
# ----------------------------
AT_SETUP([autoupdating with AC_REQUIRE])
AT_XFAIL_IF([:])
AT_DATA([configure.ac],
[[AC_DEFUN([MACRO],
[AC_REQUIRE([AC_DECL_SYS_SIGLIST])
AC_CHECK_DECLS([_sys_siglist], [], [], [#include <signal.h>])
])
AC_INIT
MACRO
AC_OUTPUT
]])
# Checking `autoupdate'.
AT_CHECK_AUTOUPDATE([], [], [], [ignore])
AT_CHECK_AUTOCONF
AT_CHECK_CONFIGURE([], [], [], [ignore])
AT_CLEANUP
# autoupdating with complex quoting
# ---------------------------------
AT_SETUP([autoupdating with complex quoting])
AT_XFAIL_IF([:])
AT_DATA([configure.ac],
[[m4_define([MACRO],
[[#define STRING "hello, world\n"
]])
AC_INIT
AC_TRY_COMPILE([#include <stdio.h>
]MACRO[], [printf (STRING);],
[], [AS_EXIT([1])])
AC_OUTPUT
]])
# Checking `autoupdate'.
AT_CHECK_AUTOUPDATE([], [], [], [ignore])
AT_CHECK_AUTOCONF
AT_CHECK([grep MACRO configure], [1])
AT_CHECK_CONFIGURE([], [], [], [ignore])
AT_CLEANUP
# autoupdating AC_LANG_SAVE
# -------------------------
AT_SETUP([autoupdating AC_LANG_SAVE])
AT_DATA([configure.ac],
[[AC_INIT
AC_LANG_SAVE
AC_LANG_RESTORE
AC_LANG_SAVE
AC_LANG_RESTORE
]])
# Checking `autoupdate'.
AT_CHECK_AUTOUPDATE([], [], [], [ignore])
AT_CHECK_AUTOCONF
AT_CHECK_CONFIGURE([], [], [], [ignore])
AT_CLEANUP
# autoupdating AC_FOREACH
# -----------------------
AT_SETUP([autoupdating AC_FOREACH])
AT_DATA([aclocal.m4],
[[AU_DEFUN([OLD], [AC_FOREACH([myvar], [4 5 6], [' myvar'])])
]])
AT_DATA([configure.ac],
[[AC_INIT
echo AC_FOREACH([myvar], [1 2 3], [' myvar'])OLD
]])
# Checking `autoupdate'.
AT_CHECK_AUTOUPDATE
AT_CHECK([[grep 'echo 1 2 3 4 5 6' configure.ac]], 1, [ignore], [ignore])
AT_CHECK([[grep 'm4@&t@_foreach_w' configure.ac]], 0, [ignore], [ignore])
AT_CHECK_AUTOCONF
AT_CHECK_CONFIGURE([], [0], [stdout])
AT_CHECK([[grep ' 1 2 3 4 5 6' stdout]], 0, [ignore], [ignore])
AT_CLEANUP
# autoupdating with aclocal and m4_include
# ----------------------------------------
AT_SETUP([autoupdating with aclocal and m4@&t@_include])
# We use aclocal.
AT_CHECK([aclocal --version || exit 77], [], [ignore], [ignore])
mkdir m4 aclocal
AT_DATA([configure.ac],
[[AC_INIT(x,0)
AC_UNCHANGED_MACRO
AC_OLD_MACRO
AC_OUTPUT
]])
AT_DATA([m4/stuff.m4],
[[AU_ALIAS([AC_OLD_MACRO], [AC_NEW_MACRO])
AC_DEFUN([AC_NEW_MACRO], [echo hi])
AC_DEFUN([AC_UNCHANGED_MACRO], [echo one])
]])
cp m4/stuff.m4 aclocal/stuff.m4
AT_CHECK([aclocal -I aclocal], [0], [ignore], [ignore])
# Checking `autoupdate'.
AT_CHECK_AUTOUPDATE
AT_CHECK([aclocal -I m4], [0], [ignore], [ignore])
AT_CHECK_AUTOUPDATE
AT_CLEANUP
# Keeping autom4te.cfg complete
# -----------------------------
AT_SETUP([autom4te preselections])
: ${sleep='sleep 1'} # Command to force different timestamps.
# If this test should run on FAT file systems and older w32,
# then setting $sleep correctly needs to be revisited.
# We use aclocal and automake. Skip broken automake wrappers.
AT_CHECK([automake --version || exit 77], [], [stdout], [ignore])
AT_CHECK([[grep '[1-9]\.[0-9]' stdout || exit 77]], [], [ignore])
AT_CHECK([test ! -f $HOME/.autom4te.cfg || exit 77], [], [ignore], [ignore])
AT_DATA([configure.ac],
[[AC_INIT(GNU foo, 1.0)
AM_INIT_AUTOMAKE
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
]])
AT_DATA([Makefile.am],
[[AUTOMAKE_OPTIONS = foreign
]])
$sleep # `aclocal.m4' should be strictly younger than its inputs
# If Autoconf is too old, or the user has turned caching off, skip:
AT_CHECK([aclocal || { ret=$?; test $ret -eq 63 && ret=77; exit $ret; }],
[], [], [ignore])
AT_CHECK([test -d autom4te.cache || exit 77])
AT_CHECK([autoconf])
# If this test fails due to missing entries in lib/autom4te.in, then
# comparing the old and new requests is a good place to start debugging:
sort autom4te.cache/requests >old-requests
echo newer >newer
$sleep # if `configure' is regenerated, we want it to be strictly newer,
# to catch the error consistently.
AT_CHECK([aclocal], [], [], [ignore])
AT_CHECK([automake --no-force --add-missing], [], [], [ignore])
AT_CHECK([autoconf])
AT_CHECK([test "`find configure -newer newer`" = "" ||
{ sort autom4te.cache/requests | diff old-requests -; exit 1; }],
[], [], [],
[extract_version=['s/^[^0-9]*\([0-9][^ ]*\).*/\1/;q']
automake_version=`automake --version | sed "$extract_version"`
used_automake_version=`sed "$extract_version" "$abs_top_srcdir/Makefile.in"`
AT_CHECK([if test "$automake_version" = "$used_automake_version"; ]dnl
[then exit 1; else exit 77; fi])])
AT_CLEANUP
# autom4te cache creation
# -----------------------
# Ensure autom4te fails when it cannot create the cache directory
# or create files there.
AT_SETUP([autom4te cache creation])
AT_CHECK([test ! -f $HOME/.autom4te.cfg || exit 77], [], [ignore], [ignore])
# Work in a subdirectory so autotest can scribble in the toplevel.
mkdir sub
chmod a-w sub
AT_DATA([configure.ac],
[[AC_INIT
]])
AT_DATA([.autom4te.cfg],
[[begin-language: "Autoconf-without-aclocal-m4"
args: --cache=sub/autom4te.cache
end-language: "Autoconf-without-aclocal-m4"
]])
# Do not try this when we are root or on systems without permissions.
# A failed redirection may cause a status of 2 with FreeBSD sh.
AT_CHECK([(: > sub/some-file) || exit 1 && exit 77], 1, [ignore], [ignore])
# Failure to create cache directory.
AT_CHECK_AUTOCONF([], [1], [ignore], [stderr])
AT_CHECK([grep 'cannot create .*autom4te.cache' stderr], [0], [ignore])
AT_CHECK([test -f configure], [1])
chmod u+w sub
AT_CHECK_AUTOCONF
rm -f configure sub/autom4te.cache/*
chmod a-w sub/autom4te.cache
# Failure to create a file in the cache directory.
AT_CHECK_AUTOCONF([], [1], [ignore], [stderr])
AT_CHECK([grep 'cannot open.*autom4te.cache' stderr], [0], [ignore])
AT_CLEANUP
# autom4te cache locking
# ----------------------
AT_SETUP([autom4te cache locking])
# Cannot use AT_CHECK here, autotest internals could be messed up.
(echo AC_INIT; sleep 2; echo) \
| (autom4te --language=autoconf -o configure -; echo $? >&2 ) 2>errlog &
AT_CHECK([echo AC_INIT | autom4te --language=autoconf -o configure -])
wait
# Ignore additional output from shell verbose or xtrace mode.
AT_CHECK([grep 'cannot rename' errlog], [1])
AT_CHECK([grep '^0$' errlog], [], [ignore])
AT_CHECK_CONFIGURE
AT_CLEANUP
# autotools and file names containing whitespace
# ----------------------------------------------
AT_SETUP([autotools and whitespace in file names])
# We use aclocal.
AT_CHECK([aclocal --version || exit 77], [], [ignore], [ignore])
x=
export x
rm -f a b
for funny in \
'with funny '\'' $x & #! name ' \
'with funny \ '\'' \'\'' " <a >b * ? name ' #"
do
funny=`func_sanitize_file_name "$funny"`
file=" file $funny"
dir=`func_sanitize_dir_name " dir $funny"`
TMPDIR="./ tmp$dir"
export TMPDIR
# skip if we cannot create such a file or directory
AT_CHECK([mkdir "$dir" "$TMPDIR" && touch "$file.ac" || exit 77])
cat >"$file.ac" <<'END'
[AC_INIT(x,0)
m4@&t@_include([foo.m4])
AC_CONFIG_HEADERS([config.h:config.hin])
AC_MACRO
AC_OUTPUT]
END
cat >"$dir"/foo.m4 <<'END'
[AC_DEFUN([AC_MACRO], [echo hi])]
END
AT_CHECK_AUTOHEADER([-B "$dir" "$file.ac"])
AT_CHECK_AUTOHEADER([--force -I "$dir" "$file.ac"])
AT_CHECK_AUTOUPDATE([-B "$dir" "$file.ac"])
AT_CHECK_AUTOUPDATE([--force -I "$dir" "$file.ac"])
AT_CHECK_AUTOUPDATE([-B "$dir" - < "$file.ac"], [], [ignore])
AT_CHECK_AUTOCONF([-B "$dir" -o "$file" "$file.ac"])
AT_CHECK_AUTOCONF([-I "$dir" -o "$file" "$file.ac"])
# In autoconf, these exercise a slightly different code path:
AT_CHECK_AUTOCONF([--prepend-include="$dir" -o "$file" "$file.ac"])
AT_CHECK_AUTOCONF([--include="$dir" -o "$file" "$file.ac"])
AT_CHECK([autoscan -B "$dir"], [], [], [ignore])
AT_CHECK([autoscan --force -I "$dir"], [], [], [ignore])
# autoreconf requires a sane input file name. Also, disable aclocal.
mv -f "$file.ac" configure.ac
AT_DATA([aclocal.m4])
AT_CHECK([autoreconf -B "$dir"])
AT_CHECK([autoreconf --force -I "$dir"])
cat >"$file.c" <<'END'
#if FOO
#endif
END
AT_CHECK([ifnames "$file.c"], [], [ignore])
test ! -f b
done
AT_CLEANUP