ruby本体をコンパイルしてみる
久々の更新です。
今日は、rubyの本体のコードをちゃんとローカルに持ってきてコンパイル出来る状態にしてみました。 (本当は別の目的があったんですが、すんなりコンパイルが通ったのでやり方だけメモしておこうという算段。。。) 基本はGithubのruby/rubyのReadmeを見れば事足りますが、一部見ても難しいところがあったので、そのメモを残して置こうと思います。
前提
- 環境はMac(Mojave)です。
- Command Line Toolsを入れておく必要があります(なくても出来るかもですが、難易度上がりそう)
rubyのソースをgitからcloneする
$ git clone git@github.com:ruby/ruby.git
$ cd ruby
./configureを作る
環境に合わせてconfigureを作成してくれるautoconfを利用してこれを元 configureを作ります。
$ autoconf
./configureを実行する
makeを実行する前段として、環境による動作の違いやコンパイルの可否をチェックしてくれるconfigureスクリプトを流します。
Readmeだと ./configure
だけですが、自分の環境ではOpenSSL系とReadline系の組み込みライブラリが使えなかったので、OpenSSLとReadlineのインクルードファイル(C言語の.hが拡張子のファイル)の場所を指定して上げる形にしました(OpenSSLとReadlineについてはHomebrewでインストールしているので、そのインストールパスを指定しています)
--prefixにはrubyをインストールパスを設定します。複数バージョンインストールしたいので、ruby/trunkというディレクトリ以下にインストールすることにしました。
$ ./configure --prefix=$HOME/ruby/trunk --with-opt-dir=$(brew --prefix openssl):$(brew --prefix readline)
with_opt_dirを指定するとその下にパスからincludeとlibのパスを探してそれぞれLDFLAGS/CPPFLAGSにセットされるようです。
if test "${with_opt_dir+set}" = set; then : withval=$with_opt_dir; val=`echo "$PATH_SEPARATOR$withval" | sed "s|$PATH_SEPARATOR\([^$PATH_SEPARATOR]*\)| -I\1/include|g;s/^ //"` CPPFLAGS="$CPPFLAGS $val" val=`echo "$PATH_SEPARATOR$withval" | sed "s|$PATH_SEPARATOR\([^$PATH_SEPARATOR]*\)| -L\1/lib${rpathflag:+ $rpathflag\\\\1/lib}|g;s/^ //"` LDFLAGS="$LDFLAGS $val" LDFLAGS_OPTDIR="$val" OPT_DIR="$withval"
PATH_SEPARATORは「:」です。
# The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi
makeする
makeしてコンパイルします
$ make
make checkする
$ make check
拡張gemのビルド
minitest だったりrakeだったりをビルドします
$ make update-gems && make extract-gems
インストール
$ make install
確認
インストール先のディレクトリに移動してrubyのバージョンが正しいことを確認します。
$ cd $HOME/ruby/trunk/bin $ ./ruby --version