Clang, a compiler front end which you can use instead of gcc, can build MRI: Matz Ruby Implementation, only if you succeeded in avoiding all pitfalls.
Build the latest LLVM and Clang
Mac OS X Snow Leopard has builtin clang
command but it's too old to build ruby. First of all, get the latest clang and it's dependency, the latest LLVM.
$ svn checkout http://llvm.org/svn/llvm-project/llvm/trunk llvm && cd llvm/tools && svn checkout http://llvm.org/svn/llvm-project/cfe/trunk clang && cd ..
$ ./configure && time make
Note that it takes really long time. I recommend you not to build before you go away from keyboard for a while but to build before you go to bed.
A simple test
hello.c
#include<stdio.h>
int main() {
puts("Hello, world!");
return 0;
}
building on gcc and clang
$ time gcc hello.c -o hello-gcc
!!! 0.34 real 0.01 user 0.03 sys!!!
[%] /private/tmp
$ time ~/src/llvm/Debug+Asserts/bin/clang hello.c -o hello-clang
!!! 0.11 real 0.06 user 0.02 sys!!!
clang is 3 times faster than gcc to build the hello world code. The executable files work samel.
Ruby
On GCC
$ git clone https://github.com/ruby/ruby.git ruby193-gcc
$ cd ruby193-gcc
$ autoconf
$ ./configure --prefix=`pwd`/local --enable-pthread --disable-install-doc --with-out-ext=tk\* --program-suffix=193 --with-readline-dir=/usr/local --with-arch=x86_64
$ time make
...
!!! 214.93 real 191.58 user 23.57 sys!!!
On Clang
$ git clone https://github.com/ruby/ruby.git ruby193
$ cd ruby193
$ ./configure --prefix=`pwd`/local --enable-pthread --disable-install-doc --with-out-ext=tk\* --program-suffix=193 --with-readline-dir=/usr/local PATH=/Users/ujihisa/src/llvm/Debug+Asserts/bin/:$PATH CC=/Users/ujihisa/src/llvm/Debug+Asserts/bin/clang CFLAGS=-Qunused-arguments CPPFLAGS=-Qunused-arguments --with-arch=x86_64
$ time make
!!! 932.06 real 883.44 user 31.09 sys!!!
It took 3 min 34.93 sec by GCC while it took 15 min 32.06 sec by Clang. GCC is 4.34 times faster than Clang to build MRI.
Pitfalls
If you use clang
command of Mac OS X Snow Leopard, even though you'll succeed in finishing make
ruby 1.9.3, but you cannot do anything by the Ruby.
$ ./local/bin/ruby -ve 1
ruby 1.9.3dev (2011-01-25 trunk 30651) [x86_64-darwin10.6.0]
!!!dyld: lazy symbol binding failed: Symbol not found: _rb_encdb_declare!!!
!!! Referenced from: /Users/ujihisa/git/ruby193/local/lib/ruby/1.9.1/x86_64-darwin10.6.0/enc/encdb.bundle!!!
!!! Expected in: flat namespace!!!
!!!dyld: Symbol not found: _rb_encdb_declare!!!
!!! Referenced from: /Users/ujihisa/git/ruby193/local/lib/ruby/1.9.1/x86_64-darwin10.6.0/enc/encdb.bundle!!!
!!! Expected in: flat namespace!!!
!!!/Users/ujihisa/git/ruby193/local/lib/ruby/1.9.1/x86_64-darwin10.6.0/enc/encdb.bundle: [BUG] Segmentation fault!!!
!!!ruby 1.9.3dev (2011-01-25 trunk 30651) [x86_64-darwin10.6.0]!!!
!!!-- Control frame information -----------------------------------------------!!!
!!!c:0002 p:-537663266 s:0004 b:0004 l:000003 d:000003 TOP !!!
!!!c:0001 p:0000 s:0002 b:0002 l:001dd8 d:001dd8 TOP !!!
!!!-- See Crash Report log file under ~/Library/Logs/CrashReporter or ---------!!!
!!!-- /Library/Logs/CrashReporter, for the more detail of ---------------------!!!
!!!-- C level backtrace information -------------------------------------------!!!
!!!-- Other runtime information -----------------------------------------------!!!
!!!* Loaded script: ./local/bin/ruby!!!
!!!* Loaded features:!!!
!!! 0 enumerator.so!!!
!!![NOTE]!!!
!!!You may have encountered a bug in the Ruby interpreter or extension libraries.!!!
!!!Bug reports are welcome.!!!
!!!For details: http://www.ruby-lang.org/bugreport.html!!!
!!!vimshell: signal 6(SIGABRT) "./local/bin/ruby -ve 1"!!!
Conclusion
You can build Ruby 1.9.3 by Clang. It's 0.23 times faster than building by GCC.
nice.
ReplyDelete