開発者の手引き

bug report

coding style

  • indent
    • C は 4
    • Ruby は 2
  • tab/space
    • tab width は 8
    • Ruby コードは TABなし []
  • 改行コード
  • 関数の宣言のスタイル
    • 1.8はK&R1e、1.9 からは ANSI C style
    • VC のバグを回避するために、ポインタを利用する無引数関数は関数定義以外にプロトタイプ宣言をすること
  • 標準
  • Ruby コードの coding style []
    • TABなし、2スペースインデント
    • 最終的にはRDoc付加(本人かボランティアかは不問)
    • 変数とメソッドのcamelCaseは非推奨
    • クラス名・モジュール名はCamelCase
    • その他の定数は大文字で_で区切る
  • naming rule []
    • 単語の先頭の文字は必ず大文字
    • 略語は全部大文字

Emacs の場合

misc/ruby-style.el や misc/ruby-mode.el を使う。

Vim の場合

.vimrc に例えば以下のように書く

au FileType c setl ts=8 sw=4 noexpandtab
au FileType ruby setl nowrap tabstop=8 tw=0 sw=2 expandtab
let g:changelog_timeformat = "%c"
let g:changelog_username = "FOO, Bar foobar@ruby-lang.org"

移植性確保

  • GNU/Linux 依存にしない
  • Windows を忘れない
  • BSD make はデフォルトで set -e しているので、戻り値が 0 以外になってはいけない

ビルド方法

必要なもの

  • Cコンパイラ :)
  • autoconf (2.60 以降、VC++ 利用時を除く)
  • bison (2.2 以降)
  • (gperf (lex.c を自分で作る時、3.0以降))
  • ruby
    • ruby 1.9 を作る時は別に ruby が必要 (これは 1.8 でもよい)
    • クロスビルドをする場合は、作ろうとしているのと同じバージョンのホスト環境ネイティブの ruby が必要

Debianなら以下のコマンド一発で必要なものは入る

aptitude build-dep ruby1.9.1

さもなくば以下のものを入れる:

  • Tcl/Tk
  • NDBM/QDBM
  • GDBM
  • Ncurses (あるいは類似の何か)
  • OpenSSL
  • readline/editline(libedit)
  • zlib
  • libffi
  • libyaml
  • libexecinfo (FreeBSD)

特殊なビルドプラットフォーム

Linux on pa-risc
see ruby-dev#36732

  • x86 以外で、個人では用意が難しい環境の場合、上記の様にサポートしてくれる団体などに助力を頼みましょう。
  • 各アーキテクチャで動作させたい場合は、動かせるマシンを借りられないかどうかを Debian Project に相談してみてください。

UNIX系の場合

$ cd /path/to/source/directory
$ svn co http://svn.ruby-lang.org/repos/ruby/trunk .
$ autoconf
$ cd /path/to/build/directory
$ /path/to/source/directory/configure
$ make

mswin系の場合

> cd drv:\path\to\source\directory

svn co http://svn.ruby-lang.org/repos/ruby/trunk .
cd drv:\path\to\build\directory
drv:\path\to\source\directory\win32\configure
nmake

build directory

もちろん相対パスでの指定も可

configure

--enable-shared

共有ライブラリにする。

--enable-pthread

1.9 では obsolete。

--disable-install-doc

rdoc を生成、インストールしない

--with-opt-dir

ヘッダやライブラリのサーチパスを追加する

optflags

コンパイラに与える最適化フラグ。gdb でステップ実行する時は -O0 を指定していないとあらぬところへ飛んだりする。

debugflags

コンパイラに与えるデバッグフラグ。-g3 を指定するとマクロを gdb でいじれるようになるので便利。

warnflags

コンパイラに与える警告フラグ。-Wall -pedantic -Wno-long-long とか指定したりする。

--with-exts

ビルドする拡張ライブラリの指定。ext/foo をビルドしたくない場合、--without-foo と指定しても可能。

--prefix

インストール先の指定。

設定例

Makeターゲット

RUBY処理系

各ターゲットごとに、幾つかの種類のRuby処理系を利用する

BASERUBY
現在システムにインストールされているrubyコマンドを利用する。ビルド対象のRubyとはバージョンが異なることもよくある。

  • 例: BASERUBYは1.8.7, 構築対象は1.9 MINIRUBY * minirubyを利用する
    • minirubyはビルド途中で構築される、拡張ライブラリなどを含まない最小構成のRuby。これを利用して完全なRubyを構築する
  • makeに変数MINIRUBYOPTを指定すればminirubyに引数を渡せる。 % make loadpath ./miniruby -I../../lib -I.ext/common -I./- -r../../ext/purelib.rb -e 'p $:' ["/Users/yugui/src/ruby/mri/lib", "/Users/yugui/src/ruby/mri/tmp/array/.ext/common", "."] % make loadpath MINIRUBYOPT=-v ./miniruby -I../../lib -I.ext/common -I./- -r../../ext/purelib.rb -v -e 'p $:' ruby 1.9.0 (2008-10-09 revision 0) [i386-darwin9.5.0] ["/Users/yugui/src/ruby/mri/lib", "/Users/yugui/src/ruby/mri/tmp/array/.ext/common", "."] RUNRUBY * ビルドされたバージョンのRubyを利用する。主にテストやベンチマークのターゲットで利用される。
  • スクリプト$(srcdir)/runruby.rbを経由する
    • makeに変数RUNRUBYOPTを指定すればrunruby.rbに引数を渡せる。 % make test-all RUNRUBYOPT=--debugger で、gdb制御化のRubyでtest-allを実行する。

構築

処理系の構築

all
(デフォルト) rubyをビルドする
golf
gorubyをビルドする
miniruby
添付拡張ライブラリやエンコーディングを含まない最小構成のインタプリタ(miniruby)をビルドする
ruby
拡張ライブラリをビルドせずにrubyインタプリタをビルドする
main
rubyインタプリタおよび拡張ライブラリをビルドするが、rdocを処理しない

個々のコンポーネント

prereq
srcsとincsとpreludesを実行する
srcs
定義ファイルから幾つかのCソースコードを生成する
preludes
*prelude.rbから、そのRubyコードを実行する処理をC言語ソースとして生成する
incs
定義ファイルから幾つかのCソースコード片やヘッダ(要するに#includeされるもの)を生成する。主にYARVとtranscode

incs-enc
コードポイント対応表から変換処理を生成する
encs
エンコーディングクラス群をビルドする
exts
拡張ライブラリ群をビルドする

ドキュメント

rdoc
rdocを処理してドキュメントを生成する

インストール

install
構築されたRubyをインストールする
install-nodoc
同上。ただし、ドキュメントはインストールしない。
install-ext
拡張ライブラリだけインストールする
install-lib
ライブラリだけインストールする
install-doc
ドキュメントだけインストールする
install-man
マニュアルページだけインストールする

消去

clean
オブジェクトファイルを中心に生成物を削除する。自動生成されたソースコードは残る。

clean-local
処理系本体とminirubyだけcleanする
clean-ext
拡張ライブラリだけcleanする
clean-enc
エンコーディングとtranscode関係だけcleanする
clean-doc
生成したドキュメントをcleanする(1.9.3 feature)
clean-golf
goruby関係だけcleanする
distclean
cleanに加えてconfigureスクリプトの出力やそれに影響される自動生成ソースコード、Makefileを削除する。

distclean-local
distclean-ext
distclean-enc
distclean-doc
distclean-golf
realclean
distcleanに加えてconfigureスクリプトに影響されない自動生成ソースコードも削除する。

realclean-local
realclean-ext
realclean-enc
realclean-doc
realclean-golf

テスト

test
簡単なテストを実行する

btest-ruby
後述
test-sample
MINIRUBYでsample/*.rbの実行を確認する
test-knownbug
MINIRUBYでKNOWNBUGS.rbをknown bugs再現コードを実行する。KNOWNBUGS.rbの記入基準は、bootstraptest/test_*.rbに含めるべきだが含めるとbtestに失敗するテストである。
test-all
RUNRUBYで詳細なテストを実行する。

  • make installしなくても動くべき
    • でも実際にはmake installしておかないと動かないテストもある。
  • TESTS変数がtest/runner.rbに引数として渡される。途中経過を詳細に表示するには、 make test-all TESTS=-v 特定のテストファイルtest/hoge/test_foo.rbだけを実行するには make test-all TESTS=hoge/test_foo.rb 特定のディレクトリ内のテストファイルtest/hoge/test_*.rbをまとめて実行するには make test-all TESTS=hoge 特定のテストケースtest_fooを除外するには make test-all TESTS="-n '/?!test_foo$/'" check testとtest-allを両方実行する btest unittestライブラリが動かない場合用のテストをminirubyで実行する

変数OPTS経由でbootstraptest/runner.rbに引数を渡せる。
btest-ruby
btestをrubyを使って実行する

解析と試行錯誤

run
minirubyで$(srcdir)/test.rbというファイルを実行する。
runruby
ビルドしたrubyで$(srcdir)/test.rbというファイルを実行する。-Iも適切に設定されるので便利。
gdb
gdb制御下のminirubyで$(srcdir)/test.rbというファイルを実行する。

$(srcdir)/breakpoints.gdbにブレークポイントを指定しておける。
gdb-ruby
gdb制御下のrubyで$(srcdir)/test.rbというファイルを実行する。
parse
minirubyで$(srcdir)/test.rbというファイルを解析してYARV機械語を逆アセンブルしてダンプする
benchmark
ベンチマークを実行する。変数OPTSを経由してbenchmark/driver.rbに引数を渡せる。

後述のベンチマークの項も参照。

RubySpec連携

update-rubyspec
RubySpecの作っているspecを更新する
test-rubyspec
specへの適合を検証する

make test-rubyspec MSPECOPT='-V -j -f s /library/date/civil_spec.rb'

その他

up
ワーキングコピーの内容をリポジトリの最新に更新する
love
up, all, test, install, test-all を実行する。とりあえずビルド&テストというときはこれを実行
dist
リポジトリからスナップショットを取得してtarballを作成する
help
簡単なターゲットの一覧を表示



デバッグ

gdb の場合、rp foo などの便利なコマンドを使える。詳細は .gdbinit 参照。

ベンチマークの作り方

  1. ($srcdir)/benchmarkに実行対象ファイルを作成する
  2. ruby benchmark/driver.rb [OPTIONS]で実行

詳細はruby benchmark/driver.rb --help

vm1, vm2

bm_vm1_*.rb, bm_vm2_*.rbというファイル名は各々、内部で300000回, 600000回の繰り返しを行っており、driverは同回数のwhileループの分を差し引いて表示する。

Windows上の諸環境の見分け方

mingw32
MINGW32, WIN32
mingw64
_MINGW32__, WIN32, __MINGW64_, WIN64
VC(32bit)
MSC_VER, WIN32
VC(64bit)
MSC
VER, _WIN32, _WIN64
cygwin
_CYGWIN__
BorlandC
BORLANDC

MINGW32 と _WIN32は名前に反して64bitでも定義されるようです。たいへんややこしいですね

コミュニケーション

  • メーリングリストを購読することが望ましい(ruby-dev, ruby-core, ruby-cvs)
  • 開発方針などはircで話し合われることも多い
    • #ruby-core @ freenode (英語)
    • #ruby-ja @ IRCnet(WIDE) (日本語) - 最近は #ruby:*.jp より #ruby-ja が使われることが多い。また、ログは抜粋して公開が可能。
    • #ruby:*.jp @ IRCnet(WIDE) (日本語)
  • 時おり、主に日本で開発会議が開かれる。

#ruby:*.jpのtips

有志によって、いくつかの便利なbotが運用されている。

自動リンク

  • URLっぽいものを書くとbotが読みに行ってtitleを取得する
  • , と書くとbotが対応するメーリングリストアーカイブへのリンクを表示する
  • r12345 と書くとbotがViewVCの対応するリビジョンへのリンクを表示する
  • [Bug #1234] などと書くとbotがredmineの対応するチケットへのリンクを表示する(#は半角)

謎コマンド

command> arguments

と書き込むとbotがコマンドを処理する

google> search phrase
google検索
dice> english
英和
dicw> 日本語
和英
dicj> 日本語
国語辞典
trans> 文章
Google翻訳。言語を自動認識した結果が日本語なら英語に、日本語以外なら日本語に翻訳する。
wp> topic
Wikipedia日本語版検索
google code> phrase lang:ruby
google code検索
paste>
コードなどを一時的に貼り付けておくためのURLを新規に生成する。あくまで一時的なので知らない間に消えちゃっても困らないデータにだけ使うこと。
fpaste>
画像などのファイルを一時的に貼り付けておくためのURLを新規に生成する。あくまで一時的なので知らない間に消えちゃっても困らないデータにだけ使うこと。

資料

Rubyソースコード完全解説
Ruby 1.7ベースのソースコード解説。古いが参考になる。
RHG strikes back
Ruby 1.9の実装を読む集い

プラットフォーム

  • Darwin version and OSX version: OSX 10.x.y == Darwin (x+4).y.0

歴史的