猫の魔法

主にruby系の技術メモを記載

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