]> granicus.if.org Git - postgresql/commitdiff
Select appropriate PG_PRINTF_ATTRIBUTE for recent NetBSD.
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 9 Oct 2018 15:10:07 +0000 (11:10 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 9 Oct 2018 15:10:07 +0000 (11:10 -0400)
NetBSD-current generates a large number of warnings about "%m" not
being appropriate to use with *printf functions.  While that's true
for their native printf, it's surely not true for snprintf.c, so I
think they have misunderstood gcc's definition of the "gnu_printf"
archetype.  Nonetheless, choosing "__syslog__" instead silences the
warnings; so teach configure about that.

Since this is only a cosmetic warning issue (and anyway it depends
on previous hacking to be self-consistent), no back-patch.

Discussion: https://postgr.es/m/16785.1539046036@sss.pgh.pa.us

config/c-compiler.m4
configure
src/include/pg_config.h.in

index fb58c94d4b00efeb4a826945aa9478ae71ab26fc..af2dea1c2abcba9847372a535fdf88daebc96a48 100644 (file)
@@ -21,21 +21,36 @@ fi])# PGAC_C_SIGNED
 # -----------------------
 # Select the format archetype to be used by gcc to check printf-type functions.
 # We prefer "gnu_printf", as that most closely matches the features supported
-# by src/port/snprintf.c (particularly the %m conversion spec).
+# by src/port/snprintf.c (particularly the %m conversion spec).  However,
+# on some NetBSD versions, that doesn't work while "__syslog__" does.
+# If all else fails, use "printf".
 AC_DEFUN([PGAC_PRINTF_ARCHETYPE],
 [AC_CACHE_CHECK([for printf format archetype], pgac_cv_printf_archetype,
+[pgac_cv_printf_archetype=gnu_printf
+PGAC_TEST_PRINTF_ARCHETYPE
+if [[ "$ac_archetype_ok" = no ]]; then
+  pgac_cv_printf_archetype=__syslog__
+  PGAC_TEST_PRINTF_ARCHETYPE
+  if [[ "$ac_archetype_ok" = no ]]; then
+    pgac_cv_printf_archetype=printf
+  fi
+fi])
+AC_DEFINE_UNQUOTED([PG_PRINTF_ATTRIBUTE], [$pgac_cv_printf_archetype],
+[Define to best printf format archetype, usually gnu_printf if available.])
+])# PGAC_PRINTF_ARCHETYPE
+
+# Subroutine: test $pgac_cv_printf_archetype, set $ac_archetype_ok to yes or no
+AC_DEFUN([PGAC_TEST_PRINTF_ARCHETYPE],
 [ac_save_c_werror_flag=$ac_c_werror_flag
 ac_c_werror_flag=yes
 AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
-[extern int
-pgac_write(int ignore, const char *fmt,...)
-__attribute__((format(gnu_printf, 2, 3)));], [])],
-                  [pgac_cv_printf_archetype=gnu_printf],
-                  [pgac_cv_printf_archetype=printf])
-ac_c_werror_flag=$ac_save_c_werror_flag])
-AC_DEFINE_UNQUOTED([PG_PRINTF_ATTRIBUTE], [$pgac_cv_printf_archetype],
-                   [Define to gnu_printf if compiler supports it, else printf.])
-])# PGAC_PRINTF_ARCHETYPE
+[extern void pgac_write(int ignore, const char *fmt,...)
+__attribute__((format($pgac_cv_printf_archetype, 2, 3)));],
+[pgac_write(0, "error %s: %m", "foo");])],
+                  [ac_archetype_ok=yes],
+                  [ac_archetype_ok=no])
+ac_c_werror_flag=$ac_save_c_werror_flag
+])# PGAC_TEST_PRINTF_ARCHETYPE
 
 
 # PGAC_TYPE_64BIT_INT(TYPE)
index 0448c6bfebfbad6f27ef131d13c00cf56fd2f48e..b7250d7f5b8d108f4798ca5fb42cad4e57e977c2 100755 (executable)
--- a/configure
+++ b/configure
@@ -13583,28 +13583,57 @@ $as_echo_n "checking for printf format archetype... " >&6; }
 if ${pgac_cv_printf_archetype+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  ac_save_c_werror_flag=$ac_c_werror_flag
+  pgac_cv_printf_archetype=gnu_printf
+ac_save_c_werror_flag=$ac_c_werror_flag
 ac_c_werror_flag=yes
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-extern int
-pgac_write(int ignore, const char *fmt,...)
-__attribute__((format(gnu_printf, 2, 3)));
+extern void pgac_write(int ignore, const char *fmt,...)
+__attribute__((format($pgac_cv_printf_archetype, 2, 3)));
 int
 main ()
 {
+pgac_write(0, "error %s: %m", "foo");
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_archetype_ok=yes
+else
+  ac_archetype_ok=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_c_werror_flag=$ac_save_c_werror_flag
 
+if [ "$ac_archetype_ok" = no ]; then
+  pgac_cv_printf_archetype=__syslog__
+  ac_save_c_werror_flag=$ac_c_werror_flag
+ac_c_werror_flag=yes
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+extern void pgac_write(int ignore, const char *fmt,...)
+__attribute__((format($pgac_cv_printf_archetype, 2, 3)));
+int
+main ()
+{
+pgac_write(0, "error %s: %m", "foo");
   ;
   return 0;
 }
 _ACEOF
 if ac_fn_c_try_compile "$LINENO"; then :
-  pgac_cv_printf_archetype=gnu_printf
+  ac_archetype_ok=yes
 else
-  pgac_cv_printf_archetype=printf
+  ac_archetype_ok=no
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 ac_c_werror_flag=$ac_save_c_werror_flag
+
+  if [ "$ac_archetype_ok" = no ]; then
+    pgac_cv_printf_archetype=printf
+  fi
+fi
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_printf_archetype" >&5
 $as_echo "$pgac_cv_printf_archetype" >&6; }
index 7894caa8c12c0b31ab56545607b1fd2591915d7d..9798bd24b447661db7d2e32efb7a7142acbf8114 100644 (file)
 /* PostgreSQL major version as a string */
 #undef PG_MAJORVERSION
 
-/* Define to gnu_printf if compiler supports it, else printf. */
+/* Define to best printf format archetype, usually gnu_printf if available. */
 #undef PG_PRINTF_ATTRIBUTE
 
 /* PostgreSQL version as a string */