From b779168ffe330d137b8b4329a7710c8bf1f7e661 Mon Sep 17 00:00:00 2001 From: Noah Misch Date: Sun, 23 Nov 2014 09:34:03 -0500 Subject: [PATCH] Detect PG_PRINTF_ATTRIBUTE automatically. This eliminates gobs of "unrecognized format function type" warnings under MinGW compilers predating GCC 4.4. --- config/c-compiler.m4 | 21 ++++++++++++++++++++ configure | 36 ++++++++++++++++++++++++++++++++++ configure.in | 1 + src/include/pg_config.h.in | 3 +++ src/include/pg_config_manual.h | 16 --------------- 5 files changed, 61 insertions(+), 16 deletions(-) diff --git a/config/c-compiler.m4 b/config/c-compiler.m4 index 2cf74bbb2a..90b56e770c 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 c4f70e806e..7594401f03 100755 --- a/configure +++ b/configure @@ -10094,6 +10094,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 2465f26d31..0dc3f189c5 100644 --- a/configure.in +++ b/configure.in @@ -1170,6 +1170,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 3e78d65dd7..465281c60e 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 265dae064e..b82f0f70bd 100644 --- a/src/include/pg_config_manual.h +++ b/src/include/pg_config_manual.h @@ -187,22 +187,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 -- 2.40.0