# -*- Autotest -*-AT_BANNER([Executables (autoheader, autoupdate...).])# Copyright (C) 2000, 2001, 2003, 2004, 2006 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 2, 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, write to the Free Software# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA# 02110-1301, USA.## ----------------------------- #### 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 "$ac_cv_sh_n_works" = yes || 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 fooAT_CHECK_M4SUGAR# We moved a file: it should failmkdir submv foo subAT_CHECK_M4SUGAR([], [1], [],[m4:script.4s:1: cannot open `foo': No such file or directoryautom4te: 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_M4SUGARAT_CLEANUP# autom4te --force# ----------------AT_SETUP([autom4te --force])AT_DATA([file.m4],[[right]])AT_CHECK_AUTOM4TE([-o file file.m4])# Create a file whose time stamp is in the future.# (next year)-01-01 00:01 UTC should always be in the future,# even on slow machines.echo BAD >filethis_year=`TZ=UTC0 date +%Y`TZ=UTC0 touch -t `expr $this_year + 1`01010001 fileAT_CHECK_AUTOM4TE([--force -o file file.m4])AT_CHECK([cat file], 0,[[right]])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.TRACE1TRACE2# 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:@bazconfigure.ac:10:TRACE2:@bar:@bazconfigure.ac:11:TRACE1:bar:bazconfigure.ac:11:TRACE2:bazconfigure.ac:11:TRACE1:foo::bazconfigure.ac:11:TRACE2::bazconfigure.ac:12:TRACE1:foo:ACTIVE:bazconfigure.ac:12:TRACE2:ACTIVE:bazconfigure.ac:13:TRACE1:ACTIVE:activeconfigure.ac:13:TRACE2:activeconfigure.ac:13:TRACE1:foo:active::ACTIVEconfigure.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(foobar,barfoo)]])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: forbidden tokens. #### ---------------------------- ### autoconf: forbidden tokens, basic# ---------------------------------AT_SETUP([autoconf: forbidden tokens, basic])AT_DATA_M4SH([configure.ac],[[AS_INITm4_foo_m4_barAS_FOO_AS_BAR[dnl]]])AT_CHECK_AUTOCONF([], 1, [],[[configure.ac:2: error: possibly undefined macro: m4@&t@_fooIf 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@_barconfigure.ac:4: error: possibly undefined macro: AS@&t@_FOOconfigure.ac:5: error: possibly undefined macro: _AS@&t@_BARconfigure.ac:6: error: possibly undefined macro: d@&t@nl]])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_TOOBUT_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@_INITIf 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_NOTconfigure.ac:10: error: possibly undefined macro: FORBIDDENconfigure.ac:14: error: possibly undefined macro: AS@&t@_THIS_IS_INVALIDconfigure.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_INITm4_pattern_forbid([^FB_])AC_DEFINE([FB_ONE])AC_SUBST([FB_TWO])AC_OUTPUT]])AT_CHECK_AUTOCONFAT_CLEANUP# autoconf: do not forbid the empty token# ---------------------------------------AT_SETUP([autoconf: the empty token])AT_DATA_M4SH([configure.ac],[[m4_pattern_allow([^foo$])m4_divert([0])dnlline that begins with a space]])AT_CHECK_AUTOCONFAT_CLEANUP# autoconf: subdirectories# ------------------------AT_SETUP([autoconf: subdirectories])AT_DATA([configure.ac],[[AC_INITAC_PROG_MKDIR_PAC_CONFIG_FILES(sub/foo)AC_OUTPUT]])mkdir subAT_DATA([sub/foo.in],[[@MKDIR_P@]])AT_DATA([install-sh])AT_CHECK_AUTOCONFAT_CHECK_CONFIGUREAT_CHECK([[grep '^[^/].*/mkdir -p' sub/foo]], 1)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.cDEF2 iftest1.cDEF3 iftest1.cDEF4 iftest1.cIFTEST2 iftest2.cLINE1 iftest1.cLINE2 iftest1.cSPACES iftest1.cTABS iftest1.cVAL1 iftest1.c iftest2.cVAL2 iftest1.cVAL3 iftest1.cVAL4 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_INITAC_CONFIG_HEADERS(config.h:config.hin)AC_DEFINE(this, "whatever you want.")]])AT_CHECK_AUTOHEADER([], [], [], [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 version of this package. */#undef PACKAGE_VERSION]])# 2. Check that missing templates are a fatal error.AT_DATA([configure.ac],[[AC_INITAC_CONFIG_HEADERS(config.h:config.hin)AC_DEFINE(that, "whatever you want.")]])# The test suite goes too fast for the cache time stamps...# 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_INITAC_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 longuish complaint against autoheader junk# files.AT_CHECK_AUTOHEADER([--force], [], [], [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 ANTMiddle 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 version of this package. */#undef PACKAGE_VERSIONBottom1 from configure.ac.Bottom2 from configure.ac.The Dog in a h@t./* Bottom from acconfig.h. */]])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=27AC_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=27AC_CONFIG_FILES([Makefile])AC_CONFIG_COMMANDS([default],[echo $fubar],[fubar=$fubar])AC_OUTPUT]])# Checking `autoupdate'.AT_CHECK_AUTOUPDATEAT_CHECK([cat configure.ac], 0, [expout])# Checking that `autoupdate' is idempotentAT_CHECK_AUTOUPDATEAT_CHECK([cat configure.ac], 0, [expout])AT_CLEANUP(configure.ac~)# autoupdating AC_LINK_FILES# --------------------------AT_SETUP([autoupdating AC_LINK_FILES])AT_DATA([configure.ac],[[AC_INITAC_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_AUTOCONFAT_CHECK_CONFIGUREAT_CHECK([cat src1], 0, [dst1])AT_CHECK([cat src2], 0, [dst2])AT_CLEANUP(src1 src2 configure.ac~)# 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)" >expoutAT_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_INITAC_DEFUN([FOO], [$#])AU_ALIAS([BAZ],[FOO])test "FOO:FOO():FOO(x) BAZ:BAZ():BAZ(x)" = "0:1:1 0:1:1" || exit 1AC_PROG_CCAC_STDC_HEADERSAC_OUTPUT]])# Checking `autoupdate'.AT_CHECK_AUTOUPDATEAT_CHECK_AUTOCONFAT_CHECK_CONFIGUREAT_CHECK([grep 'AC_HEADER_STDC(' configure.ac], 1, [ignore], [ignore])AT_CHECK([grep 'AC_HEADER_STDC' 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_INITOLD(1, 2)NEW([0, 0], [0])]])# Checking `autoupdate'.AT_CHECK_AUTOUPDATEAT_CHECK_AUTOCONFAT_CHECK_CONFIGUREAT_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 AC_HELP_STRING# ---------------------------AT_SETUP([autoupdating AC_HELP_STRING])AT_DATA([configure.ac],[[AC_INITAC_ARG_ENABLE([foo], [AC_HELP_STRING([--enable-foo], [foo bar])], [:], [:])]])# Checking `autoupdate'.AT_CHECK_AUTOUPDATE([], [], [], [ignore])AT_CHECK_AUTOCONFAT_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@lecho "foo $1 foo"m4@&t@_popdef([foo])dn@&t@l])]])touch foo.inAT_DATA([configure.ac],[[AC_PREREQ(2.54)m4_define([gnumeric_version_epoch], [1])AC_INITOLD([ 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_AUTOCONFAT_CHECK_CONFIGURE([], [], [], [ignore])AT_CLEANUP# autoupdating AC_LANG_SAVE# -------------------------AT_SETUP([autoupdating AC_LANG_SAVE])AT_DATA([configure.ac],[[AC_INITAC_LANG_SAVEAC_LANG_RESTOREAC_LANG_SAVEAC_LANG_RESTORE]])# Checking `autoupdate'.AT_CHECK_AUTOUPDATE([], [], [], [ignore])AT_CHECK_AUTOCONFAT_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_INITecho AC_FOREACH([myvar], [1 2 3], [' myvar'])OLD]])# Checking `autoupdate'.AT_CHECK_AUTOUPDATEAT_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_AUTOCONFAT_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 aclocalAT_DATA([configure.in],[[AC_INIT(x,0)AC_UNCHANGED_MACROAC_OLD_MACROAC_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.m4AT_CHECK([aclocal -I aclocal], [0], [ignore], [ignore])# Checking `autoupdate'.AT_CHECK_AUTOUPDATEAT_CHECK([aclocal -I m4], [0], [ignore], [ignore])AT_CHECK_AUTOUPDATEAT_CLEANUP