Skip to content

Commit 102be66

Browse files
committed
If a C23 compiler is detected, try asking for C17.
Branches before 16 can't be compiled with a C23 compiler (see deprecation warnings silenced by commit f9a56e7, and non-back-patchable changes made in 16 by commit 1c27d16). Test __STDC_VERSION__, and if it's above C17 then try appending -std=gnu17. The test is done with the user's CFLAGS, so an acceptable language version can also be configured manually that way. This is done in branches 15 and older, back to 9.2, per policy of keeping them buildable with modern tools. Discussion: https://postgr.es/m/87o72eo9iu.fsf%40gentoo.org
1 parent 8f3be96 commit 102be66

File tree

2 files changed

+144
-0
lines changed

2 files changed

+144
-0
lines changed

configure

+124
Original file line numberDiff line numberDiff line change
@@ -3949,6 +3949,130 @@ else
39493949
fi
39503950
fi
39513951

3952+
# We use C constructs that became invalid in C23. Check if the compiler
3953+
# reports a standard higher than C17, with the flags selected above (so the
3954+
# user can control the language level explicitly to avoid the gcc/clang-only
3955+
# fallback logic below if preferred).
3956+
{ $as_echo "$as_me:$LINENO: checking whether $CC reports a C standard higher than ISO C17" >&5
3957+
$as_echo_n "checking whether $CC reports a C standard higher than ISO C17... " >&6; }
3958+
cat >conftest.$ac_ext <<_ACEOF
3959+
/* confdefs.h. */
3960+
_ACEOF
3961+
cat confdefs.h >>conftest.$ac_ext
3962+
cat >>conftest.$ac_ext <<_ACEOF
3963+
/* end confdefs.h. */
3964+
3965+
int
3966+
main ()
3967+
{
3968+
#if __STDC_VERSION__ > 201710L
3969+
choke me
3970+
#endif
3971+
;
3972+
return 0;
3973+
}
3974+
_ACEOF
3975+
rm -f conftest.$ac_objext
3976+
if { (ac_try="$ac_compile"
3977+
case "(($ac_try" in
3978+
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
3979+
*) ac_try_echo=$ac_try;;
3980+
esac
3981+
eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
3982+
$as_echo "$ac_try_echo") >&5
3983+
(eval "$ac_compile") 2>conftest.er1
3984+
ac_status=$?
3985+
grep -v '^ *+' conftest.er1 >conftest.err
3986+
rm -f conftest.er1
3987+
cat conftest.err >&5
3988+
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
3989+
(exit $ac_status); } && {
3990+
test -z "$ac_c_werror_flag" ||
3991+
test ! -s conftest.err
3992+
} && test -s conftest.$ac_objext; then
3993+
POSTC17=no
3994+
else
3995+
$as_echo "$as_me: failed program was:" >&5
3996+
sed 's/^/| /' conftest.$ac_ext >&5
3997+
3998+
POSTC17=yes
3999+
fi
4000+
4001+
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
4002+
{ $as_echo "$as_me:$LINENO: result: ${POSTC17}" >&5
4003+
$as_echo "${POSTC17}" >&6; }
4004+
4005+
# If a too recent standard was detected with the user's CFLAGS, try asking for
4006+
# C17 with GNU extensions explicitly.
4007+
if test "$POSTC17" = yes; then
4008+
old_CFLAGS="$CFLAGS"
4009+
{ $as_echo "$as_me:$LINENO: checking whether $CC supports -std=gnu17" >&5
4010+
$as_echo_n "checking whether $CC supports -std=gnu17... " >&6; }
4011+
if test "${pgac_cv_prog_cc_cflags__std_gnu17+set}" = set; then
4012+
$as_echo_n "(cached) " >&6
4013+
else
4014+
pgac_save_CFLAGS=$CFLAGS
4015+
CFLAGS="$pgac_save_CFLAGS -std=gnu17"
4016+
ac_save_c_werror_flag=$ac_c_werror_flag
4017+
ac_c_werror_flag=yes
4018+
cat >conftest.$ac_ext <<_ACEOF
4019+
/* confdefs.h. */
4020+
_ACEOF
4021+
cat confdefs.h >>conftest.$ac_ext
4022+
cat >>conftest.$ac_ext <<_ACEOF
4023+
/* end confdefs.h. */
4024+
4025+
int
4026+
main ()
4027+
{
4028+
4029+
;
4030+
return 0;
4031+
}
4032+
_ACEOF
4033+
rm -f conftest.$ac_objext
4034+
if { (ac_try="$ac_compile"
4035+
case "(($ac_try" in
4036+
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
4037+
*) ac_try_echo=$ac_try;;
4038+
esac
4039+
eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
4040+
$as_echo "$ac_try_echo") >&5
4041+
(eval "$ac_compile") 2>conftest.er1
4042+
ac_status=$?
4043+
grep -v '^ *+' conftest.er1 >conftest.err
4044+
rm -f conftest.er1
4045+
cat conftest.err >&5
4046+
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
4047+
(exit $ac_status); } && {
4048+
test -z "$ac_c_werror_flag" ||
4049+
test ! -s conftest.err
4050+
} && test -s conftest.$ac_objext; then
4051+
pgac_cv_prog_cc_cflags__std_gnu17=yes
4052+
else
4053+
$as_echo "$as_me: failed program was:" >&5
4054+
sed 's/^/| /' conftest.$ac_ext >&5
4055+
4056+
pgac_cv_prog_cc_cflags__std_gnu17=no
4057+
fi
4058+
4059+
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
4060+
ac_c_werror_flag=$ac_save_c_werror_flag
4061+
CFLAGS="$pgac_save_CFLAGS"
4062+
fi
4063+
{ $as_echo "$as_me:$LINENO: result: $pgac_cv_prog_cc_cflags__std_gnu17" >&5
4064+
$as_echo "$pgac_cv_prog_cc_cflags__std_gnu17" >&6; }
4065+
if test x"$pgac_cv_prog_cc_cflags__std_gnu17" = x"yes"; then
4066+
CFLAGS="$CFLAGS -std=gnu17"
4067+
fi
4068+
4069+
if test "$CFLAGS" = "$old_CFLAGS"; then
4070+
{ { $as_echo "$as_me:$LINENO: error: cannot proceed" >&5
4071+
$as_echo "$as_me: error: cannot proceed" >&2;}
4072+
{ (exit 1); exit 1; }; }
4073+
fi
4074+
fi
4075+
39524076
# set CFLAGS_VECTOR from the environment, if available
39534077
if test "$ac_env_CFLAGS_VECTOR_set" = set; then
39544078
CFLAGS_VECTOR=$ac_env_CFLAGS_VECTOR_value

configure.in

+20
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,26 @@ else
400400
fi
401401
fi
402402

403+
# We use C constructs that became invalid in C23. Check if the compiler
404+
# reports a standard higher than C17, with the flags selected above (so the
405+
# user can control the language level explicitly to avoid the gcc/clang-only
406+
# fallback logic below if preferred).
407+
AC_MSG_CHECKING([whether $CC reports a C standard higher than ISO C17])
408+
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [@%:@if __STDC_VERSION__ > 201710L
409+
choke me
410+
@%:@endif])], [POSTC17=no], [POSTC17=yes])
411+
AC_MSG_RESULT(${POSTC17})
412+
413+
# If a too recent standard was detected with the user's CFLAGS, try asking for
414+
# C17 with GNU extensions explicitly.
415+
if test "$POSTC17" = yes; then
416+
old_CFLAGS="$CFLAGS"
417+
PGAC_PROG_CC_CFLAGS_OPT([-std=gnu17])
418+
if test "$CFLAGS" = "$old_CFLAGS"; then
419+
AC_MSG_ERROR([cannot proceed])
420+
fi
421+
fi
422+
403423
# set CFLAGS_VECTOR from the environment, if available
404424
if test "$ac_env_CFLAGS_VECTOR_set" = set; then
405425
CFLAGS_VECTOR=$ac_env_CFLAGS_VECTOR_value

0 commit comments

Comments
 (0)