Mercurial > hg > octave-lyh > gnulib-hg
changeset 16600:fce13a4b73aa
round: Don't override undeclared system function on IRIX 6.5.
* m4/check-math-lib.m4 (gl_CHECK_MATH_LIB): Accept an optional third
argument.
* m4/round.m4 (gl_FUNC_ROUND): Search for round() in the libraries
also when it is not declared. Set HAVE_ROUND. For replacement code,
test HAVE_ROUND, not HAVE_DECL_ROUND.
* modules/round (configure.ac): For replacement code, test HAVE_ROUND,
not HAVE_DECL_ROUND.
(Depends-on): Update conditions.
* modules/round-ieee (Depends-on): Update conditions.
* doc/posix-functions/round.texi: Mention the IRIX problem.
author | Bruno Haible <bruno@clisp.org> |
---|---|
date | Thu, 08 Mar 2012 01:26:03 +0100 |
parents | 281cc716033c |
children | 3846767a473f |
files | ChangeLog doc/posix-functions/round.texi m4/check-math-lib.m4 m4/round.m4 modules/round modules/round-ieee |
diffstat | 6 files changed, 71 insertions(+), 37 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2012-03-07 Bruno Haible <bruno@clisp.org> + + round: Don't override undeclared system function on IRIX 6.5. + * m4/check-math-lib.m4 (gl_CHECK_MATH_LIB): Accept an optional third + argument. + * m4/round.m4 (gl_FUNC_ROUND): Search for round() in the libraries + also when it is not declared. Set HAVE_ROUND. For replacement code, + test HAVE_ROUND, not HAVE_DECL_ROUND. + * modules/round (configure.ac): For replacement code, test HAVE_ROUND, + not HAVE_DECL_ROUND. + (Depends-on): Update conditions. + * modules/round-ieee (Depends-on): Update conditions. + * doc/posix-functions/round.texi: Mention the IRIX problem. + 2012-03-07 Bruno Haible <bruno@clisp.org> copysignf: Don't override undeclared system function on IRIX 6.5.
--- a/doc/posix-functions/round.texi +++ b/doc/posix-functions/round.texi @@ -10,10 +10,10 @@ @itemize @item This function is missing on some platforms: -FreeBSD 5.2.1, OpenBSD 3.8, Minix 3.1.8, AIX 5.1, IRIX 6.5, OSF/1 4.0, Solaris 9, MSVC 9, Interix 3.5. +FreeBSD 5.2.1, OpenBSD 3.8, Minix 3.1.8, AIX 5.1, older IRIX 6.5, OSF/1 4.0, Solaris 9, MSVC 9, Interix 3.5. @item This function is not declared on some platforms: -glibc 2.8, OSF/1 5.1. +glibc 2.8, IRIX 6.5, OSF/1 5.1. @item This functions returns a wrong result for x = 1/2 - 2^-54 on some platforms: NetBSD 3.0, AIX 7.1.
--- a/m4/check-math-lib.m4 +++ b/m4/check-math-lib.m4 @@ -1,10 +1,10 @@ -# check-math-lib.m4 serial 3 +# check-math-lib.m4 serial 4 dnl Copyright (C) 2007, 2009-2012 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. dnl -dnl gl_CHECK_MATH_LIB (VARIABLE, EXPRESSION) +dnl gl_CHECK_MATH_LIB (VARIABLE, EXPRESSION [, EXTRA-CODE]) dnl dnl Sets the shell VARIABLE according to the libraries needed by EXPRESSION dnl to compile and link: to the empty string if no extra libraries are needed, @@ -22,6 +22,7 @@ # define __NO_MATH_INLINES 1 /* for glibc */ #endif #include <math.h> + $3 double x;]], [$2])], [$1=$libm
--- a/m4/round.m4 +++ b/m4/round.m4 @@ -1,4 +1,4 @@ -# round.m4 serial 14 +# round.m4 serial 15 dnl Copyright (C) 2007, 2009-2012 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -8,23 +8,39 @@ [ m4_divert_text([DEFAULTS], [gl_round_required=plain]) AC_REQUIRE([gl_MATH_H_DEFAULTS]) + dnl Persuade glibc <math.h> to declare round(). AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) - AC_CHECK_DECLS([round], , , [[#include <math.h>]]) - if test "$ac_cv_have_decl_round" = yes; then - gl_CHECK_MATH_LIB([ROUND_LIBM], [x = round (x);]) - if test "$ROUND_LIBM" != missing; then - dnl Test whether round() produces correct results. On NetBSD 3.0, for - dnl x = 1/2 - 2^-54, the system's round() returns a wrong result. - AC_REQUIRE([AC_PROG_CC]) - AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles - AC_CACHE_CHECK([whether round works], [gl_cv_func_round_works], - [ - save_LIBS="$LIBS" - LIBS="$LIBS $ROUND_LIBM" - AC_RUN_IFELSE([AC_LANG_SOURCE([[ + + gl_CHECK_MATH_LIB([ROUND_LIBM], [x = round (x);], + [extern + #ifdef __cplusplus + "C" + #endif + double round (double); + ]) + if test "$ROUND_LIBM" != missing; then + HAVE_ROUND=1 + dnl Also check whether it's declared. + dnl IRIX 6.5 has round() in libm but doesn't declare it in <math.h>. + AC_CHECK_DECLS([round], , [HAVE_DECL_ROUND=0], [[#include <math.h>]]) + + dnl Test whether round() produces correct results. On NetBSD 3.0, for + dnl x = 1/2 - 2^-54, the system's round() returns a wrong result. + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles + AC_CACHE_CHECK([whether round works], [gl_cv_func_round_works], + [ + save_LIBS="$LIBS" + LIBS="$LIBS $ROUND_LIBM" + AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include <float.h> #include <math.h> +extern +#ifdef __cplusplus +"C" +#endif +double round (double); #ifdef _MSC_VER # pragma fenv_access (off) #endif @@ -43,20 +59,17 @@ volatile double x = 0.5 - 0.5 / TWO_MANT_DIG; exit (x < 0.5 && round (x) != 0.0); }]])], [gl_cv_func_round_works=yes], [gl_cv_func_round_works=no], - [case "$host_os" in - netbsd* | aix*) gl_cv_func_round_works="guessing no";; - *) gl_cv_func_round_works="guessing yes";; - esac - ]) - LIBS="$save_LIBS" + [case "$host_os" in + netbsd* | aix*) gl_cv_func_round_works="guessing no";; + *) gl_cv_func_round_works="guessing yes";; + esac ]) - case "$gl_cv_func_round_works" in - *no) ROUND_LIBM=missing ;; - esac - fi - if test "$ROUND_LIBM" = missing; then - REPLACE_ROUND=1 - fi + LIBS="$save_LIBS" + ]) + case "$gl_cv_func_round_works" in + *no) REPLACE_ROUND=1 ;; + esac + m4_ifdef([gl_FUNC_ROUND_IEEE], [ if test $gl_round_required = ieee && test $REPLACE_ROUND = 0; then AC_CACHE_CHECK([whether round works according to ISO C 99 with IEC 60559], @@ -70,6 +83,11 @@ # define __NO_MATH_INLINES 1 /* for glibc */ #endif #include <math.h> +extern +#ifdef __cplusplus +"C" +#endif +double round (double); ]gl_DOUBLE_MINUS_ZERO_CODE[ ]gl_DOUBLE_SIGNBIT_CODE[ static double dummy (double f) { return 0; } @@ -94,9 +112,10 @@ fi ]) else + HAVE_ROUND=0 HAVE_DECL_ROUND=0 fi - if test $HAVE_DECL_ROUND = 0 || test $REPLACE_ROUND = 1; then + if test $HAVE_ROUND = 0 || test $REPLACE_ROUND = 1; then dnl Find libraries needed to link lib/round.c. gl_FUNC_FLOOR_LIBS gl_FUNC_CEIL_LIBS
--- a/modules/round +++ b/modules/round @@ -11,12 +11,12 @@ Depends-on: math extensions -float [test $HAVE_DECL_ROUND = 0 || test $REPLACE_ROUND = 1] -floor [test $HAVE_DECL_ROUND = 0 || test $REPLACE_ROUND = 1] +float [test $HAVE_ROUND = 0 || test $REPLACE_ROUND = 1] +floor [test $HAVE_ROUND = 0 || test $REPLACE_ROUND = 1] configure.ac: gl_FUNC_ROUND -if test $HAVE_DECL_ROUND = 0 || test $REPLACE_ROUND = 1; then +if test $HAVE_ROUND = 0 || test $REPLACE_ROUND = 1; then AC_LIBOBJ([round]) fi gl_MATH_MODULE_INDICATOR([round])
--- a/modules/round-ieee +++ b/modules/round-ieee @@ -8,8 +8,8 @@ Depends-on: round -floor-ieee [test $HAVE_DECL_ROUND = 0 || test $REPLACE_ROUND = 1] -ceil-ieee [test $HAVE_DECL_ROUND = 0 || test $REPLACE_ROUND = 1] +floor-ieee [test $HAVE_ROUND = 0 || test $REPLACE_ROUND = 1] +ceil-ieee [test $HAVE_ROUND = 0 || test $REPLACE_ROUND = 1] configure.ac: gl_FUNC_ROUND_IEEE