Skip to content

Developer How To JA

Jemma Issroff edited this page Jun 6, 2023 · 2 revisions

開発者の手引き

English version: Developer How to

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 も参照
  • 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
MINIRUBYsample/*.rbの実行を確認する
test-knownbug
MINIRUBYKNOWNBUGS.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. 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

歴史的

Clone this wiki locally