[Buildroot] [PATCH] ruby: bump version to 2.4.0

Peter Korsgaard peter at korsgaard.com
Mon Jan 30 09:18:39 UTC 2017


>>>>> "Waldemar" == Waldemar Brodkorb <wbx at openadk.org> writes:

Hi,

 >> apparantly configure has problems detecting math functions of uClibc:

 > Because configure checks for functions, but isfinite, isinf and isnan
 > are implemented as macros. For Dragonfly they explicitely set
 > isinf/isnan as available:
 > https://github.com/ruby/ruby/blob/trunk/configure.in#L1278

 > Shouldn't this be reported upstream?
 > I think this is an autotool detection bug.

 >> although uClibc supports these functions.

 > finite seems obsoleted and isfinite should be used. 

 > It appears musl implements finite as function for backward compatibility.
 > Therefore the check does not fail for musl toolchains.
 > https://git.musl-libc.org/cgit/musl/tree/src/math/finite.c

 > For glibc the check fails and the replacement functions for
 > finite, isinf and isnan are used.

 > For uclibc-ng the check fails, but the replacement functions cannot
 > be used, because finite is already defined as macro for backward
 > compatibility. (added a while ago for inetd..)

Indeed, finite is a function on musl. On my glibc version they are also
(weakly) defined (and configure correctly finds them):

nm -D /lib/x86_64-linux-gnu/libc.so.6|grep -wE 'finite|isinf|isnan'
0000000000032310 W finite
00000000000322a0 W isinf
00000000000322e0 W isnan

I'm not sure what the spec (if any exists) for these legacy BSD
functions say about if the unprefixed symbols really need to be
available, but it is certainly a difference between uClibc-ng and
glibc/musl.

 >> Hacking ruby.mk like this
 >> 
 >> RUBY_CONF_ENV += \
 >> ac_cv_func_finite=yes \
 >> ac_cv_func_isinf=yes \
 >> ac_cv_func_isnan=yes
 >> endif

 > I think this is the best thing todo inside buildroot.

Yes, that might be the way to go. Notice that musl implements isinf /
isnan as macros, so the detection fails. The reason why it doesn't cause
linker errors is that include/ruby/missing.h checks if isnan is a macro
before providing a local declaration:

#ifndef isnan
# ifndef HAVE_ISNAN
RUBY_EXTERN int isnan(double);
# endif
#endif

vs:

#ifndef HAVE_FINITE
RUBY_EXTERN int finite(double);
#endif

So another solution is to add an #ifndef finite around it. That fix
could probably be upstreamed as they already do it for a number of other
functions.

-- 
Bye, Peter Korsgaard


More information about the buildroot mailing list