Cygwin1.5にRuby1.7をソースからビルド

スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 |
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般

ぼちぼち、Rubyソースコード完全解説を読むことにトライしようかと思い、解説で使われているRuby1.7を、WindowsXP上に入れているCygwin環境にソースからインストールしてみた。

スポンサーリンク

以下から、該当バージョンのRubyのダウンロードができ、ビルドの方法も説明されています。
『Rubyソースコード完全解説』サポートページ
rubyビルドガイド

Cygiwinシェル(bash)から、configure, make, make install

Cygiwinシェルを起動して、

$ mkdir ~/src
$ cd ~/src
$ wget http://www.loveruby.net/ja//rhg/ar/ruby-rhg.tar.gz
$ tar xfvz ./ruby-rhg.tar.gz
$ cd ./ruby-rhd
$ ./configure --enable-shared --prefix=/home/username --program-suffix=-1.7
$ make
$ make install

という方針で進める。
Windowsにcygwinを入れると、cygwinディレクトリが、UNIXでいう”/”ディレクトリとなる。
ユーザーディレクトリは、/home/username なので、Rubyのソースは、/home/username/src に、Rubyのインストールは/home/username 下に入れることにしました。

序章 導入

Cygwin、UX/4800など一部のプラットフォームではconfigureの段階で –enable-sharedオプションを付けないとリンクに失敗する。 –enable-sharedというのはrubyのほとんどを共有ライブラリ (libruby.so)としてコマンドの外に出すオプションである。

とあるので、configureのオプションに–enable-sharedをつける。
インストールディレクトリを、configure の –prefix オプションにて指定する。
サフィックスに-1.7をつけることで、ruby-1.7.exeと実行ファイルができるので、ほかバージョンをインストールする際にも区別ができます。
configureまでは順調に進みましたが、次のmakeの段階でエラー発生。

make のエラー対策

make コマンドで、math.c、missing/strftime.c、ext/win32ole/win32ole.c の3つでエラー発生。
それぞれを、以下のように修正しました。エラー文の下に参考にしたURLを併記。

* math.c
    too few arguments to function `nan' エラー

http://japanese-document-of-gcc-errors.googlecode.com/files/gcc-errors.pdf


http://jarp.does.notwork.org/diary/200702b.html


http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/40309

    183行目
    #if defined __CYGWIN__
    #define log(x) ((x) < 0.0 ? nan() : log(x))
    #define log10(x) ((x) < 0.0 ? nan() : log10(x))
    #endif
        ↓
    #if defined __CYGWIN__
    #define log(x) ((x) < 0.0 ? 1.0 : log(x))
    #define log10(x) ((x) < 0.0 ? 1.0 : log10(x))
    #endif
 
* missing/strftime.c
    'timezone' redeclared as different kind of symbol エラー

http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/32536

    189行目
    extern char *timezone();
        ↓
    /*     extern char *timezone(); */
    
    451行目
    strcpy(tbuf, timezone());
        ↓
    /* strcpy(tbuf, timezone()); */ *tbuf = 0;
 
* ext/win32ole/win32ole.c
    [win32ole.o] エラー error: `GUIDKIND_DEFAULT_SOURCE_DISP_IID' undeclared

http://cvs.cacanet.org/WEB/members/fujino/archives/000187.html


http://www.katontech.com/diary/?date=20040518#p07

    24行目 追加
    #include <olectl.h>
 

1つ目(math.c)、2つ目(missing/strftime.c)の修正は、力技・・・。学習のためなので、とりあえずmake通すための処置としました。
この修正後、make distclean で一回削除したあと、configureからやり直し、make, make install できた。

動かして確認

$ cygcheck -c cygwin
Cygwin Package Information
Package              Version        Status
cygwin               1.5.25-15      OK
$ cd bin
$ ls
cygwin-ruby-1.717.dll*  irb*  ruby-1.7.exe*
$ ruby-1.7 -e "puts RUBY_VERSION"
1.7.3

と、一通り入ったようです。
さって、1日1章くらいの目標で、Rubyソースコード完全解説を読んでいこう。

追記。irb

irbも試したところ、shebangのパスが違うところに通っていたので修正。

$ ./irb
irb(main):001:0> RUBY_VERSION
=> "1.8.7"

ともとから入っていた他のRubyインタプリタにirbのパスが通っていた。
ので、/home/username/bin/irb のファイルを開き1行目のshebangのパスを変更。

#!/usr/bin/env ruby
  ↓
#!/home/username/bin/ruby-1.7.exe

と修正したところ、

$ ./irb
irb(main):001:0> RUBY_VERSION
"1.7.3"

とRuby1.7.3でirbが動作しました。

スポンサーリンク
 
スポンサーリンク