pg_config_manual.h has been choosing gnu_printf as the PG_PRINTF_ATTRIBUTE for
every MinGW build.  That invites a torrent of warnings on pre-gcc-4.4 MinGW
compilers, including the compiler on buildfarm member narwhal.  I'm
increasingly using an affected compiler, because it builds twice as quickly as
today's gcc.  Let's have "configure" detect whether gcc supports gnu_printf
before using it.  I gather plain "printf" aliases ms_printf on Windows and
gnu_printf elsewhere.  Therefore, while the new "configure" test applies to
all platforms, non-Windows platforms are disinterested in the outcome today.
Suppose gcc introduces aix_printf and has plain "printf" alias it on AIX.
PostgreSQL will continue to replace platform printf implementations that
depart from our format processing expectations, and our own elog.c code
processes errmsg() formats.  Therefore, gnu_printf would remain the better
global choice even if new archetypes become available.
diff --git a/config/c-compiler.m4 b/config/c-compiler.m4
index 2cf74bb..90b56e7 100644
--- a/config/c-compiler.m4
+++ b/config/c-compiler.m4
@@ -51,6 +51,27 @@ fi
 ])# PGAC_C_INLINE
 
 
+# PGAC_C_PRINTF_ARCHETYPE
+# -----------------------
+# Set the format archetype used by gcc to check printf type functions.  We
+# prefer "gnu_printf", which includes what glibc uses, such as %m for error
+# strings and %lld for 64 bit long longs.  GCC 4.4 introduced it.  It makes a
+# dramatic difference on Windows.
+AC_DEFUN([PGAC_PRINTF_ARCHETYPE],
+[AC_CACHE_CHECK([for printf format archetype], pgac_cv_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
+
 
 # PGAC_TYPE_64BIT_INT(TYPE)
 # -------------------------
diff --git a/configure b/configure
index 1248b06..463fc27 100755
--- a/configure
+++ b/configure
@@ -10063,6 +10063,42 @@ _ACEOF
 
 fi
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for printf format archetype" 
>&5
+$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
+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)));
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  pgac_cv_printf_archetype=gnu_printf
+else
+  pgac_cv_printf_archetype=printf
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_printf_archetype" >&5
+$as_echo "$pgac_cv_printf_archetype" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define PG_PRINTF_ATTRIBUTE $pgac_cv_printf_archetype
+_ACEOF
+
+
 
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for flexible array 
members" >&5
 $as_echo_n "checking for flexible array members... " >&6; }
diff --git a/configure.in b/configure.in
index 0a3725f..7f4a330 100644
--- a/configure.in
+++ b/configure.in
@@ -1163,6 +1163,7 @@ fi
 m4_defun([AC_PROG_CC_STDC], []) dnl We don't want that.
 AC_C_BIGENDIAN
 PGAC_C_INLINE
+PGAC_PRINTF_ARCHETYPE
 AC_C_FLEXIBLE_ARRAY_MEMBER
 PGAC_C_SIGNED
 PGAC_C_FUNCNAME_SUPPORT
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index 3e78d65..465281c 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -718,6 +718,9 @@
 /* PostgreSQL major version as a string */
 #undef PG_MAJORVERSION
 
+/* Define to gnu_printf if compiler supports it, else printf. */
+#undef PG_PRINTF_ATTRIBUTE
+
 /* Define to 1 if "static inline" works without unwanted warnings from
    compilations where static inline functions are defined but not called. */
 #undef PG_USE_INLINE
diff --git a/src/include/pg_config_manual.h b/src/include/pg_config_manual.h
index 9e25ce0..1e64c10 100644
--- a/src/include/pg_config_manual.h
+++ b/src/include/pg_config_manual.h
@@ -188,22 +188,6 @@
 #define MAX_RANDOM_VALUE  (0x7FFFFFFF)
 
 /*
- * Set the format style used by gcc to check printf type functions. We really
- * want the "gnu_printf" style set, which includes what glibc uses, such
- * as %m for error strings and %lld for 64 bit long longs. But not all gcc
- * compilers are known to support it, so we just use "printf" which all
- * gcc versions alive are known to support, except on Windows where
- * using "gnu_printf" style makes a dramatic difference. Maybe someday
- * we'll have a configure test for this, if we ever discover use of more
- * variants to be necessary.
- */
-#ifdef WIN32
-#define PG_PRINTF_ATTRIBUTE gnu_printf
-#else
-#define PG_PRINTF_ATTRIBUTE printf
-#endif
-
-/*
  * On PPC machines, decide whether to use the mutex hint bit in LWARX
  * instructions.  Setting the hint bit will slightly improve spinlock
  * performance on POWER6 and later machines, but does nothing before that,
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to