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

はてなブックマークに追加はてなブックマーク Yahoo!ブックマークに登録 ニフティクリップに追加 Livedoor クリップに追加 BuzzurlにブックマークBuzzurlにブックマーク Twitterに投稿  

ぼちぼち、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が動作しました。


日時: 2009年12月10日 19:39
コメントを投稿






トラックバック

■この記事のトラックバックURL:
http://www.mapee.jp/mpe334/mt-tb.cgi/515

この記事にトラックバックされる方は、参照先が分かるようにするために、「Cygwin1.5にRuby1.7をソースからビルド」へのリンクをお願いいたします。
以下のHTMLタグをトラックバック送信元ページ内に挿入して下さい。



※この記事へのリンクがない、また関連のないページからのトラックバックは反映されませんので、ご了承下さい。






あわせて読みたいブログパーツ
フィードメーター - Ruby勉強ルーム