X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=m4%2Fgettimeofday.m4;h=3c05e59f0636f393c2cf6361b1fd7bf065ffdf5f;hb=bbfcd2f1a92c9bdbb8d7d7d0a8a8c6665c316747;hp=51b916a819915ad308d1040a1cd6a45c89c4bd93;hpb=e5ba383c5c9684ed2abe901d35485b86725fbea8;p=gnulib.git diff --git a/m4/gettimeofday.m4 b/m4/gettimeofday.m4 index 51b916a81..3c05e59f0 100644 --- a/m4/gettimeofday.m4 +++ b/m4/gettimeofday.m4 @@ -1,86 +1,79 @@ -#serial 8 +# serial 20 -# Copyright (C) 2001, 2002, 2003, 2005, 2007 Free Software Foundation, Inc. +# Copyright (C) 2001-2003, 2005, 2007, 2009-2013 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +dnl From Jim Meyering. + AC_DEFUN([gl_FUNC_GETTIMEOFDAY], [ AC_REQUIRE([AC_C_RESTRICT]) - AC_REQUIRE([AC_HEADER_TIME]) - AC_CHECK_HEADERS_ONCE([sys/time.h]) - AC_CHECK_FUNCS([gettimeofday]) - - AC_CHECK_TYPE([suseconds_t], , - [AC_DEFINE([suseconds_t], [int], - [Define to `int' if `suseconds_t' is missing.]) - ], - [ -# if TIME_WITH_SYS_TIME -# include -# include -# else -# if HAVE_SYS_TIME_H -# include -# else -# include -# endif -# endif - ]) - - AC_CACHE_CHECK([for struct timeval], [fu_cv_sys_struct_timeval], - [AC_TRY_COMPILE( - [ -# if TIME_WITH_SYS_TIME -# include -# include -# else -# if HAVE_SYS_TIME_H -# include -# else -# include -# endif -# endif - ], - [static struct timeval x; x.tv_sec = x.tv_usec;], - fu_cv_sys_struct_timeval=yes, - fu_cv_sys_struct_timeval=no) - ]) + AC_REQUIRE([gl_HEADER_SYS_TIME_H]) + AC_REQUIRE([gl_HEADER_SYS_TIME_H_DEFAULTS]) + AC_CHECK_FUNCS_ONCE([gettimeofday]) - if test $fu_cv_sys_struct_timeval = yes; then - AC_DEFINE(HAVE_STRUCT_TIMEVAL, 1, - [Define if struct timeval is declared in or . ]) - fi - - AC_CACHE_CHECK([for gettimeofday whose signature conforms to POSIX], - [ac_cv_func_gettimeofday_posix_signature], - [AC_LINK_IFELSE( - [AC_LANG_PROGRAM( - [[#include - time_t a; - suseconds_t b; - struct timeval c; - ]], - [[ - int x = gettimeofday (&c, 0); - int (*f) (struct timeval *restrict, void *restrict) = gettimeofday; - return !(x | c.tv_sec | c.tv_usec); - ]])], - [ac_cv_func_gettimeofday_posix_signature=yes], - [ac_cv_func_gettimeofday_posix_signature=no])]) - if test $ac_cv_func_gettimeofday_posix_signature = yes; then - AC_DEFINE([HAVE_GETTIMEOFDAY_POSIX_SIGNATURE], 1, - [Define if gettimeofday's signature conforms to POSIX.]) - AC_FUNC_GETTIMEOFDAY_CLOBBER + gl_gettimeofday_timezone=void + if test $ac_cv_func_gettimeofday != yes; then + HAVE_GETTIMEOFDAY=0 else - gl_PREREQ_GETTIMEOFDAY - AC_LIBOBJ([gettimeofday]) + gl_FUNC_GETTIMEOFDAY_CLOBBER + AC_CACHE_CHECK([for gettimeofday with POSIX signature], + [gl_cv_func_gettimeofday_posix_signature], + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[#include + struct timeval c; + int gettimeofday (struct timeval *restrict, void *restrict); + ]], + [[/* glibc uses struct timezone * rather than the POSIX void * + if _GNU_SOURCE is defined. However, since the only portable + use of gettimeofday uses NULL as the second parameter, and + since the glibc definition is actually more typesafe, it is + not worth wrapping this to get a compliant signature. */ + int (*f) (struct timeval *restrict, void *restrict) + = gettimeofday; + int x = f (&c, 0); + return !(x | c.tv_sec | c.tv_usec); + ]])], + [gl_cv_func_gettimeofday_posix_signature=yes], + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[#include +int gettimeofday (struct timeval *restrict, struct timezone *restrict); + ]])], + [gl_cv_func_gettimeofday_posix_signature=almost], + [gl_cv_func_gettimeofday_posix_signature=no])])]) + if test $gl_cv_func_gettimeofday_posix_signature = almost; then + gl_gettimeofday_timezone='struct timezone' + elif test $gl_cv_func_gettimeofday_posix_signature != yes; then + REPLACE_GETTIMEOFDAY=1 + fi + dnl If we override 'struct timeval', we also have to override gettimeofday. + if test $REPLACE_STRUCT_TIMEVAL = 1; then + REPLACE_GETTIMEOFDAY=1 + fi + m4_ifdef([gl_FUNC_TZSET_CLOBBER], [ + gl_FUNC_TZSET_CLOBBER + case "$gl_cv_func_tzset_clobber" in + *yes) + REPLACE_GETTIMEOFDAY=1 + gl_GETTIMEOFDAY_REPLACE_LOCALTIME + AC_DEFINE([tzset], [rpl_tzset], + [Define to rpl_tzset if the wrapper function should be used.]) + AC_DEFINE([TZSET_CLOBBERS_LOCALTIME], [1], + [Define if tzset clobbers localtime's static buffer.]) + ;; + esac + ]) fi + AC_DEFINE_UNQUOTED([GETTIMEOFDAY_TIMEZONE], [$gl_gettimeofday_timezone], + [Define this to 'void' or 'struct timezone' to match the system's + declaration of the second argument to gettimeofday.]) ]) -dnl From Jim Meyering. -dnl + dnl See if gettimeofday clobbers the static buffer that localtime uses dnl for its return value. The gettimeofday function from Mac OS X 10.0.4 dnl (i.e., Darwin 1.3.7) has this problem. @@ -88,70 +81,60 @@ dnl dnl If it does, then arrange to use gettimeofday and localtime only via dnl the wrapper functions that work around the problem. -AC_DEFUN([AC_FUNC_GETTIMEOFDAY_CLOBBER], +AC_DEFUN([gl_FUNC_GETTIMEOFDAY_CLOBBER], [ - AC_REQUIRE([AC_HEADER_TIME]) - AC_CACHE_CHECK([whether gettimeofday clobbers localtime buffer], - [jm_cv_func_gettimeofday_clobber], - [AC_TRY_RUN([ -#include -#include - -#if TIME_WITH_SYS_TIME -# include -# include -#else -# if HAVE_SYS_TIME_H -# include -# else -# include -# endif -#endif + AC_REQUIRE([gl_HEADER_SYS_TIME_H]) + AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles -#include - -int -main () -{ - time_t t = 0; - struct tm *lt; - struct tm saved_lt; - struct timeval tv; - lt = localtime (&t); - saved_lt = *lt; - gettimeofday (&tv, NULL); - if (memcmp (lt, &saved_lt, sizeof (struct tm)) != 0) - exit (1); + AC_CACHE_CHECK([whether gettimeofday clobbers localtime buffer], + [gl_cv_func_gettimeofday_clobber], + [AC_RUN_IFELSE( + [AC_LANG_PROGRAM( + [[#include + #include + #include + #include + ]], + [[ + time_t t = 0; + struct tm *lt; + struct tm saved_lt; + struct timeval tv; + lt = localtime (&t); + saved_lt = *lt; + gettimeofday (&tv, NULL); + return memcmp (lt, &saved_lt, sizeof (struct tm)) != 0; + ]])], + [gl_cv_func_gettimeofday_clobber=no], + [gl_cv_func_gettimeofday_clobber=yes], + [# When cross-compiling: + case "$host_os" in + # Guess all is fine on glibc systems. + *-gnu*) gl_cv_func_gettimeofday_clobber="guessing no" ;; + # If we don't know, assume the worst. + *) gl_cv_func_gettimeofday_clobber="guessing yes" ;; + esac + ])]) - exit (0); -} - ], - jm_cv_func_gettimeofday_clobber=no, - jm_cv_func_gettimeofday_clobber=yes, - dnl When crosscompiling, assume it is broken. - jm_cv_func_gettimeofday_clobber=yes) - ]) - if test $jm_cv_func_gettimeofday_clobber = yes; then - gl_GETTIMEOFDAY_REPLACE_LOCALTIME - fi + case "$gl_cv_func_gettimeofday_clobber" in + *yes) + REPLACE_GETTIMEOFDAY=1 + gl_GETTIMEOFDAY_REPLACE_LOCALTIME + AC_DEFINE([GETTIMEOFDAY_CLOBBERS_LOCALTIME], [1], + [Define if gettimeofday clobbers the localtime buffer.]) + ;; + esac ]) AC_DEFUN([gl_GETTIMEOFDAY_REPLACE_LOCALTIME], [ - AC_LIBOBJ(gettimeofday) - gl_PREREQ_GETTIMEOFDAY - AC_DEFINE([GETTIMEOFDAY_CLOBBERS_LOCALTIME], 1, - [Define if gettimeofday clobbers the localtime buffer.]) 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_DEFINE([tzset], [rpl_tzset], - [Define to rpl_tzset if the replacement function should be used.]) ]) # Prerequisites of lib/gettimeofday.c. AC_DEFUN([gl_PREREQ_GETTIMEOFDAY], [ - AC_REQUIRE([AC_HEADER_TIME]) AC_CHECK_HEADERS([sys/timeb.h]) AC_CHECK_FUNCS([_ftime]) ])