Fix gnulib to not replace gmtime() and localtime()

It cause issues when <ctime> latter undefine the gmtime/localtime macros
to access the real function.

* lib/Makefile.am, lib/time.in.h, m4/gettimeofday.m4, m4/time_h.m4:
These changes are mostly based on the patch posted in
http://permalink.gmane.org/gmane.comp.lib.gnulib.bugs/29229 but
with the prototype of gmtime() and localtime() fixed.
This commit is contained in:
Alexandre Duret-Lutz 2013-07-18 19:55:45 +02:00
parent 96f32c73fb
commit 16b7206dd9
4 changed files with 51 additions and 4 deletions

View file

@ -1450,9 +1450,13 @@ time.h: time.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(
-e 's/@''GNULIB_TIMEGM''@/$(GNULIB_TIMEGM)/g' \ -e 's/@''GNULIB_TIMEGM''@/$(GNULIB_TIMEGM)/g' \
-e 's/@''GNULIB_TIME_R''@/$(GNULIB_TIME_R)/g' \ -e 's/@''GNULIB_TIME_R''@/$(GNULIB_TIME_R)/g' \
-e 's|@''HAVE_DECL_LOCALTIME_R''@|$(HAVE_DECL_LOCALTIME_R)|g' \ -e 's|@''HAVE_DECL_LOCALTIME_R''@|$(HAVE_DECL_LOCALTIME_R)|g' \
-e 's|@''HAVE_LOCALTIME''@|$(HAVE_LOCALTIME)|g' \
-e 's|@''HAVE_GMTIME''@|$(HAVE_GMTIME)|g' \
-e 's|@''HAVE_NANOSLEEP''@|$(HAVE_NANOSLEEP)|g' \ -e 's|@''HAVE_NANOSLEEP''@|$(HAVE_NANOSLEEP)|g' \
-e 's|@''HAVE_STRPTIME''@|$(HAVE_STRPTIME)|g' \ -e 's|@''HAVE_STRPTIME''@|$(HAVE_STRPTIME)|g' \
-e 's|@''HAVE_TIMEGM''@|$(HAVE_TIMEGM)|g' \ -e 's|@''HAVE_TIMEGM''@|$(HAVE_TIMEGM)|g' \
-e 's|@''REPLACE_GMTIME''@|$(REPLACE_GMTIME)|g' \
-e 's|@''REPLACE_LOCALTIME''@|$(REPLACE_LOCALTIME)|g' \
-e 's|@''REPLACE_LOCALTIME_R''@|$(REPLACE_LOCALTIME_R)|g' \ -e 's|@''REPLACE_LOCALTIME_R''@|$(REPLACE_LOCALTIME_R)|g' \
-e 's|@''REPLACE_MKTIME''@|$(REPLACE_MKTIME)|g' \ -e 's|@''REPLACE_MKTIME''@|$(REPLACE_MKTIME)|g' \
-e 's|@''REPLACE_NANOSLEEP''@|$(REPLACE_NANOSLEEP)|g' \ -e 's|@''REPLACE_NANOSLEEP''@|$(REPLACE_NANOSLEEP)|g' \

View file

@ -187,6 +187,40 @@ _GL_CXXALIASWARN (gmtime_r);
# endif # endif
# endif # endif
/* Convert TIMER to RESULT, assuming local time and UTC respectively. See
<http://www.opengroup.org/susv3xsh/localtime.html> and
<http://www.opengroup.org/susv3xsh/gmtime.html>. */
# if @REPLACE_LOCALTIME@
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
# undef localtime
# define localtime rpl_localtime
# endif
_GL_FUNCDECL_RPL (localtime, struct tm *, (time_t const *__timer)
_GL_ARG_NONNULL ((1)));
_GL_CXXALIAS_RPL (localtime, struct tm *, (time_t const *__timer));
# else
# if ! @HAVE_LOCALTIME@
_GL_FUNCDECL_SYS (localtime, struct tm *, (time_t const *__timer)
_GL_ARG_NONNULL ((1)));
# endif
_GL_CXXALIAS_SYS (localtime, struct tm *, (time_t const *__timer));
# endif
# if @REPLACE_GMTIME@
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
# undef gmtime
# define gmtime rpl_gmtime
# endif
_GL_FUNCDECL_RPL (gmtime, struct tm *, (time_t const *__timer)
_GL_ARG_NONNULL ((1)));
_GL_CXXALIAS_RPL (gmtime, struct tm *, (time_t const *__timer));
# else
# if ! @HAVE_GMTIME@
_GL_FUNCDECL_SYS (gmtime, struct tm *, (time_t const *__timer)
_GL_ARG_NONNULL ((1)));
# endif
_GL_CXXALIAS_SYS (gmtime, struct tm *, (time_t const *__timer));
# endif
/* Parse BUF as a time stamp, assuming FORMAT specifies its layout, and store /* Parse BUF as a time stamp, assuming FORMAT specifies its layout, and store
the resulting broken-down time into TM. See the resulting broken-down time into TM. See
<http://www.opengroup.org/susv3xsh/strptime.html>. */ <http://www.opengroup.org/susv3xsh/strptime.html>. */

View file

@ -127,10 +127,15 @@ AC_DEFUN([gl_FUNC_GETTIMEOFDAY_CLOBBER],
]) ])
AC_DEFUN([gl_GETTIMEOFDAY_REPLACE_LOCALTIME], [ AC_DEFUN([gl_GETTIMEOFDAY_REPLACE_LOCALTIME], [
AC_DEFINE([gmtime], [rpl_gmtime], AC_CHECK_FUNCS_ONCE([gmtime localtime])
[Define to rpl_gmtime if the replacement function should be used.]) if test $ac_cv_func_gmtime != yes; then
AC_DEFINE([localtime], [rpl_localtime], HAVE_GMTIME=0
[Define to rpl_localtime if the replacement function should be used.]) fi
if test $ac_cv_func_localtime != yes; then
HAVE_LOCALTIME=0
fi
REPLACE_GMTIME=1
REPLACE_LOCALTIME=1
]) ])
# Prerequisites of lib/gettimeofday.c. # Prerequisites of lib/gettimeofday.c.

View file

@ -96,12 +96,16 @@ AC_DEFUN([gl_HEADER_TIME_H_DEFAULTS],
GNULIB_TIME_R=0; AC_SUBST([GNULIB_TIME_R]) GNULIB_TIME_R=0; AC_SUBST([GNULIB_TIME_R])
dnl Assume proper GNU behavior unless another module says otherwise. dnl Assume proper GNU behavior unless another module says otherwise.
HAVE_DECL_LOCALTIME_R=1; AC_SUBST([HAVE_DECL_LOCALTIME_R]) HAVE_DECL_LOCALTIME_R=1; AC_SUBST([HAVE_DECL_LOCALTIME_R])
HAVE_GMTIME=1; AC_SUBST([HAVE_GMTIME])
HAVE_LOCALTIME=1; AC_SUBST([HAVE_LOCALTIME])
HAVE_NANOSLEEP=1; AC_SUBST([HAVE_NANOSLEEP]) HAVE_NANOSLEEP=1; AC_SUBST([HAVE_NANOSLEEP])
HAVE_STRPTIME=1; AC_SUBST([HAVE_STRPTIME]) HAVE_STRPTIME=1; AC_SUBST([HAVE_STRPTIME])
HAVE_TIMEGM=1; AC_SUBST([HAVE_TIMEGM]) HAVE_TIMEGM=1; AC_SUBST([HAVE_TIMEGM])
dnl If another module says to replace or to not replace, do that. dnl If another module says to replace or to not replace, do that.
dnl Otherwise, replace only if someone compiles with -DGNULIB_PORTCHECK; dnl Otherwise, replace only if someone compiles with -DGNULIB_PORTCHECK;
dnl this lets maintainers check for portability. dnl this lets maintainers check for portability.
REPLACE_GMTIME=GNULIB_PORTCHECK; AC_SUBST([REPLACE_GMTIME])
REPLACE_LOCALTIME=GNULIB_PORTCHECK; AC_SUBST([REPLACE_LOCALTIME])
REPLACE_LOCALTIME_R=GNULIB_PORTCHECK; AC_SUBST([REPLACE_LOCALTIME_R]) REPLACE_LOCALTIME_R=GNULIB_PORTCHECK; AC_SUBST([REPLACE_LOCALTIME_R])
REPLACE_MKTIME=GNULIB_PORTCHECK; AC_SUBST([REPLACE_MKTIME]) REPLACE_MKTIME=GNULIB_PORTCHECK; AC_SUBST([REPLACE_MKTIME])
REPLACE_NANOSLEEP=GNULIB_PORTCHECK; AC_SUBST([REPLACE_NANOSLEEP]) REPLACE_NANOSLEEP=GNULIB_PORTCHECK; AC_SUBST([REPLACE_NANOSLEEP])