開発者の手引き¶
bug report¶
- Redmine
- [[ruby-trunk]]
- [[Ruby 1.8]]
- Rubyforge の Ruby プロジェクト の Bug Tracking System
- Debian
- FreeBSD
- NetBSD
- Fedora
- MacPorts
coding style¶
- indent
- C は 4
- Ruby は 2
- tab/space
- tab width は 8
- Ruby コードは TABなし [[ruby-dev:19388]]
- 改行コード
- 関数の宣言のスタイル
- 1.8はK&R1e、1.9 からは ANSI C style
- VC のバグを回避するために、ポインタを利用する無引数関数は関数定義以外にプロトタイプ宣言をすること
- 1.8はK&R1e、1.9 からは ANSI C style
- 標準
- C90 (not C99)
- Ruby 1.9 Rubyソースコードの仮定事項も参照
- Ruby コードの coding style [[ruby-dev:19388]]
- TABなし、2スペースインデント
- 最終的にはRDoc付加(本人かボランティアかは不問)
- 変数とメソッドのcamelCaseは非推奨
- クラス名・モジュール名はCamelCase
- その他の定数は大文字で_で区切る
- naming rule [[ruby-list:12517]]
- 単語の先頭の文字は必ず大文字
- 略語は全部大文字
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 <[email protected]>"
移植性確保¶
- 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)
特殊なビルドプラットフォーム¶
- 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", "."]
- minirubyを利用する
- RUNRUBY
-
- ビルドされたバージョンのRubyを利用する。主にテストやベンチマークのターゲットで利用される。
スクリプト$(srcdir)/runruby.rbを経由する
- makeに変数
RUNRUBYOPT
を指定すればrunruby.rbに引数を渡せる。
% make test-all RUNRUBYOPT=--debugger
で、gdb制御化のRubyでtest-allを実行する。
- makeに変数
構築¶
処理系の構築
- 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を削除する。
- realclean
- distcleanに加えてconfigureスクリプトに影響されない自動生成ソースコードも削除する。
テスト¶
- 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)$/'"
- make installしなくても動くべき
- 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 参照。
ベンチマークの作り方¶
- ($srcdir)/benchmarkに実行対象ファイルを作成する
- 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を取得する
- [ruby-core:12345], [ruby-dev:12345] と書くと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