mirror of
git://git.sv.gnu.org/autoconf
synced 2025-03-07 14:26:52 +08:00
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>
1434 lines
33 KiB
Plaintext
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
|