On 09/21/2012 08:32 AM, Jim Meyering wrote:
> Here's what happens with diffutils:

Hah!  That's what I get for wading into this mess.
But thanks for catching that; fix below.

On 09/21/2012 01:18 AM, Andrew W. Nosenko wrote:
> Assuming that AC_PROG_CC_C99 deprecated and then removed, how I
> supposed to express "give me c99 or higher compiler or raise error if
> there only c89 or lower compiler found"?

I suppose one can look at the variables that AC_PROG_CC sets.  But I'm
not sure we should be pushing this use case that hard, to be honest.
If a program really needs C99, the compilation will fail anyway, and
there's not much that a 'configure' script can do about it.

On 09/21/2012 02:01 AM, Adrian Bunk wrote:

> Any other changes of C89/C99 behaviour that might affect code in 
> packages using autoconf?

"gets" is the only one that comes to mind.  And it's being deprecated
even in pre-C11 mode anyway, for obvious reasons, so it's no big deal.

> What if e.g. gcc 4.7 has some bug in C11 mode that would be
> triggered by several packages?

Anything's possible, I suppose.  But C11 mode doesn't really
do that much (unless you also specify -pedantic, which nobody should)
-- i.e., the C11 features are all there anyway.  So I don't think
it'll be much of a problem.  C11 is much better than C99 was, in
the sense that a compiler can support C11 features while still
conforming to C99.  (Other than "gets".)

> Marking AC_PROG_CC_C89/AC_PROG_CC_C99/AC_PROG_CC_STDC as obsolete
> (and turning them into aliases for AC_PROG_CC) is an option, and the 
> more I think about it, it seems like the only option where trying to 
> set the compiler into the highest possible mode in AC_PROG_CC makes sense.

Yes, on further thought I'm inclined to agree.  Also, it's a lot
simpler.  Also, it fixes Jim's bug.  There's a lot to like.
Please see the patch below, which I've pushed.  Further
comments welcome.


>From f7fe375b26f39d0a6624ad9a6c532d9361a3226b Mon Sep 17 00:00:00 2001
From: Paul Eggert <egg...@cs.ucla.edu>
Date: Fri, 21 Sep 2012 19:19:54 -0700
Subject: [PATCH] AC_PROG_CC_C89, AC_PROG_CC_C99: now obsolete; defer to
 AC_PROG_CC

* NEWS:
* doc/autoconf.texi (C Compiler, Running the Preprocessor)
(Limitations of Usual Tools, Present But Cannot Be Compiled)
(Obsolete Macros):
Document the changes described below.
* lib/autoconf/c.m4 (_AC_PROG_CC_FORCE_VERSION): Remove.
(AC_PROG_CC_C89, AC_PROG_CC_C99, AC_PROG_CC_STDC):
Just do AC_PROG_CC, but mark as obsolete.  This replaces my recent
ill-advised attempt to let AC_PROG_CC_C89 and AC_PROG_CC_C99 downgrade
the version of C supported.
* doc/autoconf.texi (Limitations of Usual Tools, Volatile Objects):
Document C11 more accurately.  In some cases this involves removing
some details about 'volatile', alas, since C11 changed this stuff.
Again.
---
 NEWS              |   8 ++--
 doc/autoconf.texi | 125 ++++++++++++++++++++++--------------------------------
 lib/autoconf/c.m4 |  41 ++++++------------
 3 files changed, 65 insertions(+), 109 deletions(-)

diff --git a/NEWS b/NEWS
index 7db1c82..8b35cb8 100644
--- a/NEWS
+++ b/NEWS
@@ -11,12 +11,10 @@ GNU Autoconf NEWS - User visible changes.
 ** Macros
 
 - AC_PROG_CC now prefers C11 if available, falling back on C99 and
-  then on C89 as before.  (There is no AC_PROG_CC_C11 macro, as no
-  need for one has been identified.)
+  then on C89 as before.
 
-- It is now documented that AC_PROG_CC_C89 and AC_PROG_CC_C99
-  interfere with each other and with AC_PROG_CC.  Applications should
-  normally use AC_PROG_CC.
+- AC_PROG_CC_STDC, AC_PROG_CC_C89, AC_PROG_CC_C99 have been marked as obsolete.
+  Applications should use AC_PROG_CC.
 
 - AC_FUNC_VFORK now checks for the signal-handling bug in Solaris 2.4 'vfork'.
   Formerly, it ignored this bug, so that Emacs could use some tricky
diff --git a/doc/autoconf.texi b/doc/autoconf.texi
index 86b31ee..08082aa 100644
--- a/doc/autoconf.texi
+++ b/doc/autoconf.texi
@@ -7256,6 +7256,18 @@ After calling this macro you can check whether the C 
compiler has been
 set to accept Standard C; if not, the shell variable
 @code{ac_cv_prog_cc_stdc} is set to @samp{no}.
 
+When attempting to add compiler options, prefer extended functionality
+modes over strict conformance modes.  Test for C11 support by checking
+for @code{_Alignas}, @code{_Alignof}, @code{_Noreturn},
+@code{_Static_assert}, UTF-8 string literals, duplicate @code{typedef}s,
+and anonymous structures and unions.  Test for C99 support by checking
+for @code{_Bool}, @code{//} comments, flexible array members,
+@code{inline}, signed and unsigned @code{long long int}, mixed code and
+declarations, named initialization of structs, @code{restrict},
+@code{va_copy}, varargs macros, variable declarations in @code{for}
+loops, and variable length arrays.  Test for C89 support by checking for
+function prototypes.
+
 If using the GNU C compiler, set shell variable @code{GCC} to
 @samp{yes}.  If output variable @code{CFLAGS} was not already set, set
 it to @option{-g -O2} for the GNU C compiler (@option{-O2} on systems
@@ -7323,51 +7335,6 @@ features.  To check for characteristics not listed here, 
use
 @code{AC_COMPILE_IFELSE} (@pxref{Running the Compiler}) or
 @code{AC_RUN_IFELSE} (@pxref{Runtime}).
 
-@defmac AC_PROG_CC_C89
-@acindex{PROG_CC_C89}
-@caindex prog_cc_c89
-If the C compiler is not in ANSI C89 (ISO C90) mode by
-default, try to add an option to output variable @code{CC} to make it
-so.  This macro tries various options that select ANSI C89 on
-some system or another, preferring extended functionality modes over
-strict conformance modes.  It considers the compiler to be in
-ANSI C89 mode if it handles function prototypes correctly.
-
-After calling this macro you can check whether the C compiler has been
-set to accept ANSI C89; if not, the shell variable
-@code{ac_cv_prog_cc_c89} is set to @samp{no}.
-
-This macro is rarely needed.  It should be used only if your application
-requires C89 and will not work in later C versions.  Typical applications
-should use @code{AC_PROG_CC} instead.
-@end defmac
-
-@defmac AC_PROG_CC_C99
-@acindex{PROG_CC_C99}
-@caindex prog_cc_c99
-If the C compiler is not in C99 mode by default, try to add an
-option to output variable @code{CC} to make it so.  This macro tries
-various options that select C99 on some system or another, preferring
-extended functionality modes over strict conformance modes.  It
-considers the compiler to be in C99 mode if it handles @code{_Bool},
-@code{//} comments, flexible array members, @code{inline}, signed and
-unsigned @code{long long int}, mixed code and declarations, named
-initialization of structs,
-@code{restrict}, @code{va_copy}, varargs macros, variable declarations
-in @code{for} loops, and variable length arrays.
-
-After calling this macro you can check whether the C compiler has been
-set to accept C99; if not, the shell variable
-@code{ac_cv_prog_cc_c99} is set to @samp{no}.
-
-This macro is rarely needed.  It should be used only if your application
-requires C99 and will not work in later C versions.  Typical applications
-should use @code{AC_PROG_CC} instead.
-
-There is no @code{AC_PROG_CC_C11} macro, as no need for one has been
-identified.
-@end defmac
-
 @defmac AC_C_BACKSLASH_A
 @acindex{C_BACKSLASH_A}
 @cvindex HAVE_C_BACKSLASH_A
@@ -9311,19 +9278,19 @@ AC_PREPROC_IFELSE(
 @end example
 
 @noindent
-results in:
+might result in:
 
 @example
 checking for gcc... gcc
-checking for C compiler default output file name... a.out
 checking whether the C compiler works... yes
-checking whether we are cross compiling... no
+checking for C compiler default output file name... a.out
 checking for suffix of executables...
+checking whether we are cross compiling... no
 checking for suffix of object files... o
 checking whether we are using the GNU C compiler... yes
 checking whether gcc accepts -g... yes
-checking for gcc option to accept ISO C89... none needed
-checking how to run the C preprocessor... gcc -E
+checking for gcc option to accept ISO C11... -std=gnu11
+checking how to run the C preprocessor... gcc -std=gnu11 -E
 OK
 @end example
 
@@ -18637,7 +18604,8 @@ The default executable, produced by @samp{cc foo.c}, 
can be
 The C compiler's traditional name is @command{cc}, but other names like
 @command{gcc} are common.  Posix 1003.1-2001 and 1003.1-2008 specify the
 name @command{c99}, but older Posix editions specified
-@command{c89} and anyway these standard names are rarely used in
+@command{c89}, future POSIX standards will likely specify
+@command{c11}, and anyway these standard names are rarely used in
 practice.  Typically the C compiler is invoked from makefiles that use
 @samp{$(CC)}, so the value of the @samp{CC} make variable selects the
 compiler name.
@@ -21606,28 +21574,25 @@ objects are ordinary.
 
 Even when accessing objects defined with a volatile type,
 the C standard allows only
-extremely limited signal handlers: the behavior is undefined if a signal
+extremely limited signal handlers: in C99 the behavior is undefined if a signal
 handler reads any nonlocal object, or writes to any nonlocal object
 whose type is not @code{sig_atomic_t volatile}, or calls any standard
-library function other than @code{abort}, @code{signal}, and (if C99 or later)
+library function other than @code{abort}, @code{signal}, and
 @code{_Exit}.  Hence C compilers need not worry about a signal handler
-disturbing ordinary computation, unless the computation accesses a
-@code{sig_atomic_t volatile} lvalue that is not a local variable.
-(There is an obscure exception for accesses via a pointer to a volatile
-character, since it may point into part of a @code{sig_atomic_t
-volatile} object.)  Posix
-adds to the list of library functions callable from a portable signal
-handler, but otherwise is like the C standard in this area.
+disturbing ordinary computation.  C11 and Posix allow some additional
+behavior in a portable signal handler, but are still quite restrictive.
 
 Some C implementations allow memory-access optimizations within each
 translation unit, such that actual behavior agrees with the behavior
 required by the standard only when calling a function in some other
 translation unit, and a signal handler acts like it was called from a
-different translation unit.  The C standard hints that in these
+different translation unit.  The C99 standard hints that in these
 implementations, objects referred to by signal handlers ``would require
 explicit specification of @code{volatile} storage, as well as other
 implementation-defined restrictions.''  But unfortunately even for this
 special case these other restrictions are often not documented well.
+This area was significantly changed in C11, and eventually implementations
+will probably head in the C11 direction, but this will take some time.
 @xref{Volatiles, , When is a Volatile Object Accessed?, gcc, Using the
 GNU Compiler Collection (GCC)}, for some
 restrictions imposed by GCC.  @xref{Defining Handlers, ,
@@ -23656,6 +23621,16 @@ Replaced by @code{AC_TYPE_PID_T} 
(@pxref{AC_TYPE_PID_T}).
 Replaced by @code{AC_PREFIX_PROGRAM} (@pxref{AC_PREFIX_PROGRAM}).
 @end defmac
 
+@defmac AC_PROG_CC_C89
+@acindex{PROG_CC_C89}
+Now done by @code{AC_PROG_CC} (@pxref{AC_PROG_CC}).
+@end defmac
+
+@defmac AC_PROG_CC_C99
+@acindex{PROG_CC_C99}
+Now done by @code{AC_PROG_CC} (@pxref{AC_PROG_CC}).
+@end defmac
+
 @defmac AC_PROG_CC_STDC
 @acindex{PROG_CC_STDC}
 Now done by @code{AC_PROG_CC} (@pxref{AC_PROG_CC}).
@@ -25939,19 +25914,19 @@ $ @kbd{cat configure.ac}
 AC_INIT([Example], [1.0], [bug-example@@example.org])
 AC_CHECK_HEADERS([pi.h])
 $ @kbd{autoconf -Wall}
-$ @kbd{./configure}
+$ @kbd{./configure CPPFLAGS='-I.'}
 checking for gcc... gcc
-checking for C compiler default output file name... a.out
 checking whether the C compiler works... yes
-checking whether we are cross compiling... no
+checking for C compiler default output file name... a.out
 checking for suffix of executables...
+checking whether we are cross compiling... no
 checking for suffix of object files... o
 checking whether we are using the GNU C compiler... yes
 checking whether gcc accepts -g... yes
-checking for gcc option to accept ISO C89... none needed
-checking how to run the C preprocessor... gcc -E
-checking for grep that handles long lines and -e... grep
-checking for egrep... grep -E
+checking for gcc option to accept ISO C11... -std=gnu11
+checking how to run the C preprocessor... gcc -std=gnu11 -E
+checking for grep that handles long lines and -e... /usr/bin/grep
+checking for egrep... /usr/bin/grep -E
 checking for ANSI C header files... yes
 checking for sys/types.h... yes
 checking for sys/stat.h... yes
@@ -25969,10 +25944,10 @@ configure: WARNING: pi.h:     check for missing 
prerequisite headers?
 configure: WARNING: pi.h: see the Autoconf documentation
 configure: WARNING: pi.h:     section "Present But Cannot Be Compiled"
 configure: WARNING: pi.h: proceeding with the compiler's result
-configure: WARNING:     ## -------------------------------------- ##
+configure: WARNING:     ## --------------------------------------- ##
 configure: WARNING:     ## Report this to bug-example@@example.org ##
-configure: WARNING:     ## -------------------------------------- ##
-checking for pi.h... yes
+configure: WARNING:     ## --------------------------------------- ##
+checking for pi.h... no
 @end smallexample
 
 @noindent
@@ -25988,16 +25963,16 @@ AC_CHECK_HEADERS([number.h pi.h], [], [],
 #endif
 ]])
 $ @kbd{autoconf -Wall}
-$ @kbd{./configure}
+$ @kbd{./configure CPPFLAGS='-I.'}
 checking for gcc... gcc
-checking for C compiler default output... a.out
 checking whether the C compiler works... yes
-checking whether we are cross compiling... no
+checking for C compiler default output file name... a.out
 checking for suffix of executables...
+checking whether we are cross compiling... no
 checking for suffix of object files... o
 checking whether we are using the GNU C compiler... yes
 checking whether gcc accepts -g... yes
-checking for gcc option to accept ANSI C... none needed
+checking for gcc option to accept ISO C11... -std=gnu11
 checking for number.h... yes
 checking for pi.h... yes
 @end example
diff --git a/lib/autoconf/c.m4 b/lib/autoconf/c.m4
index 614d9b7..808c104 100644
--- a/lib/autoconf/c.m4
+++ b/lib/autoconf/c.m4
@@ -1437,43 +1437,26 @@ dnl with extended modes being tried first.
 ])# _AC_PROG_CC_C11
 
 
-# _AC_PROG_CC_FORCE_VERSION(LOWER-VERSION, UPPER-VERSION)
-# -------------------------------------------------------
-# Require a compiler for a particular version of C, either C89 or C99.
-# LOWER-VERSION uses lower-case c, UPPER-VERSION uses upper-case.
-AC_DEFUN([_AC_PROG_CC_FORCE_VERSION],
-[ AC_REQUIRE([AC_PROG_CC])dnl
-  if test $ac_prog_cc_stdc != $1; then
-    ac_save_std_CC=$CC
-    if test -n "$ac_prog_cc_stdc_options"; then
-      CC=`expr "X$CC" : 'X\(.*\)'"$ac_prog_cc_stdc_options"
-       ``expr "X$CC" : ".*$ac_prog_cc_stdc_options"'\(.*\)'
-       `
-    fi
-    _AC_PROG_CC_$2(
-       [ac_prog_cc_stdc=$1
-        ac_cv_prog_cc_stdc=$ac_cv_prog_cc_$1],
-       [CC=$ac_save_std_CC
-        AC_MSG_WARN([$2 compiler not available; falling back on $CC])])
-  fi
-])
-
 # AC_PROG_CC_C89
 # --------------
-AC_DEFUN([AC_PROG_CC_C89], [_AC_PROG_CC_FORCE_VERSION([c89], [C89])])
+AC_DEFUN([AC_PROG_CC_C89],
+[ AC_REQUIRE([AC_PROG_CC])dnl
+  m4_warn([obsolete], [$0 is obsolete; use AC_PROG_CC])
+])
 
 # AC_PROG_CC_C99
 # --------------
-AC_DEFUN([AC_PROG_CC_C99], [_AC_PROG_CC_FORCE_VERSION([c99], [C99])])
-
-# There is no AC_PROG_CC_C11, as we have not identified a need for it.
-# Applications should use AC_PROG_CC instead.
-
+AC_DEFUN([AC_PROG_CC_C99],
+[ AC_REQUIRE([AC_PROG_CC])dnl
+  m4_warn([obsolete], [$0 is obsolete; use AC_PROG_CC])
+])
 
 # AC_PROG_CC_STDC
 # ---------------
-# This has been folded into AC_PROG_CC.
-AU_ALIAS([AC_PROG_CC_STDC], [AC_PROG_CC])
+AC_DEFUN([AC_PROG_CC_STDC],
+[ AC_REQUIRE([AC_PROG_CC])dnl
+  m4_warn([obsolete], [$0 is obsolete; use AC_PROG_CC])
+])
 
 
 # AC_C_BACKSLASH_A
-- 
1.7.11.4



Reply via email to