Fix the passing of $? to ACTION-IF-FAILED in AC_TRY_RUN, that

generates too many bug reports.
* lib/autoconf/general.m4 (_AC_RUN_IFELSE): Pass the right exit
status when executing the ACTION-IF-FALSE.
* tests/base.at (AC_TRY_*): Rename as...
(AC_TRY_COMMAND): this.
(AC_RUN_IFELSE): New.
* tests/compile.at (Extensions, C keywords)
(AC_PROG_CPP requires AC_PROG_CC, GNU Fortran 77)
(Broken/missing compilers, AC_PROG_CPP with warnings)
(AC_PROG_CPP without warnings, AC_PROG_CPP via CC): Move to...
* tests/c.at (Extensions, C keywords)
(Broken/missing compilers, AC_PROG_CPP with warnings)
(AC_PROG_CPP without warnings, AC_PROG_CPP via CC)
(AC_PROG_CPP requires AC_PROG_CC): here and...
* tests/fortran.at (GNU Fortran 77): there.
* doc/autoconf.texi (autoconf Invocation): Fix the example:
AC_TRY_RUN is about compilation, not shell commands.
(Test Programs): AC_TRY_RUN works as used to be advertised.
This commit is contained in:
Akim Demaille 2001-09-27 13:28:15 +00:00
parent fdbf12e8a5
commit 32876525ac
11 changed files with 363 additions and 245 deletions

View File

@ -1,3 +1,26 @@
2001-09-27 Akim Demaille <akim@epita.fr>
Fix the passing of $? to ACTION-IF-FAILED in AC_TRY_RUN, that
generates too many bug reports.
* lib/autoconf/general.m4 (_AC_RUN_IFELSE): Pass the right exit
status when executing the ACTION-IF-FALSE.
* tests/base.at (AC_TRY_*): Rename as...
(AC_TRY_COMMAND): this.
(AC_RUN_IFELSE): New.
* tests/compile.at (Extensions, C keywords)
(AC_PROG_CPP requires AC_PROG_CC, GNU Fortran 77)
(Broken/missing compilers, AC_PROG_CPP with warnings)
(AC_PROG_CPP without warnings, AC_PROG_CPP via CC): Move to...
* tests/c.at (Extensions, C keywords)
(Broken/missing compilers, AC_PROG_CPP with warnings)
(AC_PROG_CPP without warnings, AC_PROG_CPP via CC)
(AC_PROG_CPP requires AC_PROG_CC): here and...
* tests/fortran.at (GNU Fortran 77): there.
* doc/autoconf.texi (autoconf Invocation): Fix the example:
AC_TRY_RUN is about compilation, not shell commands.
(Test Programs): AC_TRY_RUN works as used to be advertised.
2001-09-27 Akim Demaille <akim@epita.fr>
* lib/m4sugar/m4sh.m4 (AS_SHELL_SANITIZE): Fix bugs spotted by

2
NEWS
View File

@ -36,6 +36,8 @@
** Bug fixes
- The top level $prefix is propagated to the AC_CONFIG_SUBDIRS configures.
- AC_TRY_RUN
Under the user pressure, $? is finally available. Probably a mistake.
** C Macros
- AC_C_BIGENDIAN supports the cross-compiling case.

View File

@ -1214,7 +1214,7 @@ on this @file{configure.ac}:
@example
AC_DEFUN([INNER],
[AC_TRY_RUN([true])])
[AC_TRY_RUN([exit (0)])])
AC_DEFUN([OUTER],
[INNER])
@ -5489,9 +5489,7 @@ system while configuring.
@acindex TRY_RUN
If @var{program} compiles and links successfully and returns an exit
status of 0 when executed, run shell commands @var{action-if-true}.
Otherwise, run shell commands @var{action-if-false}; the exit status of
the program should be available in the shell variable @samp{$?}, but has
never been: don't depend on this.
Otherwise, run shell commands @var{action-if-false}.
This macro double quotes @var{program}, the text of a program in the
current language (@pxref{Language Choice}), on which shell variable and
@ -5504,6 +5502,15 @@ the system where @code{configure} is being run, then the test program is
not run. If the optional shell commands @var{action-if-cross-compiling}
are given, they are run instead. Otherwise, @code{configure} prints
an error message and exits.
In the @var{action-if-false} section, the exit status of the program is
available in the shell variable @samp{$?}, but be very careful to limit
yourself to positive values smaller than 127; bigger values shall be
saved into a file by the @var{program}. Note also that you have simply
no guarantee that this exit status is issued by the @var{program}, or by
the failure of its compilation. In other words, use this feature if
sadist only, it was reestablished because the Autoconf maintainers grew
tired of receiving ``bug reports''.
@end defmac
Try to provide a pessimistic default value to use when cross-compiling

View File

@ -2337,7 +2337,9 @@ AS_IF([AC_TRY_EVAL(ac_link) && AC_TRY_COMMAND(./conftest$ac_exeext)],
[echo "$as_me: program exited with status $ac_status" >&AS_MESSAGE_LOG_FD
echo "$as_me: failed program was:" >&AS_MESSAGE_LOG_FD
cat conftest.$ac_ext >&AS_MESSAGE_LOG_FD
m4_ifvaln([$3], [$3])dnl])[]dnl
m4_ifvaln([$3],
[( exit $ac_status )
$3])dnl])[]dnl
rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext m4_ifval([$1],
[conftest.$ac_ext])[]dnl
])# _AC_RUN_IFELSE

View File

@ -39,7 +39,7 @@ TESTSUITE_HAND_AT = \
suite.at \
m4sugar.at m4sh.at \
base.at tools.at torture.at \
compile.at \
compile.at c.at fortran.at \
semantics.at \
foreign.at

View File

@ -87,7 +87,7 @@ TESTSUITE_HAND_AT = \
suite.at \
m4sugar.at m4sh.at \
base.at tools.at torture.at \
compile.at \
compile.at c.at fortran.at \
semantics.at \
foreign.at
@ -129,7 +129,7 @@ CONFIG_CLEAN_FILES = autoconf autoheader autom4te autoreconf autoscan \
autoupdate ifnames
DIST_SOURCES =
DIST_COMMON = README Makefile.am Makefile.in autom4te.in autoreconf.in \
autoupdate.in wrappl.in wrapsh.in
autoupdate.in configure configure.ac wrappl.in wrapsh.in
all: all-am
.SUFFIXES:

View File

@ -181,42 +181,6 @@ AT_CHECK_CONFIGURE
AT_CLEANUP
## ---------------------- ##
## AC_REQUIRE & AC_LANG. ##
## ---------------------- ##
AT_SETUP([AC_REQUIRE & AC_LANG])
AT_DATA([configure.ac],
[[AC_DEFUN([AC_F77_1],
[AC_LANG_PUSH([Fortran 77])
if test $ac_ext != f; then
AC_MSG_ERROR([F77_1: current shell language is $ac_ext, expected Fortran])
fi
AC_LANG_POP
])
AC_DEFUN([AC_F77_2],
[AC_LANG_PUSH([Fortran 77])
AC_REQUIRE([AC_F77_1])
if test $ac_ext != f; then
AC_MSG_ERROR([F77_2: current shell language is $ac_ext, expected Fortran])
fi
AC_LANG_POP
])
AC_INIT
AC_F77_2
AS_EXIT(0)
]])
AT_CHECK_AUTOCONF
AT_CHECK_CONFIGURE
AT_CLEANUP
## ---------------- ##
## AC_CACHE_CHECK. ##
## ---------------- ##
@ -238,11 +202,11 @@ AT_CHECK_CONFIGURE([-q])
AT_CLEANUP
## ---------- ##
## AC_TRY_*. ##
## ---------- ##
## ---------------- ##
## AC_TRY_COMMAND. ##
## ---------------- ##
AT_SETUP([AC_TRY_*])
AT_SETUP([AC_TRY_COMMAND])
AT_DATA([configure.ac],
[[AC_INIT

211
tests/c.at Normal file
View File

@ -0,0 +1,211 @@
# -*- Autotest -*-
AT_BANNER([C low level compiling/preprocessing macros.])
# Copyright 2000, 2001 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., 59 Temple Place - Suite 330, Boston, MA
# 02111-1307, USA.
# Since the macros which compile are required by most tests, check
# them first. But remember that looking for a compiler is even more
# primitive, so check those first.
## ------------ ##
## Extensions. ##
## ------------ ##
# As far as we know only `foo', `foo.exe' are possible executable,
# and `foo.o', `foo.obj' are possible object files. Autoconf must not
# know that, but it is OK for the test suite to take this into account.
AT_CHECK_MACRO([Extensions],
[[AC_PROG_CC
case $ac_exeext in
'' | '.exe' ) ;;
* ) AC_MSG_ERROR([suspicious executable suffix: $ac_exeext]);;
esac
case $ac_objext in
'o' | 'obj' ) ;;
* ) AC_MSG_ERROR([suspicious object suffix: $ac_objext]);;
esac
AS_EXIT([0])
]])
## -------------------------- ##
## Broken/missing compilers. ##
## -------------------------- ##
# Check that Autoconf correctly diagnoses broken compilers, and in
# particular, if it does not exit 77, the test suite is in trouble...
# FIXME: Once a precise message decided, check stderr of configure.
AT_SETUP([Broken/missing compilers])
AT_DATA([configure.ac],
[[AC_INIT
CC=no-such-compiler
AC_PROG_CC
]])
AT_CHECK_AUTOCONF
AT_CHECK_CONFIGURE([], 77, ignore, ignore)
AT_CLEANUP
## ------------ ##
## C keywords. ##
## ------------ ##
# GCC supports `const', `volatile', and `inline'.
AT_CHECK_MACRO([C keywords],
[[AC_PROG_CC
AC_C_CONST
AC_C_INLINE
AC_C_VOLATILE
case $GCC,$ac_cv_c_const,$ac_cv_c_inline,$ac_cv_c_volatile in
yes,*no*)
AC_MSG_ERROR([failed to detect `const', `inline' or `volatile' support]);;
esac
]])
## --------------------------------- ##
## AC_PROG_CPP requires AC_PROG_CC. ##
## --------------------------------- ##
# Must invoke AC_PROG_CC.
AT_CHECK_MACRO([AC_PROG_CPP requires AC_PROG_CC],
[[AC_PROG_CPP
test -z "$CC" &&
AC_MSG_ERROR([looked for a C preprocessor without looking for a compiler])
]])
## --------------------------- ##
## AC_PROG_CPP with warnings. ##
## --------------------------- ##
# It's Ok for strict preprocessors to produce warnings.
AT_SETUP([AC_PROG_CPP with warnings])
AT_DATA([mycpp],
[[#! /bin/sh
echo noise >&2
exec ${1+"$@"}
]])
chmod +x mycpp
_AT_CHECK_AC_MACRO(
[[AC_PROG_CPP
# If the preprocessor is not strict, just ignore
test "x$ac_c_preproc_warn_flag" = xyes &&
AC_MSG_ERROR([preprocessor has no warning option], 77)
CPP="./mycpp $CPP"
AC_CHECK_HEADERS(stdio.h autoconf_io.h)]])
AT_CHECK_DEFINES(
[/* #undef HAVE_AUTOCONF_IO_H */
#define HAVE_STDIO_H 1
])
AT_CLEANUP
## ------------------------------ ##
## AC_PROG_CPP without warnings. ##
## ------------------------------ ##
AT_SETUP([AC_PROG_CPP without warnings])
# Ignore if /lib/cpp doesn't work
AT_CHECK([/lib/cpp </dev/null || exit 77], [], [ignore], [ignore])
# A cpp which exit status is meaningless.
AT_DATA([mycpp],
[[#! /bin/sh
/lib/cpp ${1+"$@"}
exit 0
]])
chmod +x mycpp
_AT_CHECK_AC_MACRO(
[[CPP=./mycpp
AC_PROG_CPP
test "x$ac_c_preproc_warn_flag" != xyes &&
AC_MSG_ERROR([failed to detect preprocessor warning option])
AC_CHECK_HEADERS(stdio.h autoconf_io.h)]])
AT_CHECK_DEFINES(
[/* #undef HAVE_AUTOCONF_IO_H */
#define HAVE_STDIO_H 1
])
AT_CLEANUP
## -------------------- ##
## AC_PROG_CPP via CC. ##
## -------------------- ##
# It's Ok for strict preprocessors to produce warnings.
AT_SETUP([AC_PROG_CPP via CC])
# Ignore if /lib/cpp doesn't work
AT_CHECK([/lib/cpp </dev/null || exit 77], [], [ignore], [ignore])
AT_DATA([mycc],
[[#! /bin/sh
echo "Annoying copyright message" >&2
exec "$@"
]])
chmod +x mycc
# We go through the following contortions, in order to have the
# configure script go down the same codepaths as it would during a
# normal CPP selection check. If we explicitly set CPP, it goes down
# a different codepath.
_AT_CHECK_AC_MACRO(
[[AC_PROG_CC
CC="./mycc $CC"
AC_PROG_CPP
# The test $CC compiler should have been selected.
test "$CPP" != "$CC -E" &&
AC_MSG_ERROR([error messages on stderr cause the preprocessor selection to fail])
# Exercise CPP.
AC_CHECK_HEADERS(stdio.h autoconf_io.h)]])
AT_CHECK_DEFINES(
[/* #undef HAVE_AUTOCONF_IO_H */
#define HAVE_STDIO_H 1
])
AT_CLEANUP

View File

@ -71,192 +71,75 @@ c
AT_CLEANUP
## ------------ ##
## Extensions. ##
## ------------ ##
## ---------------------- ##
## AC_REQUIRE & AC_LANG. ##
## ---------------------- ##
# As far as we know only `foo', `foo.exe' are possible executable,
# and `foo.o', `foo.obj' are possible object files. Autoconf must not
# know that, but it is OK for the test suite to take this into account.
AT_CHECK_MACRO([Extensions],
[[AC_PROG_CC
case $ac_exeext in
'' | '.exe' ) ;;
* ) AC_MSG_ERROR([suspicious executable suffix: $ac_exeext]);;
esac
case $ac_objext in
'o' | 'obj' ) ;;
* ) AC_MSG_ERROR([suspicious object suffix: $ac_objext]);;
esac
AS_EXIT([0])
]])
## -------------------------- ##
## Broken/missing compilers. ##
## -------------------------- ##
# Check that Autoconf correctly diagnoses broken compilers, and in
# particular, if it does not exit 77, the test suite is in trouble...
# FIXME: Once a precise message decided, check stderr of configure.
AT_SETUP([Broken/missing compilers])
AT_SETUP([AC_REQUIRE & AC_LANG])
AT_DATA([configure.ac],
[[AC_INIT
CC=no-such-compiler
AC_PROG_CC
[[AC_DEFUN([AC_F77_1],
[AC_LANG_PUSH([Fortran 77])
if test $ac_ext != f; then
AC_MSG_ERROR([F77_1: current shell language is $ac_ext, expected Fortran])
fi
AC_LANG_POP
])
AC_DEFUN([AC_F77_2],
[AC_LANG_PUSH([Fortran 77])
AC_REQUIRE([AC_F77_1])
if test $ac_ext != f; then
AC_MSG_ERROR([F77_2: current shell language is $ac_ext, expected Fortran])
fi
AC_LANG_POP
])
AC_INIT
AC_F77_2
AS_EXIT(0)
]])
AT_CHECK_AUTOCONF
AT_CHECK_CONFIGURE([], 77, ignore, ignore)
AT_CHECK_CONFIGURE
AT_CLEANUP
## ------------ ##
## C keywords. ##
## ------------ ##
## --------------- ##
## AC_RUN_IFELSE. ##
## --------------- ##
AT_SETUP([AC_RUN_IFELSE])
AT_DATA([configure.ac],
[[AC_INIT
AC_RUN_IFELSE([AC_LANG_PROGRAM([], [exit (0)])],
[],
[AC_MSG_ERROR([saw `exit 0' as a failure])])
AC_RUN_IFELSE([AC_LANG_PROGRAM([], [exit (2)])],
[AC_MSG_ERROR([saw `exit 2' as a success])],
[status=$?
test $status != 2 &&
AC_MSG_ERROR([did not get as 2 exit status: $status])])
# The old stinky one.
AC_TRY_RUN([int main () { exit (3); }],
[AC_MSG_ERROR([saw `exit 3' as a success])],
[status=$?
test $status != 3 &&
AC_MSG_ERROR([did not get 3 as exit status: $status])])
# GCC supports `const', `volatile', and `inline'.
AT_CHECK_MACRO([C keywords],
[[AC_PROG_CC
AC_C_CONST
AC_C_INLINE
AC_C_VOLATILE
case $GCC,$ac_cv_c_const,$ac_cv_c_inline,$ac_cv_c_volatile in
yes,*no*)
AC_MSG_ERROR([failed to detect `const', `inline' or `volatile' support]);;
esac
]])
## --------------------------------- ##
## AC_PROG_CPP requires AC_PROG_CC. ##
## --------------------------------- ##
# Must invoke AC_PROG_CC.
AT_CHECK_MACRO([AC_PROG_CPP requires AC_PROG_CC],
[[AC_PROG_CPP
test -z "$CC" &&
AC_MSG_ERROR([looked for a C preprocessor without looking for a compiler])
]])
## --------------------------- ##
## AC_PROG_CPP with warnings. ##
## --------------------------- ##
# It's Ok for strict preprocessors to produce warnings.
AT_SETUP([AC_PROG_CPP with warnings])
AT_DATA([mycpp],
[[#! /bin/sh
echo noise >&2
exec ${1+"$@"}
]])
chmod +x mycpp
_AT_CHECK_AC_MACRO(
[[AC_PROG_CPP
# If the preprocessor is not strict, just ignore
test "x$ac_c_preproc_warn_flag" = xyes &&
AC_MSG_ERROR([preprocessor has no warning option], 77)
CPP="./mycpp $CPP"
AC_CHECK_HEADERS(stdio.h autoconf_io.h)]])
AT_CHECK_DEFINES(
[/* #undef HAVE_AUTOCONF_IO_H */
#define HAVE_STDIO_H 1
])
AT_CHECK_AUTOCONF
AT_CHECK_CONFIGURE([-q])
AT_CLEANUP
## ------------------------------ ##
## AC_PROG_CPP without warnings. ##
## ------------------------------ ##
AT_SETUP([AC_PROG_CPP without warnings])
# Ignore if /lib/cpp doesn't work
AT_CHECK([/lib/cpp </dev/null || exit 77], [], [ignore], [ignore])
# A cpp which exit status is meaningless.
AT_DATA([mycpp],
[[#! /bin/sh
/lib/cpp ${1+"$@"}
exit 0
]])
chmod +x mycpp
_AT_CHECK_AC_MACRO(
[[CPP=./mycpp
AC_PROG_CPP
test "x$ac_c_preproc_warn_flag" != xyes &&
AC_MSG_ERROR([failed to detect preprocessor warning option])
AC_CHECK_HEADERS(stdio.h autoconf_io.h)]])
AT_CHECK_DEFINES(
[/* #undef HAVE_AUTOCONF_IO_H */
#define HAVE_STDIO_H 1
])
AT_CLEANUP
## -------------------- ##
## AC_PROG_CPP via CC. ##
## -------------------- ##
# It's Ok for strict preprocessors to produce warnings.
AT_SETUP([AC_PROG_CPP via CC])
# Ignore if /lib/cpp doesn't work
AT_CHECK([/lib/cpp </dev/null || exit 77], [], [ignore], [ignore])
AT_DATA([mycc],
[[#! /bin/sh
echo "Annoying copyright message" >&2
exec "$@"
]])
chmod +x mycc
# We go through the following contortions, in order to have the
# configure script go down the same codepaths as it would during a
# normal CPP selection check. If we explicitly set CPP, it goes down
# a different codepath.
_AT_CHECK_AC_MACRO(
[[AC_PROG_CC
CC="./mycc $CC"
AC_PROG_CPP
# The test $CC compiler should have been selected.
test "$CPP" != "$CC -E" &&
AC_MSG_ERROR([error messages on stderr cause the preprocessor selection to fail])
# Exercise CPP.
AC_CHECK_HEADERS(stdio.h autoconf_io.h)]])
AT_CHECK_DEFINES(
[/* #undef HAVE_AUTOCONF_IO_H */
#define HAVE_STDIO_H 1
])
AT_CLEANUP
## ------------------ ##
## AC_TRY_LINK_FUNC. ##
## ------------------ ##
@ -266,30 +149,3 @@ AT_CHECK_MACRO([AC_TRY_LINK_FUNC],
[AC_MSG_ERROR([cannot find `printf'])])
AC_TRY_LINK_FUNC(Be_doomed_if_your_libc_has_a_function_named_like_this,
[AC_MSG_ERROR([found a nonexistent function])])])
## --------------------- ##
## Fortran 77 Compiler. ##
## --------------------- ##
AT_CHECK_MACRO([GNU Fortran 77],
[[AC_LANG(Fortran 77)
AC_LANG_COMPILER
if AC_TRY_COMMAND([$F77 --version | grep GNU >&2]); then
# Be sure to remove files which might be created by compilers that
# don't support --version.
rm -f a.exe a.out
# Has GNU in --version.
test "$G77" != yes &&
AC_MSG_ERROR([failed to recognize GNU Fortran 77 compiler])
else
# Be sure to remove files which might be created by compilers that
# don't support --version.
rm -f a.exe a.out
# Has not.
test "$G77" = yes &&
AC_MSG_ERROR([incorrectly recognized a GNU Fortran 77 compiler])
fi]])

51
tests/fortran.at Normal file
View File

@ -0,0 +1,51 @@
# -*- Autotest -*-
AT_BANNER([Fortran low level compiling/preprocessing macros.])
# Copyright 2000, 2001 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., 59 Temple Place - Suite 330, Boston, MA
# 02111-1307, USA.
# Since the macros which compile are required by most tests, check
# them first. But remember that looking for a compiler is even more
# primitive, so check those first.
## --------------------- ##
## Fortran 77 Compiler. ##
## --------------------- ##
AT_CHECK_MACRO([GNU Fortran 77],
[[AC_LANG(Fortran 77)
AC_LANG_COMPILER
if AC_TRY_COMMAND([$F77 --version | grep GNU >&2]); then
# Be sure to remove files which might be created by compilers that
# don't support --version.
rm -f a.exe a.out
# Has GNU in --version.
test "$G77" != yes &&
AC_MSG_ERROR([failed to recognize GNU Fortran 77 compiler])
else
# Be sure to remove files which might be created by compilers that
# don't support --version.
rm -f a.exe a.out
# Has not.
test "$G77" = yes &&
AC_MSG_ERROR([incorrectly recognized a GNU Fortran 77 compiler])
fi]])

View File

@ -60,7 +60,9 @@ m4_include([compile.at])
# Language support.
m4_include([aclang.at])
m4_include([c.at])
m4_include([acc.at])
m4_include([fortran.at])
m4_include([acfortran.at])
# Checking that AC_CHECK_FOO macros work properly.