build Ruby on Windows 【第 2 回】
初稿:2005-06-19
書いた人:たむらけんいち
前口上
前回 から早や半年が過ぎてしまった。月日は移り、私の長男は小学生となり、Rubyは 1.8.3 preview1がアナウンスされた。当記事ではRubyのソースコードは、1.8.3 preview1 を扱うこととする。
また前回インストールした MinGW であるが、こちらも月日が流れ MinGW-4.1がリリースされたのでこれを使って検証を行なった。バージョンが違っても基本的な部分は同等と思われるが、お約束としてここに記しておく。
ちなみに MinGW-4.1.0ではインストーラが Cygwinの様にネットワークインストールするようになった。Sourceforgeのサイトを選択して、g++やbinutilsのインストールする/しないやCurrent/Candidate/Previousを指定する。インストールに関しても前回同様詳しい説明は省くが基本的には Nextボタンを押すだけだ。
Rubyの拡張ライブラリとは
宿題って何だったっけ?
拡張ライブラリについての課題が課題その1だったわけだが、少し振り返ってみよう。
実際に ruby-1.8.2 preview3を MinGW環境をセットアップしてコンパイルしてみたわけだが、拡張ライブラリが作られたものと作られなかったものとがあった。この違いを考えて欲しかった訳だ。ちなみに課題その2のエディタについては適当なものが手元にあるという前提で進めさせてもらう。
では、環境が変っているが、前回同様ソースファイルを取得して解凍後に
するだけでビルドには成功する。
それでは、拡張ライブラリを確認してみよう。
.soなファイルが生成される場所が変更されていることに気付いただろうか。
拡張ライブラリの有無の確認のために、ext/以下のディレクトリを羅列する。
拡張ライブラリが作られていないディレクトリには『+』で印を付けてみた。
そもそも拡張ライブラリとはどんなものだったろうか?
RubyインタプリタはC言語で書かれているのだが、Ruby自体を拡張するためのAPIを用いてRubyに機能追加するための仕組みが拡張ライブラリである。
ほとんどのライブラリは OSの仕組みを利用して、Rubyインタプリタのコンパイル時以降に作成された拡張ライブラリを動的に組込むことが可能だ。Windows OS の場合、DLL なので作法に従って作成する必要があるが、Rubyの場合、特にこの辺を意識する必要はない。
README.EXT.jaは、OS毎の解説が無いが、これはRubyが吸収しているからだ。LinuxなどのUNIX系OSでも、MinGW/MSYSでも基本的にこの辺は問題なく動く。
拡張ライブラリの作り方に関しては前田修吾氏 の「第1回 拡張ライブラリの作成(1), (2)」が詳しい。
キモは extconf.rb
上の前田氏の文章でも触れられている extconf.rb だが、ここで各ディレクトリのものを比較してみる。
ext/bigdecimal ディレクトリの bigdecimal.o は bigdecimal.cがコンパイルされた証拠である。extconf.rbはたったの2行のシンプルなものだ。
対して、ext/curses ディレクトリでは curses.o が出来ていないため curses.cはコンパイルされていない。extconf.rbも31行もある。ここでポイントとなるのは、have_header()とhave_library()だ。リファレンスマニュアルのmkmf.rbに解説がある。
- have_header(header)
- ヘッダファイル header が存在するかどうかを検査します。
- have_library(lib[, func])
- ライブラリ lib がシステムに存在し、関数 func が定義されているかどうかを検査します。
つまり、ライブラリの機能を Ruby から拡張ライブラリとして使うケースに必要な情報を取得するための関数だ。
curses拡張ライブラリの場合、プラットフォームで条件分けしつつ必要なライブラリの関数とヘッダファイルの存在のペアを確認していく。OKならば make変数が trueになり再度必要な関数の存在を確認してから、Makefileを出力する。ここまででcurses拡張ライブラリを作るのに必要なライブラリなどが足りなかった場合は拡張ライブラリも作られないのだ。
extconf.rbで確認されるライブラリである libtinfoやlibtermcapが初期状態の MinGW/MSYSには存在しないため、これらの拡張ライブラリは作られないというのが解答だ。
逆に最近は iconvライブラリが含まれるため iconv拡張ライブラリは生成されている。それから特にライブラリを必要としない bigdecimalや nkfも拡張ライブラリ作成は問題ない。この辺をふまえて、もう一度先程のリストを眺めてみると良いだろう。
じゃ、どうすりゃいいの?
選択肢としては、以下のどちらかになる。
- 必要なライブラリをソースから用意する。
- ライブラリのバイナリを探してインストールして利用する。
自前でコンパイルするのは手間がかかるものもあったりするが、最新版を自分の好きなように用意できるのは魅力だ。ただMinGW/MSYSではまだまだ UNIXなソースのコンパイルは通らないものも多い。バイナリは見つけられるかどうかが問題だ。ただし今回に限れば標準添付な拡張ライブラリに必要なものは、ほぼ揃っている。
gdbm, openssl, pdcurses(curses), readline, zlib
上記 + GNUを中心としたツールライブラリ。結構新しめ。
GnuWin32 provides Win32 (MS Windows 95 / 98 / ME / NT / 2000 / XP) ports of tools with a GNU or similar open source license.
実践すべし
では、具体的に curses拡張ライブラリの対応をしてみる。今回は GnuWin32のライブラリを利用してみよう。
まずはサイト に飛ぶ。News / Annoucementsを見ると沢山のライブラリが releaseされていることが判る。ページ左にサイドメニューがあるので、見てみると Download - Packagesがリソースの一覧なので、ページ検索で PdCurses 2.6 terminal library を探して欲しい。
PDCurses for Windows のページでは Description とか Installation and Usage には目を通しておくこと。今回は、Binaries と Developer files(Libraries) を Downloadする。
早速中身を確認してみよう。unzip -l だ。
今回必要となるのは、PdCurses-2.6-lib.zip の include,lib 以下と PdCurses-2.6-bin.zip の curses2.dll だけだ。よって
これで bin,lib,includeに必要なファイルが揃ったので /mingw 以下にコピーをする。
ruby-1.8.3のソースディレクトリに戻ってから、ext/curses/Makefileを削除して、makeする。
ext/cursesのみ再ビルドされて curses.so が作られる。
では動作確認だ。MSYSの rxvtではなく cmd.exeを起動してからruby-1.8.3のソースディレクトリに移動して欲しい。まずは、curses2.dll の存在するディレクトリが PATHに登録されている必要がある。
これを忘れて curses.so を使おうとすると
というエラーダイアログが表示されて、
というメッセージがコンソールに出力されるので注意されたし。
前回のまちがいについて
第 1 回において WindowsOS付属のメモ帳を
とけなしたが、
とあるため正しくないのではと、すぎむし氏に指摘を受けた。もっともである。
上記制限は、Win95,98付属のメモ帳である。訂正させていただく。
__ 容量制限はなくなったし、UNICODEなどにも対応してます。__
すぎむし氏からの内容をそのままコピペしておく。
あとがき
さて今回は前回と文体を合せることが出来ないくらいバタバタしてしまって、るびま編集部員のみなさんに大変迷惑をかけてしまった。ただ、せっかく第一回を書いたのだし、この辺の事情はあまり表に出ないということもあり、何とか完成させたかったことと、影の編集長こと、すぎむし氏のフォローがあって形になったことを記しておきたい。
1.8.3の正式リリースはまだ、まつもとさんからは無いようである。前回同様締めの言葉はこうさせて頂く。
願わくば、未来のコミッターとなる人が、この記事を読んだ方の中から出てきてくれればと思う。
著者について
たむら (tamura at ruby-lang dot org)
退役エンジニア。日記が書けないほど仕事が忙しいなんて普通じゃないと思う今日この頃。締切り間際に病気になるのは止めて欲しいぞ>我が子たちよ。
build Ruby on Windows バックナンバー