Project

General

Profile

Bug #16384

Updated by qnighy (Masaki Hara) over 4 years ago

Due to `each_builtin` existing only in miniruby, Ruby 2.7 cannot be built when configured for cross-compilation. 

 ## Environment 

 ``` 
 $ ruby -v 
 ruby 2.7.0preview3 (2019-11-23 master b563439274) [x86_64-linux] 
 $ lsb_release -a 
 No LSB modules are available. 
 Distributor ID: 	 Ubuntu 
 Description: 	 Ubuntu 18.04.3 LTS 
 Release: 	 18.04 
 Codename: 	 bionic 
 $ uname -a 
 Linux qnighy-michelle 4.15.0-66-generic #75-Ubuntu SMP Tue Oct 1 05:24:09 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux 
 ``` 

 ## Reproduction 

 Prepare Ruby 2.7.0-preview3 

 ``` 
 $ rbenv install 2.7.0-preview3 
 $ rbenv shell 2.7.0-preview3 
 ``` 

 Download [a patched version of `rake-compiler`](https://github.com/rake-compiler/rake-compiler/pull/161): 

 ``` 
 $ git clone https://github.com/rake-compiler/rake-compiler.git https://github.com/qnighy/rake-compiler.git -b makefile-in-moved 
 $ cd rake-compiler 
 $ git checkout 6822686f0c45e752974de02a980365515e843267 
 ``` 

 Try generating rake-compiler toolchain: 

 ``` 
 $ rake -f bin/rake-compiler cross-ruby VERSION=2.7.0-preview3 HOST=x86_64-linux 
 ``` 

 I got the following output: 

 ``` 
 (...snip...) 

 compiling /home/qnighy/.rake-compiler/sources/ruby-2.7.0-preview3/enc/trans/newline.c 
 compiling /home/qnighy/.rake-compiler/sources/ruby-2.7.0-preview3/missing/memcmp.c 
 compiling /home/qnighy/.rake-compiler/sources/ruby-2.7.0-preview3/missing/setproctitle.c 
 compiling /home/qnighy/.rake-compiler/sources/ruby-2.7.0-preview3/missing/strlcat.c 
 compiling /home/qnighy/.rake-compiler/sources/ruby-2.7.0-preview3/missing/strlcpy.c 
 compiling /home/qnighy/.rake-compiler/sources/ruby-2.7.0-preview3/addr2line.c 
 compiling /home/qnighy/.rake-compiler/sources/ruby-2.7.0-preview3/dmyenc.c 
 linking miniruby 
 generating x86_64-linux-gnu-fake.rb 
 x86_64-linux-gnu-fake.rb updated 
 generating encdb.h 
 encdb.h updated 
 /home/qnighy/.rake-compiler/sources/ruby-2.7.0-preview3/tool/ifchange "--timestamp=.rbconfig.time" rbconfig.rb rbconfig.tmp 
 rbconfig.rb updated 
 generating enc.mk 
 making srcs under enc 
 make[1]: ディレクトリ '/home/qnighy/.rake-compiler/builds/x86_64-linux/ruby-2.7.0-preview3' に入ります 
 make[1]: 'srcs' に対して行うべき事はありません. 
 make[1]: ディレクトリ '/home/qnighy/.rake-compiler/builds/x86_64-linux/ruby-2.7.0-preview3' から出ます 
 generating transdb.h 
 transdb.h updated 
 compiling /home/qnighy/.rake-compiler/sources/ruby-2.7.0-preview3/dln.c 
 compiling /home/qnighy/.rake-compiler/sources/ruby-2.7.0-preview3/localeinit.c 
 creating verconf.h 
 verconf.h updated 
 compiling /home/qnighy/.rake-compiler/sources/ruby-2.7.0-preview3/loadpath.c 
 compiling /home/qnighy/.rake-compiler/sources/ruby-2.7.0-preview3/prelude.c 
 Traceback (most recent call last): 
 /home/qnighy/.rake-compiler/sources/ruby-2.7.0-preview3/tool/mk_builtin_binary.rb:15:in `<main>': undefined method `each_builtin' for RubyVM:Class (NoMethodError) 
 uncommon.mk:1125: recipe for target 'builtin_binary.inc' failed 
 make: *** [builtin_binary.inc] Error 1 
 rake-compiler aborted! 
 Command failed with status (2): [make...] 
 /home/qnighy/workdir/rake-compiler/tasks/bin/cross-ruby.rake:161:in `block (2 levels) in <top (required)>' 
 /home/qnighy/workdir/rake-compiler/tasks/bin/cross-ruby.rake:160:in `block in <top (required)>' 
 /home/qnighy/workdir/rake-compiler/bin/rake-compiler:24:in `<top (required)>' 
 Tasks: TOP => cross-ruby => install => /home/qnighy/.rake-compiler/ruby/x86_64-linux/ruby-2.7.0-preview3/bin/ruby.exe => /home/qnighy/.rake-compiler/builds/x86_64-linux/ruby-2.7.0-preview3/ruby.exe 
 (See full trace by running task with --trace) 
 ``` 

 ## Expected behavior 

 The build command should succeed. 

 The problem seems to be that `RubyVM::each_builtin` is available only in `./miniruby`. Ruby's [configure script explicitly sets MINIRUBY as BASERUBY if configured for cross-compilation](https://github.com/ruby/ruby/blob/v2_7_0_preview3/configure.ac#L3031-L3043), so I suppose this is the bug on Ruby's side, not rake-compiler's.

Back