Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Munro2024-11-27 02:43:18 +0000
committerThomas Munro2024-11-27 03:47:29 +0000
commitf4e8f137bfb08a664c8288824c1e36b5143ac875 (patch)
tree8f6bbcd318b2a66c034b4145b6edab66f699c674
parent320534f8f25bf5aa2de4ad1f561b71219cb4e5ff (diff)
If a C23 compiler is detected, try asking for C17.REL_10_STABLE
Branches before 16 can't be compiled with a C23 compiler (see deprecation warnings silenced by commit f9a56e72, and non-back-patchable changes made in 16 by commit 1c27d16e). 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
-rwxr-xr-xconfigure72
-rw-r--r--configure.in20
2 files changed, 92 insertions, 0 deletions
diff --git a/configure b/configure
index 0c3e8784a1d..f4f4b2e0a91 100755
--- a/configure
+++ b/configure
@@ -4508,6 +4508,78 @@ else
fi
fi
+# We use C constructs that became invalid in C23. Check if the compiler
+# reports a standard higher than C17, with the flags selected above (so the
+# user can control the language level explicitly to avoid the gcc/clang-only
+# fallback logic below if preferred).
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC reports a C standard higher than ISO C17" >&5
+$as_echo_n "checking whether $CC reports a C standard higher than ISO C17... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+#if __STDC_VERSION__ > 201710L
+choke me
+#endif
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ POSTC17=no
+else
+ POSTC17=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${POSTC17}" >&5
+$as_echo "${POSTC17}" >&6; }
+
+# If a too recent standard was detected with the user's CFLAGS, try asking for
+# C17 with GNU extensions explicitly.
+if test "$POSTC17" = yes; then
+ old_CFLAGS="$CFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -std=gnu17" >&5
+$as_echo_n "checking whether $CC supports -std=gnu17... " >&6; }
+if ${pgac_cv_prog_cc_cflags__std_gnu17+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ pgac_save_CFLAGS=$CFLAGS
+CFLAGS="$pgac_save_CFLAGS -std=gnu17"
+ac_save_c_werror_flag=$ac_c_werror_flag
+ac_c_werror_flag=yes
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ pgac_cv_prog_cc_cflags__std_gnu17=yes
+else
+ pgac_cv_prog_cc_cflags__std_gnu17=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_c_werror_flag=$ac_save_c_werror_flag
+CFLAGS="$pgac_save_CFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_cc_cflags__std_gnu17" >&5
+$as_echo "$pgac_cv_prog_cc_cflags__std_gnu17" >&6; }
+if test x"$pgac_cv_prog_cc_cflags__std_gnu17" = x"yes"; then
+ CFLAGS="$CFLAGS -std=gnu17"
+fi
+
+ if test "$CFLAGS" = "$old_CFLAGS"; then
+ as_fn_error $? "cannot proceed" "$LINENO" 5
+ fi
+fi
+
# CFLAGS we determined above will be added back at the end
user_CFLAGS=$CFLAGS
CFLAGS=""
diff --git a/configure.in b/configure.in
index 06cb0e5e69f..67c3cc2807c 100644
--- a/configure.in
+++ b/configure.in
@@ -434,6 +434,26 @@ else
fi
fi
+# We use C constructs that became invalid in C23. Check if the compiler
+# reports a standard higher than C17, with the flags selected above (so the
+# user can control the language level explicitly to avoid the gcc/clang-only
+# fallback logic below if preferred).
+AC_MSG_CHECKING([whether $CC reports a C standard higher than ISO C17])
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [@%:@if __STDC_VERSION__ > 201710L
+choke me
+@%:@endif])], [POSTC17=no], [POSTC17=yes])
+AC_MSG_RESULT(${POSTC17})
+
+# If a too recent standard was detected with the user's CFLAGS, try asking for
+# C17 with GNU extensions explicitly.
+if test "$POSTC17" = yes; then
+ old_CFLAGS="$CFLAGS"
+ PGAC_PROG_CC_CFLAGS_OPT([-std=gnu17])
+ if test "$CFLAGS" = "$old_CFLAGS"; then
+ AC_MSG_ERROR([cannot proceed])
+ fi
+fi
+
# CFLAGS we determined above will be added back at the end
user_CFLAGS=$CFLAGS
CFLAGS=""