開発者の手引き¶
English version: DeveloperHowto
bug report¶
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 のバグを回避するために、ポインタを利用する無引数関数は関数定義以外にプロトタイプ宣言をすること
- 標準
- C99
- Travis/AppVeyor/RubyCI で動作するものに限る。詳細は C99 を参照
- Assumptions も参照
- C99
- 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 <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
see 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$/'" 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リファレンスマニュアル
C言語の仕様について網羅的に書かれた良書。CRubyコミッタはとりあえず読んでおくべき。
The Open Group Base Specifications Issue 7
POSIXの仕様を確認したい時に見る
インテル® 64 および IA-32 アーキテクチャー・ソフトウェア・デベロッパーズ・マニュアル
『最適化リファレンス・マニュアル』はCプログラマでも参考になります。
Rubyソースコード完全解説
Ruby 1.7ベースのソースコード解説。古いが参考になる。
RHG strikes back
Ruby 1.9の実装を読む集い
プラットフォーム¶
- Darwin version and OSX version: OSX 10.x.y == Darwin (x+4).y.0
歴史的¶