Commit 16b7206d authored by Alexandre Duret-Lutz's avatar Alexandre Duret-Lutz

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.
parent 96f32c73
......@@ -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_TIME_R''@/$(GNULIB_TIME_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_STRPTIME''@|$(HAVE_STRPTIME)|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_MKTIME''@|$(REPLACE_MKTIME)|g' \
-e 's|@''REPLACE_NANOSLEEP''@|$(REPLACE_NANOSLEEP)|g' \
......
......@@ -187,6 +187,40 @@ _GL_CXXALIASWARN (gmtime_r);
# 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
the resulting broken-down time into TM. See
<http://www.opengroup.org/susv3xsh/strptime.html>. */
......
......@@ -127,10 +127,15 @@ AC_DEFUN([gl_FUNC_GETTIMEOFDAY_CLOBBER],
])
AC_DEFUN([gl_GETTIMEOFDAY_REPLACE_LOCALTIME], [
AC_DEFINE([gmtime], [rpl_gmtime],
[Define to rpl_gmtime if the replacement function should be used.])
AC_DEFINE([localtime], [rpl_localtime],
[Define to rpl_localtime if the replacement function should be used.])
AC_CHECK_FUNCS_ONCE([gmtime localtime])
if test $ac_cv_func_gmtime != yes; then
HAVE_GMTIME=0
fi
if test $ac_cv_func_localtime != yes; then
HAVE_LOCALTIME=0
fi
REPLACE_GMTIME=1
REPLACE_LOCALTIME=1
])
# Prerequisites of lib/gettimeofday.c.
......
......@@ -96,12 +96,16 @@ AC_DEFUN([gl_HEADER_TIME_H_DEFAULTS],
GNULIB_TIME_R=0; AC_SUBST([GNULIB_TIME_R])
dnl Assume proper GNU behavior unless another module says otherwise.
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_STRPTIME=1; AC_SUBST([HAVE_STRPTIME])
HAVE_TIMEGM=1; AC_SUBST([HAVE_TIMEGM])
dnl If another module says to replace or to not replace, do that.
dnl Otherwise, replace only if someone compiles with -DGNULIB_PORTCHECK;
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_MKTIME=GNULIB_PORTCHECK; AC_SUBST([REPLACE_MKTIME])
REPLACE_NANOSLEEP=GNULIB_PORTCHECK; AC_SUBST([REPLACE_NANOSLEEP])
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment