expm1.m4 4.44 KB
Newer Older
1
# expm1.m4 serial 4
Paul Eggert's avatar
Paul Eggert committed
2
dnl Copyright (C) 2010-2017 Free Software Foundation, Inc.
Bruno Haible's avatar
Bruno Haible committed
3 4 5 6 7 8
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved.

AC_DEFUN([gl_FUNC_EXPM1],
[
Bruno Haible's avatar
Bruno Haible committed
9
  m4_divert_text([DEFAULTS], [gl_expm1_required=plain])
Bruno Haible's avatar
Bruno Haible committed
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
  AC_REQUIRE([gl_MATH_H_DEFAULTS])

  dnl Persuade glibc <math.h> to declare expm1().
  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])

  EXPM1_LIBM=
  AC_CACHE_CHECK([whether expm1() can be used without linking with libm],
    [gl_cv_func_expm1_no_libm],
    [
      AC_LINK_IFELSE(
        [AC_LANG_PROGRAM(
           [[#ifndef __NO_MATH_INLINES
             # define __NO_MATH_INLINES 1 /* for glibc */
             #endif
             #include <math.h>
             double (*funcptr) (double) = expm1;
             double x;]],
           [[return funcptr (x) > 0.5
                    || expm1 (x) > 0.5;]])],
        [gl_cv_func_expm1_no_libm=yes],
        [gl_cv_func_expm1_no_libm=no])
    ])
  if test $gl_cv_func_expm1_no_libm = no; then
    AC_CACHE_CHECK([whether expm1() can be used with libm],
      [gl_cv_func_expm1_in_libm],
      [
        save_LIBS="$LIBS"
        LIBS="$LIBS -lm"
        AC_LINK_IFELSE(
          [AC_LANG_PROGRAM(
             [[#ifndef __NO_MATH_INLINES
               # define __NO_MATH_INLINES 1 /* for glibc */
               #endif
               #include <math.h>
               double (*funcptr) (double) = expm1;
               double x;]],
             [[return funcptr (x) > 0.5
                      || expm1 (x) > 0.5;]])],
          [gl_cv_func_expm1_in_libm=yes],
          [gl_cv_func_expm1_in_libm=no])
        LIBS="$save_LIBS"
      ])
    if test $gl_cv_func_expm1_in_libm = yes; then
      EXPM1_LIBM=-lm
    fi
  fi
Bruno Haible's avatar
Bruno Haible committed
56 57 58 59 60
  if test $gl_cv_func_expm1_no_libm = yes \
     || test $gl_cv_func_expm1_in_libm = yes; then
    :
    m4_ifdef([gl_FUNC_EXPM1_IEEE], [
      if test $gl_expm1_required = ieee && test $REPLACE_EXPM1 = 0; then
61
        AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
Bruno Haible's avatar
Bruno Haible committed
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
        AC_CACHE_CHECK([whether expm1 works according to ISO C 99 with IEC 60559],
          [gl_cv_func_expm1_ieee],
          [
            save_LIBS="$LIBS"
            LIBS="$LIBS $EXPM1_LIBM"
            AC_RUN_IFELSE(
              [AC_LANG_SOURCE([[
#ifndef __NO_MATH_INLINES
# define __NO_MATH_INLINES 1 /* for glibc */
#endif
#include <math.h>
]gl_DOUBLE_MINUS_ZERO_CODE[
]gl_DOUBLE_SIGNBIT_CODE[
static double dummy (double x) { return 0; }
int main (int argc, char *argv[])
{
  double (*my_expm1) (double) = argc ? expm1 : dummy;
  double y = my_expm1 (minus_zerod);
  if (!(y == 0.0) || (signbitd (minus_zerod) && !signbitd (y)))
    return 1;
  return 0;
}
              ]])],
              [gl_cv_func_expm1_ieee=yes],
              [gl_cv_func_expm1_ieee=no],
87 88 89
              [case "$host_os" in
                         # Guess yes on glibc systems.
                 *-gnu*) gl_cv_func_expm1_ieee="guessing yes" ;;
90 91
                         # Guess yes on native Windows.
                 mingw*) gl_cv_func_expm1_ieee="guessing yes" ;;
92 93 94 95
                         # If we don't know, assume the worst.
                 *)      gl_cv_func_expm1_ieee="guessing no" ;;
               esac
              ])
Bruno Haible's avatar
Bruno Haible committed
96 97 98 99 100 101 102 103 104
            LIBS="$save_LIBS"
          ])
        case "$gl_cv_func_expm1_ieee" in
          *yes) ;;
          *) REPLACE_EXPM1=1 ;;
        esac
      fi
    ])
  else
Bruno Haible's avatar
Bruno Haible committed
105
    HAVE_EXPM1=0
Bruno Haible's avatar
Bruno Haible committed
106 107
  fi
  if test $HAVE_EXPM1 = 0 || test $REPLACE_EXPM1 = 1; then
Bruno Haible's avatar
Bruno Haible committed
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
    dnl Find libraries needed to link lib/expm1.c.
    AC_REQUIRE([gl_FUNC_ISNAND])
    AC_REQUIRE([gl_FUNC_EXP])
    AC_REQUIRE([gl_FUNC_ROUND])
    AC_REQUIRE([gl_FUNC_LDEXP])
    EXPM1_LIBM=
    dnl Append $ISNAND_LIBM to EXPM1_LIBM, avoiding gratuitous duplicates.
    case " $EXPM1_LIBM " in
      *" $ISNAND_LIBM "*) ;;
      *) EXPM1_LIBM="$EXPM1_LIBM $ISNAND_LIBM" ;;
    esac
    dnl Append $EXP_LIBM to EXPM1_LIBM, avoiding gratuitous duplicates.
    case " $EXPM1_LIBM " in
      *" $EXP_LIBM "*) ;;
      *) EXPM1_LIBM="$EXPM1_LIBM $EXP_LIBM" ;;
    esac
    dnl Append $ROUND_LIBM to EXPM1_LIBM, avoiding gratuitous duplicates.
    case " $EXPM1_LIBM " in
      *" $ROUND_LIBM "*) ;;
      *) EXPM1_LIBM="$EXPM1_LIBM $ROUND_LIBM" ;;
    esac
    dnl Append $LDEXP_LIBM to EXPM1_LIBM, avoiding gratuitous duplicates.
    case " $EXPM1_LIBM " in
      *" $LDEXP_LIBM "*) ;;
      *) EXPM1_LIBM="$EXPM1_LIBM $LDEXP_LIBM" ;;
    esac
  fi
  AC_SUBST([EXPM1_LIBM])
])