autoconf-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] autoconf: warn if AC_*_IFELSE lacks complete program


From: Eric Blake
Subject: [PATCH] autoconf: warn if AC_*_IFELSE lacks complete program
Date: Thu, 26 Aug 2010 15:13:02 -0600

* lib/autoconf/lang.m4 (AC_LANG_DEFINES_PROVIDED): New macro.
(AC_LANG_SOURCE): Call it.
(AC_LANG_CONFTEST): Add warning if new macro is not called.
* lib/autoconf/c.m4 (_AC_LANG_OPENMP): Add missing AC_LANG_SOURCE.
* lib/autoconf/fortran.m4 (AC_FC_FREEFORM, AC_FC_FIXEDFORM)
(AC_FC_LINE_LENGTH, __AC_FC_NAME_MANGLING): Intentionally bypass
AC_LANG_SOURCE.
* lib/autoconf/programs.m4 (_AC_PROG_LEX_YYTEXT_DECL): Likewise.
* tests/compile.at (AC_COMPILE_IFELSE): New test.
* doc/autoconf.texi (Generating Sources) <AC_LANG_CONFTEST>:
Document new warning.
<AC_LANG_DEFINES_PROVIDED>: Document new macro.
<AC_LANG_SOURCE>: Documet use of new macro.
* NEWS: Document the improvement.
Suggested by Bruno Haible.

Signed-off-by: Eric Blake <address@hidden>
---

It works - it found bugs in autoconf's own (mis-)use of AC_COMPILE_IFELSE!

Now to see how many other people start complaining about the new warning.

 ChangeLog                |   17 +++++++++++++++++
 NEWS                     |    7 +++++++
 doc/autoconf.texi        |   22 +++++++++++++++++++++-
 lib/autoconf/c.m4        |    2 +-
 lib/autoconf/fortran.m4  |   16 ++++++++--------
 lib/autoconf/lang.m4     |   14 ++++++++++++--
 lib/autoconf/programs.m4 |    7 ++++---
 tests/compile.at         |   44 ++++++++++++++++++++++++++++++++++++++++++++
 8 files changed, 114 insertions(+), 15 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 6ff1bc3..9c12adf 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,22 @@
 2010-08-26  Eric Blake  <address@hidden>

+       autoconf: warn if AC_*_IFELSE lacks complete program
+       * lib/autoconf/lang.m4 (AC_LANG_DEFINES_PROVIDED): New macro.
+       (AC_LANG_SOURCE): Call it.
+       (AC_LANG_CONFTEST): Add warning if new macro is not called.
+       * lib/autoconf/c.m4 (_AC_LANG_OPENMP): Add missing AC_LANG_SOURCE.
+       * lib/autoconf/fortran.m4 (AC_FC_FREEFORM, AC_FC_FIXEDFORM)
+       (AC_FC_LINE_LENGTH, __AC_FC_NAME_MANGLING): Intentionally bypass
+       AC_LANG_SOURCE.
+       * lib/autoconf/programs.m4 (_AC_PROG_LEX_YYTEXT_DECL): Likewise.
+       * tests/compile.at (AC_COMPILE_IFELSE): New test.
+       * doc/autoconf.texi (Generating Sources) <AC_LANG_CONFTEST>:
+       Document new warning.
+       <AC_LANG_DEFINES_PROVIDED>: Document new macro.
+       <AC_LANG_SOURCE>: Documet use of new macro.
+       * NEWS: Document the improvement.
+       Suggested by Bruno Haible.
+
        autoconf: fix regression in AC_FUNC_SELECT_ARGTYPES
        * lib/autoconf/functions.m4 (AC_FUNC_SELECT_ARGTYPES): Fix
        quoting; regression from yesteray leaked '' into default value.
diff --git a/NEWS b/NEWS
index 3c0aed3..9998ab7 100644
--- a/NEWS
+++ b/NEWS
@@ -8,6 +8,13 @@ GNU Autoconf NEWS - User visible changes.
 ** AC_INIT again allows URLs with '?' for its BUG-REPORT argument.
    Regression introduced in 2.66.

+** The macros AC_PREPROC_IFELSE, AC_COMPILE_IFELSE, AC_LINK_IFELSE, and
+   AC_RUN_IFELSE now warn if the first argument failed to use
+   AC_LANG_SOURCE or AC_LANG_PROGRAM to generate the conftest file
+   contents.  A new macro AC_LANG_DEFINES_PROVIDED exists if you have
+   a compelling reason why you cannot use AC_LANG_SOURCE but must
+   avoid the warning.
+

 * Major changes in Autoconf 2.67 (2010-07-21) [stable]
   Released by Eric Blake, based on git versions 2.66.*.
diff --git a/doc/autoconf.texi b/doc/autoconf.texi
index 98dafa9..9f0e5d2 100644
--- a/doc/autoconf.texi
+++ b/doc/autoconf.texi
@@ -8730,12 +8730,32 @@ Generating Sources
 Note that the @var{source} is evaluated exactly once, like regular
 Autoconf macro arguments, and therefore (i) you may pass a macro
 invocation, (ii) if not, be sure to double quote if needed.
+
+This macro issues a warning during @command{autoconf} processing if
address@hidden does not include an expansion of the macro
address@hidden (note that both @code{AC_LANG_SOURCE} and
address@hidden call this macro, and thus avoid the warning).
+
+This macro is seldom called directly, but is used under the hood by more
+common macros such as @code{AC_COMPILE_IFELSE} and @code{AC_RUN_IFELSE}.
address@hidden defmac
+
address@hidden AC_LANG_DEFINES_PROVIDED
address@hidden
+This macro is called as a witness that the file
address@hidden@var{extension}} appropriate for the current language is
+complete, including all previously determined results from
address@hidden  This macro is seldom called directly, but exists if
+you have a compelling reason to write a conftest file without using
address@hidden, but still want to avoid a syntax warning from
address@hidden
 @end defmac

 @defmac AC_LANG_SOURCE (@var{source})
 @acindex{LANG_SOURCE}
 Expands into the @var{source}, with the definition of
-all the @code{AC_DEFINE} performed so far.
+all the @code{AC_DEFINE} performed so far.  This macro includes an
+expansion of @code{AC_LANG_DEFINES_PROVIDED}.
 @end defmac

 For instance executing (observe the double quotation!):
diff --git a/lib/autoconf/c.m4 b/lib/autoconf/c.m4
index 9a28adf..233644a 100644
--- a/lib/autoconf/c.m4
+++ b/lib/autoconf/c.m4
@@ -1930,7 +1930,7 @@ AC_DEFUN([AC_C_TYPEOF],
 # Expands to some language dependent source code for testing the presence of
 # OpenMP.
 AC_DEFUN([_AC_LANG_OPENMP],
-[_AC_LANG_DISPATCH([$0], _AC_LANG, $@)])
+[AC_LANG_SOURCE([_AC_LANG_DISPATCH([$0], _AC_LANG, $@)])])

 # _AC_LANG_OPENMP(C)
 # ------------------
diff --git a/lib/autoconf/fortran.m4 b/lib/autoconf/fortran.m4
index 0a487ee..5e48468 100644
--- a/lib/autoconf/fortran.m4
+++ b/lib/autoconf/fortran.m4
@@ -897,13 +897,13 @@ AC_DEFUN([__AC_FC_NAME_MANGLING],
 [_AC_FORTRAN_ASSERT()dnl
 AC_CACHE_CHECK([for _AC_LANG name-mangling scheme],
               ac_cv_[]_AC_LANG_ABBREV[]_mangling,
-[AC_COMPILE_IFELSE(
+[AC_COMPILE_IFELSE([AC_LANG_DEFINES_PROVIDED
 [      subroutine foobar()
       return
       end
       subroutine foo_bar()
       return
-      end],
+      end]],
 [mv conftest.$ac_objext cfortran_test.$ac_objext

   ac_save_LIBS=$LIBS
@@ -1186,12 +1186,12 @@ for ac_flag in none -ffree-form -FR -free -qfree -Mfree 
-Mfreeform \
 do
   test "x$ac_flag" != xnone && FCFLAGS="$ac_fc_freeform_FCFLAGS_save $ac_flag"
 dnl Use @&t@ below to ensure that editors don't turn 8+ spaces into tab.
-  AC_COMPILE_IFELSE([
+  AC_COMPILE_IFELSE([AC_LANG_DEFINES_PROVIDED[
   program freeform
        ! FIXME: how to best confuse non-freeform compilers?
        print *, 'Hello ', &
      @&t@     'world.'
-       end],
+       end]],
                    [ac_cv_fc_freeform=$ac_flag; break])
 done
 rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
@@ -1241,10 +1241,10 @@ for ac_flag in none -ffixed-form -fixed -qfixed -Mfixed 
-fixedform "-f fixed" \
               +source=fixed -fix
 do
   test "x$ac_flag" != xnone && FCFLAGS="$ac_fc_fixedform_FCFLAGS_save $ac_flag"
-  AC_COMPILE_IFELSE([
+  AC_COMPILE_IFELSE([AC_LANG_DEFINES_PROVIDED[
 C     This comment should confuse free-form compilers.
       program main
-      end],
+      end]],
                    [ac_cv_fc_fixedform=$ac_flag; break])
 done
 rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
@@ -1324,8 +1324,8 @@ for ac_flag in none \
               "-W $ac_fc_line_len" +extend_source -wide -e
 do
   test "x$ac_flag" != xnone && FCFLAGS="$ac_fc_line_length_FCFLAGS_save 
$ac_flag"
-  AC_COMPILE_IFELSE([$ac_fc_line_length_test
-      end subroutine],
+  AC_COMPILE_IFELSE([AC_LANG_DEFINES_PROVIDED[$ac_fc_line_length_test
+      end subroutine]],
                    [ac_cv_fc_line_length=$ac_flag; break])
 done
 rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
diff --git a/lib/autoconf/lang.m4 b/lib/autoconf/lang.m4
index 3e8de53..997b4e6 100644
--- a/lib/autoconf/lang.m4
+++ b/lib/autoconf/lang.m4
@@ -192,7 +192,10 @@ m4_define([AC_LANG_DEFINE],
 # ----------------------
 # Save the BODY in `conftest.$ac_ext'.  Add a trailing new line.
 AC_DEFUN([AC_LANG_CONFTEST],
-[_AC_LANG_DISPATCH([$0], _AC_LANG, $@)])
+[m4_pushdef([_AC_LANG_DEFINES_PROVIDED],
+  [m4_warn([syntax], [$0: no AC_LANG_SOURCE call detected in body])])]dnl
+[_AC_LANG_DISPATCH([$0], _AC_LANG, $@)]dnl
+[[]_AC_LANG_DEFINES_PROVIDED[]_m4_popdef([_AC_LANG_DEFINES_PROVIDED])])


 # AC_LANG_CONFTEST()(BODY)
@@ -203,13 +206,20 @@ m4_define([AC_LANG_CONFTEST()],
 $1
 _ACEOF])

+# AC_LANG_DEFINES_PROVIDED
+# ------------------------
+# Witness macro that all prior AC_DEFINE results have been output
+# into the current expansion, to silence warning from AC_LANG_CONFTEST.
+m4_define([AC_LANG_DEFINES_PROVIDED],
+[m4_define([_$0])])
+

 # AC_LANG_SOURCE(BODY)
 # --------------------
 # Produce a valid source for the current language, which includes the
 # BODY, and as much as possible `confdefs.h'.
 AC_DEFUN([AC_LANG_SOURCE],
-[_AC_LANG_DISPATCH([$0], _AC_LANG, $@)])
+[AC_LANG_DEFINES_PROVIDED[]_AC_LANG_DISPATCH([$0], _AC_LANG, $@)])


 # AC_LANG_SOURCE()(BODY)
diff --git a/lib/autoconf/programs.m4 b/lib/autoconf/programs.m4
index 4b9060f..e7eeb6f 100644
--- a/lib/autoconf/programs.m4
+++ b/lib/autoconf/programs.m4
@@ -756,7 +756,8 @@ if test -z "${LEXLIB+set}"; then
     ac_cv_lib_lex='none needed'
     for ac_lib in '' -lfl -ll; do
       LIBS="$ac_lib $ac_save_LIBS"
-      AC_LINK_IFELSE([`cat $LEX_OUTPUT_ROOT.c`], [ac_cv_lib_lex=$ac_lib])
+      AC_LINK_IFELSE([AC_LANG_DEFINES_PROVIDED[`cat $LEX_OUTPUT_ROOT.c`]],
+       [ac_cv_lib_lex=$ac_lib])
       test "$ac_cv_lib_lex" != 'none needed' && break
     done
     LIBS=$ac_save_LIBS
@@ -772,9 +773,9 @@ AC_CACHE_CHECK(whether yytext is a pointer, 
ac_cv_prog_lex_yytext_pointer,
 ac_cv_prog_lex_yytext_pointer=no
 ac_save_LIBS=$LIBS
 LIBS="$LEXLIB $ac_save_LIBS"
-AC_LINK_IFELSE(
+AC_LINK_IFELSE([AC_LANG_DEFINES_PROVIDED
   [#define YYTEXT_POINTER 1
-`cat $LEX_OUTPUT_ROOT.c`],
+`cat $LEX_OUTPUT_ROOT.c`]],
   [ac_cv_prog_lex_yytext_pointer=yes])
 LIBS=$ac_save_LIBS
 ])
diff --git a/tests/compile.at b/tests/compile.at
index 6a1092b..dd7175b 100644
--- a/tests/compile.at
+++ b/tests/compile.at
@@ -260,11 +260,55 @@ fputs (hw, stdout);
 AT_CLEANUP


+## ------------------- ##
+## AC_COMPILE_IFELSE.  ##
+## ------------------- ##
+
+AT_SETUP([AC_COMPILE_IFELSE])
+AT_KEYWORDS([AC_LANG_DEFINES_PROVIDED])
+
+AT_DATA([configure.ac],
+[[AC_INIT
+AC_COMPILE_IFELSE([int main () { return 0; }], [],
+  [AC_MSG_ERROR([compiling trivial program failed])])
+]])
+
+AT_CHECK_AUTOCONF([], [], [], [stderr])
+AT_CHECK([grep 'no AC_LANG_SOURCE call detected in body' stderr], [], [ignore])
+AT_CHECK_AUTOCONF([-W no-syntax])
+AT_CHECK_CONFIGURE([-q])
+
+AT_DATA([configure.ac],
+[[AC_INIT
+AC_COMPILE_IFELSE([AC_LANG_DEFINES_PROVIDED()int main () { return 0; }], [],
+  [AC_MSG_ERROR([compiling trivial program failed])])
+]])
+
+AT_CHECK_AUTOCONF
+AT_CHECK_CONFIGURE([-q])
+
+AT_DATA([configure.ac],
+[[AC_INIT
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [return 0])],
+             [],
+             [AC_MSG_ERROR([compiling `return 0' failed])])
+
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [return 2])],
+             [],
+             [AC_MSG_ERROR([compiling `return 2' failed])])
+]])
+
+AT_CHECK_AUTOCONF
+AT_CHECK_CONFIGURE([-q])
+
+AT_CLEANUP
+
 ## --------------- ##
 ## AC_RUN_IFELSE.  ##
 ## --------------- ##

 AT_SETUP([AC_RUN_IFELSE])
+AT_KEYWORDS([AC_TRY_RUN])

 AT_DATA([configure.ac],
 [[AC_INIT
-- 
1.7.2.2




reply via email to

[Prev in Thread] Current Thread [Next in Thread]