X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=m4%2Flogb.m4;h=11743a7d061543edb5870270cb789ff7b9562eb9;hb=79ca0976a6fd1773801ac0287a64cdf06aec7988;hp=c5b68032319d10e8c73f4433fe5c3fbdfba345ad;hpb=10d66aedfdd610f731c8c54152b9dfca3efbee12;p=gnulib.git diff --git a/m4/logb.m4 b/m4/logb.m4 index c5b680323..11743a7d0 100644 --- a/m4/logb.m4 +++ b/m4/logb.m4 @@ -1,5 +1,5 @@ -# logb.m4 serial 1 -dnl Copyright (C) 2010 Free Software Foundation, Inc. +# logb.m4 serial 6 +dnl Copyright (C) 2010-2014 Free Software Foundation, Inc. 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. @@ -7,38 +7,119 @@ dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_LOGB], [ AC_REQUIRE([gl_MATH_H_DEFAULTS]) + + dnl Persuade glibc to declare logb(). + AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) + dnl Test whether logb() is declared. - AC_CHECK_DECLS([logb], , , [#include ]) + AC_CHECK_DECLS([logb], , , [[#include ]]) if test "$ac_cv_have_decl_logb" != yes; then HAVE_DECL_LOGB=0 fi dnl Test whether logb() can be used without libm. LOGB_LIBM=? - AC_TRY_LINK([ - #ifndef __NO_MATH_INLINES - # define __NO_MATH_INLINES 1 /* for glibc */ - #endif - #include - extern double logb (double x); - double x;], - [x = logb(x);], + AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [[#ifndef __NO_MATH_INLINES + # define __NO_MATH_INLINES 1 /* for glibc */ + #endif + #include + extern + #ifdef __cplusplus + "C" + #endif + double logb (double x); + double x;]], + [[x = logb(x);]])], [LOGB_LIBM=]) if test "$LOGB_LIBM" = "?"; then save_LIBS="$LIBS" LIBS="$LIBS -lm" - AC_TRY_LINK([ - #ifndef __NO_MATH_INLINES - # define __NO_MATH_INLINES 1 /* for glibc */ - #endif - #include - extern double logb (double x); - double x;], - [x = logb(x);], + AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [[#ifndef __NO_MATH_INLINES + # define __NO_MATH_INLINES 1 /* for glibc */ + #endif + #include + extern + #ifdef __cplusplus + "C" + #endif + double logb (double x); + double x;]], + [[x = logb(x);]])], [LOGB_LIBM="-lm"]) LIBS="$save_LIBS" fi - if test "$LOGB_LIBM" = "?"; then + if test "$LOGB_LIBM" != "?"; then + HAVE_LOGB=1 + save_LIBS="$LIBS" + LIBS="$LIBS $LOGB_LIBM" + gl_FUNC_LOGB_WORKS + LIBS="$save_LIBS" + case "$gl_cv_func_logb_works" in + *yes) ;; + *) REPLACE_LOGB=1 ;; + esac + else + HAVE_LOGB=0 + fi + if test $HAVE_LOGB = 0 || test $REPLACE_LOGB = 1; then + dnl Find libraries needed to link lib/logb.c. + AC_REQUIRE([gl_FUNC_FREXP]) + AC_REQUIRE([gl_FUNC_ISNAND]) LOGB_LIBM= + dnl Append $FREXP_LIBM to LOGB_LIBM, avoiding gratuitous duplicates. + case " $LOGB_LIBM " in + *" $FREXP_LIBM "*) ;; + *) LOGB_LIBM="$LOGB_LIBM $FREXP_LIBM" ;; + esac + dnl Append $ISNAND_LIBM to LOGB_LIBM, avoiding gratuitous duplicates. + case " $LOGB_LIBM " in + *" $ISNAND_LIBM "*) ;; + *) LOGB_LIBM="$LOGB_LIBM $ISNAND_LIBM" ;; + esac fi AC_SUBST([LOGB_LIBM]) ]) + +dnl Test whether logb() works. +dnl On glibc 2.11/ppc, glibc 2.7/sparc, glibc 2.7/hppa, Solaris 10/SPARC, +dnl Cygwin 1.5.x, the return value for subnormal (denormalized) arguments is +dnl too large. +AC_DEFUN([gl_FUNC_LOGB_WORKS], +[ + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles + AC_CACHE_CHECK([whether logb works], [gl_cv_func_logb_works], + [ + AC_RUN_IFELSE( + [AC_LANG_SOURCE([[ +#include +#include +extern +#ifdef __cplusplus +"C" +#endif +double logb (double); +volatile double x; +int main () +{ + int i; + for (i = 1, x = 1.0; i >= DBL_MIN_EXP; i--, x *= 0.5) + ; + /* Here i = DBL_MIN_EXP - 1. Either x = 2^(i-1) is subnormal or x = 0.0. */ + if (x > 0.0 && !(logb (x) == (double)(i - 1))) + return 1; + return 0; +} +]])], + [gl_cv_func_logb_works=yes], + [gl_cv_func_logb_works=no], + [case "$host_os" in + *gnu* | solaris* | cygwin*) gl_cv_func_logb_works="guessing no";; + *) gl_cv_func_logb_works="guessing yes";; + esac + ]) + ]) +])