From: shyouhei@... Date: 2018-06-05T01:53:56+00:00 Subject: [ruby-core:87402] [Ruby trunk Bug#14816] Extension build failure on a system with musl libc Issue #14816 has been updated by shyouhei (Shyouhei Urabe). Proposed workaround, not tested though. ```patch From 01839b509c1bb914337124ac3d1f644b05ef90d8 Mon Sep 17 00:00:00 2001 From: "Urabe, Shyouhei" Date: Tue, 5 Jun 2018 10:26:06 +0900 Subject: [PATCH] C++11 is so bad it introduces a nightmare. TL;DR see https://developers.redhat.com/blog/2016/02/29/why-cstdlib-is-more-complicated-than-you-might-think/ - `isnan` is something relatively new. We need to provide one for those systems without it. However: - X/Open defines `int isnan(double)`. Note the `int`. - C99 defines `isnan(x)` to be a macro. - C++11 nukes them all, undefines all the "masking macro"s, and define its own `bool isnan(double)`. Note the `bool`. - In C++, `int isnan(double)` and `bool isnan(double)` are incompatible. - So the mess. Signed-off-by: Urabe, Shyouhei --- include/ruby/missing.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/include/ruby/missing.h b/include/ruby/missing.h index dc3fd502b5..8df917498e 100644 --- a/include/ruby/missing.h +++ b/include/ruby/missing.h @@ -168,6 +168,8 @@ RUBY_EXTERN const union bytesequence4_or_float rb_nan; # include # endif # define isinf(x) (!finite(x) && !isnan(x)) +# elsif __cplusplus >= 201103L +# include // it must include constexpr bool isinf(double); # else RUBY_EXTERN int isinf(double); # endif @@ -176,7 +178,11 @@ RUBY_EXTERN int isinf(double); #ifndef isnan # ifndef HAVE_ISNAN +# if __cplusplus >= 201103L +# include // it must include constexpr bool isnan(double); +# else RUBY_EXTERN int isnan(double); +# endif # endif #endif -- 2.17.1 ``` ---------------------------------------- Bug #14816: Extension build failure on a system with musl libc https://bugs.ruby-lang.org/issues/14816#change-72386 * Author: akamch (Anatoly Kamchatnov) * Status: Open * Priority: Normal * Assignee: * Target version: * ruby -v: ruby 2.6.0preview2 (2018-05-31 trunk 63539) [x86_64-linux] * Backport: 2.3: UNKNOWN, 2.4: UNKNOWN, 2.5: UNKNOWN ---------------------------------------- Some extensions fail to build on a Linux with musl (Void Linux). Build of unf_ext is an example. isinf() and isnan() are defined as macros in musl: https://git.musl-libc.org/cgit/musl/tree/include/math.h https://github.com/gliderlabs/docker-alpine/issues/261 "Cannot build native extensions for unf_ext gem" seems to be a related issue. ~~~ $ gem install unf_ext Building native extensions. This could take a while... ERROR: Error installing unf_ext: ERROR: Failed to build gem native extension. current directory: /home/rev/.gem/ruby/2.6.0/gems/unf_ext-0.0.7.5/ext/unf_ext /home/rev/.rbenv/versions/2.6.0-preview2/bin/ruby -r ./siteconf20180603-29655-wgzu56.rb extconf.rb checking for -lstdc++... yes creating Makefile current directory: /home/rev/.gem/ruby/2.6.0/gems/unf_ext-0.0.7.5/ext/unf_ext make "DESTDIR=" clean current directory: /home/rev/.gem/ruby/2.6.0/gems/unf_ext-0.0.7.5/ext/unf_ext make "DESTDIR=" compiling unf.cc cc1plus: warning: command line option '-Wimplicit-int' is valid for C/ObjC but not for C++ cc1plus: warning: command line option '-Wdeclaration-after-statement' is valid for C/ObjC but not for C++ cc1plus: warning: command line option '-Wimplicit-function-declaration' is valid for C/ObjC but not for C++ In file included from /home/rev/.rbenv/versions/2.6.0-preview2/include/ruby-2.6.0/ruby/defines.h:153:0, from /home/rev/.rbenv/versions/2.6.0-preview2/include/ruby-2.6.0/ruby/ruby.h:29, from /home/rev/.rbenv/versions/2.6.0-preview2/include/ruby-2.6.0/ruby.h:33, from unf.cc:3: /home/rev/.rbenv/versions/2.6.0-preview2/include/ruby-2.6.0/ruby/missing.h:172:29: error: 'int isinf(double)' conflicts with a previous declaration RUBY_EXTERN int isinf(double); ^ In file included from /usr/include/c++/7.3/math.h:36:0, from /home/rev/.rbenv/versions/2.6.0-preview2/include/ruby-2.6.0/ruby/missing.h:23, from /home/rev/.rbenv/versions/2.6.0-preview2/include/ruby-2.6.0/ruby/defines.h:153, from /home/rev/.rbenv/versions/2.6.0-preview2/include/ruby-2.6.0/ruby/ruby.h:29, from /home/rev/.rbenv/versions/2.6.0-preview2/include/ruby-2.6.0/ruby.h:33, from unf.cc:3: /usr/include/c++/7.3/cmath:599:3: note: previous declaration 'constexpr bool std::isinf(double)' isinf(double __x) ^~~~~ In file included from /home/rev/.rbenv/versions/2.6.0-preview2/include/ruby-2.6.0/ruby/defines.h:153:0, from /home/rev/.rbenv/versions/2.6.0-preview2/include/ruby-2.6.0/ruby/ruby.h:29, from /home/rev/.rbenv/versions/2.6.0-preview2/include/ruby-2.6.0/ruby.h:33, from unf.cc:3: /home/rev/.rbenv/versions/2.6.0-preview2/include/ruby-2.6.0/ruby/missing.h:179:29: error: 'int isnan(double)' conflicts with a previous declaration RUBY_EXTERN int isnan(double); ^ In file included from /usr/include/c++/7.3/math.h:36:0, from /home/rev/.rbenv/versions/2.6.0-preview2/include/ruby-2.6.0/ruby/missing.h:23, from /home/rev/.rbenv/versions/2.6.0-preview2/include/ruby-2.6.0/ruby/defines.h:153, from /home/rev/.rbenv/versions/2.6.0-preview2/include/ruby-2.6.0/ruby/ruby.h:29, from /home/rev/.rbenv/versions/2.6.0-preview2/include/ruby-2.6.0/ruby.h:33, from unf.cc:3: /usr/include/c++/7.3/cmath:626:3: note: previous declaration 'constexpr bool std::isnan(double)' isnan(double __x) ^~~~~ cc1plus: warning: unrecognized command line option '-Wno-cast-function-type' cc1plus: warning: unrecognized command line option '-Wno-self-assign' cc1plus: warning: unrecognized command line option '-Wno-constant-logical-operand' cc1plus: warning: unrecognized command line option '-Wno-parentheses-equality' make: *** [Makefile:211: unf.o] Error 1 make failed, exit code 2 ~~~ -- https://bugs.ruby-lang.org/ Unsubscribe: