view m4/gettimeofday.m4 @ 8043:d12a7f6db481

* modules/sys_time (Makefile.am): Build sys/time.h only when it's the value of $(SYS_TIME_H). [MOSTLYCLEANFILES]: Now that sys/time.h is created only when needed, remove it conditionally, too. * m4/sys_time_h.m4 (gl_HEADER_SYS_TIME_H_BODY): Set SYS_TIME_H. * m4/gettimeofday.m4 (gl_FUNC_GETTIMEOFDAY): (gl_FUNC_GETTIMEOFDAY_CLOBBER): Set SYS_TIME_H when setting GETTIMEOFDAY_REPLACEMENT to 1. 2007-01-28 Bruno Haible <bruno@clisp.org>
author Jim Meyering <jim@meyering.net>
date Sun, 28 Jan 2007 18:55:01 +0000
parents 5fa14d8c0b45
children 039bedae1345
line wrap: on
line source

#serial 11

# Copyright (C) 2001, 2002, 2003, 2005, 2007 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([gl_HEADER_SYS_TIME_H])
  AC_CHECK_FUNCS_ONCE([gettimeofday])

  AC_CACHE_CHECK([for gettimeofday with POSIX signature],
    [gl_cv_func_gettimeofday_posix_signature],
    [AC_COMPILE_IFELSE(
       [AC_LANG_PROGRAM(
	  [[#include <sys/time.h>
	    struct timeval c;
	  ]],
	  [[
	    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],
	[gl_cv_func_gettimeofday_posix_signature=no])])

  gl_FUNC_GETTIMEOFDAY_CLOBBER

  if test $gl_cv_func_gettimeofday_posix_signature != yes; then
    GETTIMEOFDAY_REPLACEMENT=1
    SYS_TIME_H=sys/time.h
    if test $gl_cv_func_gettimeofday_clobber != yes; then
      AC_LIBOBJ(gettimeofday)
      gl_PREREQ_GETTIMEOFDAY
    fi
  fi
])


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.
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([gl_FUNC_GETTIMEOFDAY_CLOBBER],
[
 AC_REQUIRE([gl_HEADER_SYS_TIME_H])

 AC_CACHE_CHECK([whether gettimeofday clobbers localtime buffer],
  [gl_cv_func_gettimeofday_clobber],
  [AC_RUN_IFELSE(
     [AC_LANG_PROGRAM(
	[[#include <string.h>
	  #include <sys/time.h>
	  #include <time.h>
	  #include <stdlib.h>
	]],
	[[
	  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],
     dnl When crosscompiling, assume it is broken.
     [gl_cv_func_gettimeofday_clobber=yes])])

 if test $gl_cv_func_gettimeofday_clobber = yes; then
   GETTIMEOFDAY_REPLACEMENT=1
   SYS_TIME_H=sys/time.h
   gl_GETTIMEOFDAY_REPLACE_LOCALTIME
   AC_DEFINE([GETTIMEOFDAY_CLOBBERS_LOCALTIME], 1,
     [Define if gettimeofday clobbers the localtime buffer.])
 fi
])

AC_DEFUN([gl_GETTIMEOFDAY_REPLACE_LOCALTIME], [
  AC_LIBOBJ(gettimeofday)
  gl_PREREQ_GETTIMEOFDAY
  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.])
])

# Prerequisites of lib/gettimeofday.c.
AC_DEFUN([gl_PREREQ_GETTIMEOFDAY], [
  AC_CHECK_HEADERS([sys/timeb.h])
  AC_CHECK_FUNCS([_ftime])
])