Re: How to get autoconf to respect CC="gcc -std=c89"?

Jacob Bachmeyer <[email protected]> Sun, 08 Oct 2023 22:43:42 -0500
Newsgroups gmane.comp.sysutils.autoconf.patches,gmane.comp.sysutils.autoconf.general
Message-ID <[email protected]>
Niels Möller wrote:
> [...]
> Jacob Bachmeyer <[email protected]> writes:
>
>   
>> Niels Möller wrote:
>>     
>>>   AC_C_STANDARD_VERSION([c89 c99])
>>>
>>> is a bit meaningless; if compiler has c89, that's what will be used, and
>>> if it doesn't have c89, it won't have c99 either. 
>>>       
>> Free compilers may behave that way, however I have vague memories of a
>> compiler that dropped support for K&R function definitions many years
>> ago, long before GCC did.  Since Autoconf seeks portability, including
>> to non-free systems, preferring C89 but accepting C99 is reasonable to
>> express.  There may be non-free compilers out there that do not accept
>> C89 but do accept C99.
>>     
>
> I would have expected that every input that is valid c89 also is valid
> c99, so that support for c99 strictly implies support for c89. But there
> may be some corner case I'm not aware of.
>   

I believe that Autoconf effectively tests for declared support, so a 
compiler lacking a C89 mode will appear to not support C89, even if C99 
is a strict superset of C89 and the compiler /does/ support C99.

>> Some quick tests here suggest that "patsubst(patsubst([c99 c89], [c]),
>> [ ], [, ])" should do that trick.
>>     
>
> I'm trying for something a bit more complicated, which allows additional
> white space as well as capital C89, but still rejects unknown versions.
>   

8<------ [test.m4]
changequote([,])dnl
define([convert_list], [patsubst(patsubst($1, [[Cc]]), [ +], [, ])])dnl
define([test], ["$1" -> "convert_list($1)"])dnl
test([c89 c99])
test([C99 c89])
test([C11   c89 c99])
8<------

I believe the "convert_list" macro in the above test file fulfills the 
translation requirements, but validation is a separate matter.  
Validating the result should be easier after it has been normalized to a 
comma-delimited list of numbers.  Since I believe the proper name of the 
language is "C" (uppercase), normalizing case in an "unknown C language 
edition" error should be fine.

>> How about "error:  AC_PROG_CC_STANDARD_EDITION used after AC_PROG_CC
>> invoked"?
>>     
>
> I agree that's better. (It will still trigger also on repeated
> AC_PROG_CC_STANDARD_EDITION, but maybe error message is good enough
> despite that?)
>   

Simple solution:  "error: AC_PROG_CC_STANDARD_EDITON used twice or after 
AC_PROG_CC invoked"  :-)


-- Jacob