changeset 16827:fa47ffe05247

nanosleep: Avoid guessing wrong when cross-compiling to Linux. * m4/nanosleep.m4 (gl_FUNC_NANOSLEEP): Require AC_CANONICAL_HOST. When cross-compiling, set gl_cv_func_nanosleep to either 'guessing no' or 'guessing no (mishandles large arguments)'.
author Bruno Haible <bruno@clisp.org>
date Sat, 05 May 2012 12:53:33 +0200
parents 31a7d8d65261
children 47595604fd62
files ChangeLog m4/nanosleep.m4
diffstat 2 files changed, 43 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2012-05-05  Bruno Haible  <bruno@clisp.org>
+
+	nanosleep: Avoid guessing wrong when cross-compiling to Linux.
+	* m4/nanosleep.m4 (gl_FUNC_NANOSLEEP): Require AC_CANONICAL_HOST. When
+	cross-compiling, set gl_cv_func_nanosleep to either 'guessing no'
+	or 'guessing no (mishandles large arguments)'.
+
 2012-05-05  Bruno Haible  <bruno@clisp.org>
 
 	link-follow: Avoid guessing wrong when cross-compiling to glibc/Linux.
--- a/m4/nanosleep.m4
+++ b/m4/nanosleep.m4
@@ -1,4 +1,4 @@
-# serial 34
+# serial 35
 
 dnl From Jim Meyering.
 dnl Check for the nanosleep function.
@@ -13,10 +13,12 @@
 
 AC_DEFUN([gl_FUNC_NANOSLEEP],
 [
+ AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
  dnl Persuade glibc and Solaris <time.h> to declare nanosleep.
  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
 
- AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS])
  AC_CHECK_HEADERS_ONCE([sys/time.h])
  AC_REQUIRE([gl_FUNC_SELECT])
 
@@ -73,6 +75,7 @@
             static struct timespec ts_sleep;
             static struct timespec ts_remaining;
             static struct sigaction act;
+            /* Test for major problems first.  */
             if (! nanosleep)
               return 2;
             act.sa_handler = check_for_SIGALRM;
@@ -83,6 +86,7 @@
             alarm (1);
             if (nanosleep (&ts_sleep, NULL) != 0)
               return 3;
+            /* Test for a minor problem: the handling of large arguments.  */
             ts_sleep.tv_sec = TYPE_MAXIMUM (time_t);
             ts_sleep.tv_nsec = 999999999;
             alarm (1);
@@ -99,24 +103,37 @@
         4|5|6) gl_cv_func_nanosleep='no (mishandles large arguments)';; dnl (
         *)   gl_cv_func_nanosleep=no;;
         esac],
-       [gl_cv_func_nanosleep=cross-compiling])
+       [case "$host_os" in dnl ((
+          linux*) # Guess it halfway works on when the kernel is Linux.
+            gl_cv_func_nanosleep='guessing no (mishandles large arguments)' ;;
+          *)      # If we don't know, assume the worst.
+            gl_cv_func_nanosleep='guessing no' ;;
+        esac
+       ])
     ])
-   if test "$gl_cv_func_nanosleep" = yes; then
-     REPLACE_NANOSLEEP=0
-   else
-     REPLACE_NANOSLEEP=1
-     if test "$gl_cv_func_nanosleep" = 'no (mishandles large arguments)'; then
-       AC_DEFINE([HAVE_BUG_BIG_NANOSLEEP], [1],
-         [Define to 1 if nanosleep mishandles large arguments.])
-     else
-       for ac_lib in $LIBSOCKET; do
-         case " $LIB_NANOSLEEP " in
-         *" $ac_lib "*) ;;
-         *) LIB_NANOSLEEP="$LIB_NANOSLEEP $ac_lib";;
-         esac
-       done
-     fi
-   fi
+   case "$gl_cv_func_nanosleep" in
+     *yes)
+       REPLACE_NANOSLEEP=0
+       ;;
+     *)
+       REPLACE_NANOSLEEP=1
+       case "$gl_cv_func_nanosleep" in
+         *"mishandles large arguments"*)
+           AC_DEFINE([HAVE_BUG_BIG_NANOSLEEP], [1],
+             [Define to 1 if nanosleep mishandles large arguments.])
+           ;;
+         *)
+           # The replacement uses select(). Add $LIBSOCKET to $LIB_NANOSLEEP.
+           for ac_lib in $LIBSOCKET; do
+             case " $LIB_NANOSLEEP " in
+               *" $ac_lib "*) ;;
+               *) LIB_NANOSLEEP="$LIB_NANOSLEEP $ac_lib";;
+             esac
+           done
+           ;;
+       esac
+       ;;
+   esac
  else
    HAVE_NANOSLEEP=0
  fi