Re: Small patch: fix warnings during compilation on FreeBSD - Mailing list pgsql-hackers

From Tom Lane
Subject Re: Small patch: fix warnings during compilation on FreeBSD
Date
Msg-id 5236.1458063187@sss.pgh.pa.us
Whole thread Raw
In response to Re: Small patch: fix warnings during compilation on FreeBSD  (Aleksander Alekseev <a.alekseev@postgrespro.ru>)
Responses Re: Small patch: fix warnings during compilation on FreeBSD
List pgsql-hackers
Aleksander Alekseev <a.alekseev@postgrespro.ru> writes:
> OK, I'm not an expert in Autotools but this patch (see attachment) seems
> to solve a problem.

I fooled around with this some.  I felt originally that it should use
AC_CHECK_DECL, but that turns out not to work because AC_CHECK_DECL
has caching behavior built-in and so the second call did nothing.
However, we should still adopt the probe methodology it uses rather
than inventing our own; basically that's

#ifndef wcstombs_l
(void) wcstombs_l;
#endif

Also, after reviewing the bidding a bit more it seems likely to me
that wcstombs_l() might be declared in <locale.h> on some platforms;
which would be problematic for this test as written if <xlocale.h>
pulls in <locale.h>.  So the right way to make the comparison is to
determine whether stdlib.h+locale.h+xlocale.h succeeds where
stdlib.h+locale.h fails.

I've checked this on my OS X box, which turns out to have the interesting
property that xlocale.h declares wcstombs_l(), but only if you previously
included stdlib.h ... wtf?  But anyway that behavior is part of the
motivation for leaving stdlib.h in the test.

Please verify that the committed version solves your problem on FreeBSD.

> Please note that these changes:
> ... were generated but `autoreconf -iv`. I was not sure what to do
> about them. Eventually I decided to keep them. Still these changes could
> be safely discarded.

Yeah, it's not uncommon for platforms to carry local patches in their
autoconf packages, which results in changes like these.  We make a point
of generating our configure using unmodified GNU autoconf installations,
so as to avoid dependencies on which platform a committer was using to
run autoconf.

            regards, tom lane

diff --git a/config/c-library.m4 b/config/c-library.m4
index 1d28c45..50d068d 100644
*** a/config/c-library.m4
--- b/config/c-library.m4
*************** fi
*** 316,319 ****
  if test "$pgac_cv_type_locale_t" = 'yes (in xlocale.h)'; then
    AC_DEFINE(LOCALE_T_IN_XLOCALE, 1,
              [Define to 1 if `locale_t' requires <xlocale.h>.])
! fi])])# PGAC_HEADER_XLOCALE
--- 316,349 ----
  if test "$pgac_cv_type_locale_t" = 'yes (in xlocale.h)'; then
    AC_DEFINE(LOCALE_T_IN_XLOCALE, 1,
              [Define to 1 if `locale_t' requires <xlocale.h>.])
! fi])# PGAC_TYPE_LOCALE_T
!
!
! # PGAC_FUNC_WCSTOMBS_L
! # --------------------
! # Try to find a declaration for wcstombs_l().  It might be in stdlib.h
! # (following the POSIX requirement for wcstombs()), or in locale.h, or in
! # xlocale.h.  If it's in the latter, define WCSTOMBS_L_IN_XLOCALE.
! #
! AC_DEFUN([PGAC_FUNC_WCSTOMBS_L],
! [AC_CACHE_CHECK([for wcstombs_l declaration], pgac_cv_func_wcstombs_l,
! [AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
! [#include <stdlib.h>
! #include <locale.h>],
! [#ifndef wcstombs_l
! (void) wcstombs_l;
! #endif])],
! [pgac_cv_func_wcstombs_l='yes'],
! [AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
! [#include <stdlib.h>
! #include <locale.h>
! #include <xlocale.h>],
! [#ifndef wcstombs_l
! (void) wcstombs_l;
! #endif])],
! [pgac_cv_func_wcstombs_l='yes (in xlocale.h)'],
! [pgac_cv_func_wcstombs_l='no'])])])
! if test "$pgac_cv_func_wcstombs_l" = 'yes (in xlocale.h)'; then
!   AC_DEFINE(WCSTOMBS_L_IN_XLOCALE, 1,
!             [Define to 1 if `wcstombs_l' requires <xlocale.h>.])
! fi])# PGAC_FUNC_WCSTOMBS_L
diff --git a/configure b/configure
index 08cff23..a45be67 100755
*** a/configure
--- b/configure
*************** $as_echo "#define GETTIMEOFDAY_1ARG 1" >
*** 12364,12369 ****
--- 12364,12422 ----

  fi

+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wcstombs_l declaration" >&5
+ $as_echo_n "checking for wcstombs_l declaration... " >&6; }
+ if ${pgac_cv_func_wcstombs_l+:} false; then :
+   $as_echo_n "(cached) " >&6
+ else
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ /* end confdefs.h.  */
+ #include <stdlib.h>
+ #include <locale.h>
+ int
+ main ()
+ {
+ #ifndef wcstombs_l
+ (void) wcstombs_l;
+ #endif
+   ;
+   return 0;
+ }
+ _ACEOF
+ if ac_fn_c_try_compile "$LINENO"; then :
+   pgac_cv_func_wcstombs_l='yes'
+ else
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ /* end confdefs.h.  */
+ #include <stdlib.h>
+ #include <locale.h>
+ #include <xlocale.h>
+ int
+ main ()
+ {
+ #ifndef wcstombs_l
+ (void) wcstombs_l;
+ #endif
+   ;
+   return 0;
+ }
+ _ACEOF
+ if ac_fn_c_try_compile "$LINENO"; then :
+   pgac_cv_func_wcstombs_l='yes (in xlocale.h)'
+ else
+   pgac_cv_func_wcstombs_l='no'
+ fi
+ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_func_wcstombs_l" >&5
+ $as_echo "$pgac_cv_func_wcstombs_l" >&6; }
+ if test "$pgac_cv_func_wcstombs_l" = 'yes (in xlocale.h)'; then
+
+ $as_echo "#define WCSTOMBS_L_IN_XLOCALE 1" >>confdefs.h
+
+ fi

  # Some versions of libedit contain strlcpy(), setproctitle(), and other
  # symbols that that library has no business exposing to the world.  Pending
diff --git a/configure.in b/configure.in
index 0b7dd97..c298926 100644
*** a/configure.in
--- b/configure.in
*************** fi
*** 1423,1428 ****
--- 1423,1429 ----
  PGAC_VAR_INT_TIMEZONE
  AC_FUNC_ACCEPT_ARGTYPES
  PGAC_FUNC_GETTIMEOFDAY_1ARG
+ PGAC_FUNC_WCSTOMBS_L

  # Some versions of libedit contain strlcpy(), setproctitle(), and other
  # symbols that that library has no business exposing to the world.  Pending
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index b3ceea5..3813226 100644
*** a/src/include/pg_config.h.in
--- b/src/include/pg_config.h.in
***************
*** 851,856 ****
--- 851,859 ----
  /* Define to select Win32-style shared memory. */
  #undef USE_WIN32_SHARED_MEMORY

+ /* Define to 1 if `wcstombs_l' requires <xlocale.h>. */
+ #undef WCSTOMBS_L_IN_XLOCALE
+
  /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
     significant byte first (like Motorola and SPARC, unlike Intel). */
  #if defined AC_APPLE_UNIVERSAL_BUILD
diff --git a/src/include/pg_config.h.win32 b/src/include/pg_config.h.win32
index 8566065..eba36df 100644
*** a/src/include/pg_config.h.win32
--- b/src/include/pg_config.h.win32
***************
*** 657,662 ****
--- 657,665 ----
  /* Define to select Win32-style semaphores. */
  #define USE_WIN32_SEMAPHORES 1

+ /* Define to 1 if `wcstombs_l' requires <xlocale.h>. */
+ /* #undef WCSTOMBS_L_IN_XLOCALE */
+
  /* Number of bits in a file offset, on hosts where this is settable. */
  /* #undef _FILE_OFFSET_BITS */

diff --git a/src/include/utils/pg_locale.h b/src/include/utils/pg_locale.h
index 2e6dba1..0a4b9f7 100644
*** a/src/include/utils/pg_locale.h
--- b/src/include/utils/pg_locale.h
***************
*** 13,19 ****
  #define _PG_LOCALE_

  #include <locale.h>
! #ifdef LOCALE_T_IN_XLOCALE
  #include <xlocale.h>
  #endif

--- 13,19 ----
  #define _PG_LOCALE_

  #include <locale.h>
! #if defined(LOCALE_T_IN_XLOCALE) || defined(WCSTOMBS_L_IN_XLOCALE)
  #include <xlocale.h>
  #endif


pgsql-hackers by date:

Previous
From: Corey Huinker
Date:
Subject: Re: Soliciting Feedback on Improving Server-Side Programming Documentation
Next
From: Robert Haas
Date:
Subject: Re: [PROPOSAL] VACUUM Progress Checker.