Home | History | Annotate | Download | only in m4
      1 # float_h.m4 serial 9
      2 dnl Copyright (C) 2007, 2009-2012 Free Software Foundation, Inc.
      3 dnl This file is free software; the Free Software Foundation
      4 dnl gives unlimited permission to copy and/or distribute it,
      5 dnl with or without modifications, as long as this notice is preserved.
      6 
      7 AC_DEFUN([gl_FLOAT_H],
      8 [
      9   AC_REQUIRE([AC_PROG_CC])
     10   AC_REQUIRE([AC_CANONICAL_HOST])
     11   FLOAT_H=
     12   REPLACE_FLOAT_LDBL=0
     13   case "$host_os" in
     14     aix* | beos* | openbsd* | mirbsd* | irix*)
     15       FLOAT_H=float.h
     16       ;;
     17     freebsd*)
     18       case "$host_cpu" in
     19 changequote(,)dnl
     20         i[34567]86 )
     21 changequote([,])dnl
     22           FLOAT_H=float.h
     23           ;;
     24         x86_64 )
     25           # On x86_64 systems, the C compiler may still be generating
     26           # 32-bit code.
     27           AC_EGREP_CPP([yes],
     28             [#if defined __LP64__ || defined __x86_64__ || defined __amd64__
     29              yes
     30              #endif],
     31             [],
     32             [FLOAT_H=float.h])
     33           ;;
     34       esac
     35       ;;
     36     linux*)
     37       case "$host_cpu" in
     38         powerpc*)
     39           FLOAT_H=float.h
     40           ;;
     41       esac
     42       ;;
     43   esac
     44   case "$host_os" in
     45     aix* | freebsd* | linux*)
     46       if test -n "$FLOAT_H"; then
     47         REPLACE_FLOAT_LDBL=1
     48       fi
     49       ;;
     50   esac
     51 
     52   dnl Test against glibc-2.7 Linux/SPARC64 bug.
     53   REPLACE_ITOLD=0
     54   AC_CACHE_CHECK([whether conversion from 'int' to 'long double' works],
     55     [gl_cv_func_itold_works],
     56     [
     57       AC_RUN_IFELSE(
     58         [AC_LANG_SOURCE([[
     59 int i = -1;
     60 volatile long double ld;
     61 int main ()
     62 {
     63   ld += i * 1.0L;
     64   if (ld > 0)
     65     return 1;
     66   return 0;
     67 }]])],
     68         [gl_cv_func_itold_works=yes],
     69         [gl_cv_func_itold_works=no],
     70         [case "$host" in
     71            sparc*-*-linux*)
     72              AC_EGREP_CPP([yes],
     73                [#if defined __LP64__ || defined __arch64__
     74                 yes
     75                 #endif],
     76                [gl_cv_func_itold_works="guessing no"],
     77                [gl_cv_func_itold_works="guessing yes"])
     78              ;;
     79            *) gl_cv_func_itold_works="guessing yes" ;;
     80          esac
     81         ])
     82     ])
     83   case "$gl_cv_func_itold_works" in
     84     *no)
     85       REPLACE_ITOLD=1
     86       dnl We add the workaround to <float.h> but also to <math.h>,
     87       dnl to increase the chances that the fix function gets pulled in.
     88       FLOAT_H=float.h
     89       ;;
     90   esac
     91 
     92   if test -n "$FLOAT_H"; then
     93     gl_NEXT_HEADERS([float.h])
     94   fi
     95   AC_SUBST([FLOAT_H])
     96   AM_CONDITIONAL([GL_GENERATE_FLOAT_H], [test -n "$FLOAT_H"])
     97   AC_SUBST([REPLACE_ITOLD])
     98 ])
     99