X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=m4%2Flogf.m4;h=3992a7665aad106ed9ea3b6fa6d47971e3d27d99;hb=cd56634a4a8179fd5a4419fbb3e27211b042ab1c;hp=d10b5a67ffa170e7a5525ec2b085e2f3af56df74;hpb=1602f0afed21be664fcf5c42d59db07cc22c56d6;p=gnulib.git diff --git a/m4/logf.m4 b/m4/logf.m4 index d10b5a67f..3992a7665 100644 --- a/m4/logf.m4 +++ b/m4/logf.m4 @@ -1,14 +1,18 @@ -# logf.m4 serial 1 -dnl Copyright (C) 2011-2012 Free Software Foundation, Inc. +# logf.m4 serial 6 +dnl Copyright (C) 2011-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. AC_DEFUN([gl_FUNC_LOGF], [ + m4_divert_text([DEFAULTS], [gl_logf_required=plain]) AC_REQUIRE([gl_MATH_H_DEFAULTS]) AC_REQUIRE([gl_FUNC_LOG]) + dnl Persuade glibc to declare logf(). + AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) + dnl Test whether logf() exists. Assume that logf(), if it exists, is dnl defined in the same library as log(). save_LIBS="$LIBS" @@ -17,9 +21,107 @@ AC_DEFUN([gl_FUNC_LOGF], LIBS="$save_LIBS" if test $ac_cv_func_logf = yes; then LOGF_LIBM="$LOG_LIBM" + + save_LIBS="$LIBS" + LIBS="$LIBS $LOGF_LIBM" + gl_FUNC_LOGF_WORKS + LIBS="$save_LIBS" + case "$gl_cv_func_logf_works" in + *yes) ;; + *) REPLACE_LOGF=1 ;; + esac + + m4_ifdef([gl_FUNC_LOGF_IEEE], [ + if test $gl_logf_required = ieee && test $REPLACE_LOGF = 0; then + AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles + AC_CACHE_CHECK([whether logf works according to ISO C 99 with IEC 60559], + [gl_cv_func_logf_ieee], + [ + save_LIBS="$LIBS" + LIBS="$LIBS $LOGF_LIBM" + AC_RUN_IFELSE( + [AC_LANG_SOURCE([[ +#ifndef __NO_MATH_INLINES +# define __NO_MATH_INLINES 1 /* for glibc */ +#endif +#include +/* Compare two numbers with ==. + This is a separate function because IRIX 6.5 "cc -O" miscompiles an + 'x == x' test. */ +static int +numeric_equal (float x, float y) +{ + return x == y; +} +static float dummy (float x) { return 0; } +int main (int argc, char *argv[]) +{ + float (*my_logf) (float) = argc ? logf : dummy; + /* Test logf(negative). + This test fails on NetBSD 5.1. */ + float y = my_logf (-1.0f); + if (numeric_equal (y, y)) + return 1; + return 0; +} + ]])], + [gl_cv_func_logf_ieee=yes], + [gl_cv_func_logf_ieee=no], + [case "$host_os" in + # Guess yes on glibc systems. + *-gnu*) gl_cv_func_logf_ieee="guessing yes" ;; + # If we don't know, assume the worst. + *) gl_cv_func_logf_ieee="guessing no" ;; + esac + ]) + LIBS="$save_LIBS" + ]) + case "$gl_cv_func_logf_ieee" in + *yes) ;; + *) REPLACE_LOGF=1 ;; + esac + fi + ]) else HAVE_LOGF=0 - LOGF_LIBM="$LOG_LIBM" + fi + if test $HAVE_LOGF = 0 || test $REPLACE_LOGF = 1; then + dnl Find libraries needed to link lib/logf.c. + if test $HAVE_LOGF = 0; then + LOGF_LIBM="$LOG_LIBM" + fi fi AC_SUBST([LOGF_LIBM]) ]) + +dnl Test whether logf() works. +dnl On OSF/1 5.1, logf(-0.0f) is NaN. +AC_DEFUN([gl_FUNC_LOGF_WORKS], +[ + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles + AC_CACHE_CHECK([whether logf works], [gl_cv_func_logf_works], + [ + AC_RUN_IFELSE( + [AC_LANG_SOURCE([[ +#include +volatile float x; +float y; +int main () +{ + x = -0.0f; + y = logf (x); + if (!(y + y == y)) + return 1; + return 0; +} +]])], + [gl_cv_func_logf_works=yes], + [gl_cv_func_logf_works=no], + [case "$host_os" in + osf*) gl_cv_func_logf_works="guessing no";; + *) gl_cv_func_logf_works="guessing yes";; + esac + ]) + ]) +])