diff options
author | Bruno Haible <bruno@clisp.org> | 2019-11-16 13:13:58 +0100 |
---|---|---|
committer | Bruno Haible <bruno@clisp.org> | 2019-11-16 13:13:58 +0100 |
commit | b7bf9f4361c8d78ccfda7a30ff31f7a406ea972e (patch) | |
tree | 2186d0634ebd17161fdba59c9a4ff70c571e6db2 /m4 | |
parent | 5f8e536e11e8be936768592b8c24e18350e2f775 (diff) | |
download | gnulib-b7bf9f4361c8d78ccfda7a30ff31f7a406ea972e.tar.gz |
time_r: Fix for mingw.
Reported by Christian Biesinger <cbiesinger@google.com> in
<https://lists.gnu.org/archive/html/bug-gnulib/2019-11/msg00014.html>.
* lib/time.in.h: On mingw, include <unistd.h>.
* m4/time_r.m4 (gl_TIME_R): On mingw, include <unistd.h> before
<time.h>. Test for localtime_r in a way that works when it is defined
as an inline function.
Diffstat (limited to 'm4')
-rw-r--r-- | m4/time_r.m4 | 43 |
1 files changed, 39 insertions, 4 deletions
diff --git a/m4/time_r.m4 b/m4/time_r.m4 index 5caeca7509..72cc97508a 100644 --- a/m4/time_r.m4 +++ b/m4/time_r.m4 @@ -17,19 +17,54 @@ AC_DEFUN([gl_TIME_R], dnl Some systems don't declare localtime_r() and gmtime_r() if _REENTRANT is dnl not defined. - AC_CHECK_DECLS([localtime_r], [], [], [[#include <time.h>]]) + AC_CHECK_DECLS([localtime_r], [], [], + [[/* mingw's <time.h> provides the functions asctime_r, ctime_r, + gmtime_r, localtime_r only if <unistd.h> or <pthread.h> has + been included before. */ + #if defined __MINGW32__ + # include <unistd.h> + #endif + #include <time.h> + ]]) if test $ac_cv_have_decl_localtime_r = no; then HAVE_DECL_LOCALTIME_R=0 fi - AC_CHECK_FUNCS_ONCE([localtime_r]) - if test $ac_cv_func_localtime_r = yes; then + dnl We can't use AC_CHECK_FUNC here, because localtime_r() is defined as an + dnl inline function on mingw. + AC_CACHE_CHECK([for localtime_r], [gl_cv_func_localtime_r], + [AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [[/* mingw's <time.h> provides the functions asctime_r, ctime_r, + gmtime_r, localtime_r only if <unistd.h> or <pthread.h> has + been included before. */ + #if defined __MINGW32__ + # include <unistd.h> + #endif + #include <time.h> + ]], + [[time_t a; + struct tm r; + localtime_r (&a, &r); + ]]) + ], + [gl_cv_func_localtime_r=yes], + [gl_cv_func_localtime_r=no]) + ]) + if test $gl_cv_func_localtime_r = yes; then HAVE_LOCALTIME_R=1 AC_CACHE_CHECK([whether localtime_r is compatible with its POSIX signature], [gl_cv_time_r_posix], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( - [[#include <time.h>]], + [[/* mingw's <time.h> provides the functions asctime_r, ctime_r, + gmtime_r, localtime_r only if <unistd.h> or <pthread.h> has + been included before. */ + #if defined __MINGW32__ + # include <unistd.h> + #endif + #include <time.h> + ]], [[/* We don't need to append 'restrict's to the argument types, even though the POSIX signature has the 'restrict's, since C99 says they can't affect type compatibility. */ |