This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
開発者の手引き
English version: Developer How to
bug report
- Redmine
- project:ruby-master
- project:ruby-18
- Rubyforge の Ruby プロジェクト の Bug Tracking System
- Debian
- FreeBSD
- NetBSD
- Fedora
- MacPorts
coding style
- indent
- C は 4
- Ruby は 2
- tab/space
- Ruby コードは TABなし [ruby-dev:19388]
- CコードでもTABを使わずspaceだけを使う [Bug #14246]
- 改行コード
- 関数の宣言のスタイル
- 1.8はK&R1e、1.9 からは ANSI C style
- VC のバグを回避するために、ポインタを利用する無引数関数は関数定義以外にプロトタイプ宣言をすること
- 1.8はK&R1e、1.9 からは ANSI C style
- 標準
- C99
- Travis/AppVeyor/RubyCI で動作するものに限る。詳細は C99 を参照
- Assumptions も参照
- C99
- 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>"
または、mrkn/vim-cruby を使うと良い。
移植性確保
- GNU/Linux 依存にしない
- Windows を忘れない
- BSD make はデフォルトで set -e しているので、戻り値が 0 以外になってはいけない
ビルド方法
必要なもの
- Cコンパイラ :)
- autoconf (2.60 以降、VC++ 利用時を除く)
- bison (2.2 以降)
- (gperf (lex.c を自分で作る時、3.0以降))
- コードサイニング証明書 (Macのみ。OS XでGDBを使う(ためにコード署名をする)参照し、証明書名を環境変数RUBY_CODESIGNに設定する)
- 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](http://www.parisc-linux.org/cluster.html)
- see [ruby-dev#36732](http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/36732)
- x86 以外で、個人では用意が難しい環境の場合、上記の様にサポートしてくれる団体などに助力を頼みましょう。
- 各アーキテクチャで動作させたい場合は、動かせるマシンを借りられないかどうかを Debian Project に相談してみてください。
UNIX系の場合
$ git clone https://git.ruby-lang.org/ruby.git /path/to/source/directory
$ cd /path/to/source/directory
$ autoconf
$ cd /path/to/build/directory
$ /path/to/source/directory/configure
$ make
mswin系の場合
> git clone https://git.ruby-lang.org/ruby.git drv:\path\to\source\directory
> 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
コンパイラに与えるデバッグフラグ。-ggdb3 を指定するとマクロを 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)$/'"
- 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に実行対象ファイルを作成する
- benchmark_driver.gemで実行
詳細は https://github.com/ruby/ruby/blob/trunk/benchmark/README.md
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)
- 時おり、主に日本で開発会議が開かれる。
自動リンク
- 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を新規に生成する。あくまで一時的なので知らない間に消えちゃっても困らないデータにだけ使うこと。
資料
- [S・P・ハービソン3世とG・L・スティール・ジュニアのCリファレンスマニュアル](http://www.amazon.co.jp/dp/4434124234)
- C言語の仕様について網羅的に書かれた良書。CRubyコミッタはとりあえず読んでおくべき。
- [The Open Group Base Specifications Issue 7](http://pubs.opengroup.org/onlinepubs/9699919799/toc.htm)
- POSIXの仕様を確認したい時に見る
- [インテル® 64 および IA-32 アーキテクチャー・ソフトウェア・デベロッパーズ・マニュアル](http://www.intel.co.jp/content/www/jp/ja/processors/architectures-software-developer-manuals.html)
- 『最適化リファレンス・マニュアル』はCプログラマでも参考になります。
- [Rubyソースコード完全解説](http://i.loveruby.net/ja/rhg/)
- Ruby 1.7ベースのソースコード解説。古いが参考になる。
- [RHG strikes back](http://qwik.jp/rhg-strikes-back/)
- Ruby 1.9の実装を読む集い
プラットフォーム
- Darwin version and OSX version: OSX 10.x.y == Darwin (x+4).y.0
歴史的
Policies
Development
For developers
- Developer How To, Developer How To JA
- How To Contribute
- How To Report, How To Report JA
- How To Request Backport
- How To Request Features
- Developers Meeting
For committers
- Committer How To, Committer How To JA
- Git Migration FAQ JA
- How To Backport
- How To Manage Redmine
- How To Release JA
- How To Maintain RubyCI Servers