Ruby(本体)のビルドとデバッグ
はじめに
Ruby本体にコミットし、あわよくばコミッターになるというのが、私の人生の目標です。
そのためには、C言語で実装されているRubyのビルドやデバッグが最低限必要になります。
とは言え、基礎知識はあるものの、OSS開発に慣れているわけではないので、gccやgdb、makeやconfigureなど、覚えるべきことが沢山あります。
というわけで、メモしておきます。
情報収集
開発者メーリングリスト、ruby-devとか眺めていて、気になる挙動があったら、内部をデバッグして追ってみタイト思います。
あと、issueに関しては、ここに記載があるので、ざっと眺めてみるのも良さそう。
内部実装の基礎知識
Rubyのしくみ -Ruby Under a Microscope-
- 作者: Pat Shaughnessy,島田浩二,角谷信太郎
- 出版社/メーカー: オーム社
- 発売日: 2014/11/29
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (4件) を見る
Rubyのランタイムの仕組みを知るには、今はこの本が秀逸だと思う。本当に難しい実装の内容を、すごく絶妙なレベル感で説明してくれる。
クラスの仕組みから、ハッシュの構造や、最後はJRubyなどの解説まで、すごく分かった気にさせてくれる。
Rubyのコミッタになる人だけじゃなくて、Rubyを扱う人全員に基礎知識として是非読んでよ欲しい。それくらわかりやすいし、勉強になる良い本だと思う。
- 作者: 青木峰郎,まつもとゆきひろ
- 出版社/メーカー: インプレス
- 発売日: 2002/12
- メディア: 単行本
- 購入: 1人 クリック: 339回
- この商品を含むブログ (60件) を見る
昔は、Rubyのランタイムを知るとなれば、まずはこの青木さんの本だったが、今は少し内容が古い。
特に、バージョン1.9で入ったYARVよりも前だったこともあり、内部の設計がかなり現実と乖離してしまっているのが残念。
それでも、基本的なところで変わらないところもあると思うし、最終盤でなければWebで公開されているので、一度読んでみるのは良いこと。
ビルド
で、そのRubyの仕組みを勉強して、実際に中身を追ってみたいと思った時には、この記事を参考にして、ビルドとデバッグをしてみるのが良い。
#!/bin/bash make clean ./configure optflags="-O0" debugflags="-g3" make mkdir bin mv ruby bin/ruby ./bin/ruby -v
内容をざっとスクリプトにしてみると、こんな感じかな。
git clone http://github.com/ruby/ruby
cd ruby
当然ですが、一応補足すると、ソースコード自体はこんな感じで取得できます。
あとは、余裕があれば簡単な動作確認をしてみると良いでしょう。
rubyのソースコードはGitHubが大元ではないので、厳密な最新版が必要な場合は注意。
make check
これで、rubyの単体テストを一通り実行することができます。
が、大体いつもopensslがない!ってエラーで怒られたりします。
# Running tests: Finished tests in 2.272786s, 97.2375 tests/s, 200.6348 assertions/s. 221 tests, 456 assertions, 0 failures, 0 errors, 0 skips ruby -v: ruby 2.5.0dev (2017-02-08 trunk 57577) [x86_64-darwin16] /Users/myname/go/src/github.com/ruby/ruby/test/rubygems/test_bundled_ca.rb: cannot load such file -- openssl Skipping `gem cert` tests. openssl not found. /Users/myname/go/src/github.com/ruby/ruby/test/rubygems/test_gem_remote_fetcher.rb:84:in `<class:TestGemRemoteFetcher>': uninitialized constant TestGemRemoteFetcher::OpenSSL (NameError) < exception call stack > make: *** [yes-test-almost] Error 1
そこでこのあたりを参考にして、opensslを指定してビルドしなきゃいけないことに気づきます(汗 qiita.com
openssl_dir=`brew --prefix openssl` ./configure --with-openssl-dir=$(openssl_dir) make make check
デバッグ
デバッグオプション付きでビルドできたら、あとは通常のC言語プログラムと同じようにデバッグできます。
gdb ./ruby -e "print 1"
のようにデバッガで起動して、見たいところにブレークポイントをはって、ステップ実行するとかかな。
詳しくはgdbのヘルプを見れば書いてあるけど、よく使うコマンドとしては
あたりでしょうか。