Gtk 覚え書き(2)

Ruby-Gtk 目次へ

Gtk拡張モジュールの展開

Gtk拡張モジュールを Ruby のソースの ext ディレクトリ以下に 展開します.

Gtk 拡張モジュールをコンパイルするのに sh が 必要です. ですが sh の代りに ruby を使って コンパイルするパッチが Ruby のメーリングリストで流れていたので, これをあてておきます. (どのメールだったか忘れました.すいません.)

追記(1999.06.22)
ruby-gtk-0.19 からは,このパッチをあてたものになる予定ですので, パッチは不要です.


NameError

準備ができたところで,nmake を実行.

./extconf.rb:3: uninitialized constant CONFIG (NameError)

とエラーがでます.

extconf.rb の3行目では,Ruby のインストール先をフルパスで 求めているだけのようです.

extconf.rb の3行目を

RUBY = CONFIG["bindir"] + File::Separator + CONFIG["RUBY_INSTALL_NAME"]

から

RUBY = "rbmw"

に変更します.(私は,ruby.exe を rbmw.exe と名前を変更して使っています.)

本来,エラーの原因を追求すべきなのですが, どこでどうするのが良いのかよくわかりません.

で,手っ取り早く rbmw にしてしまう訳です. (こういうことをするからなかなかパッチを出すところまでいかないのですが.)


gtk-config

二度めの nmake です.今度のエラーは

./extconf.rb:12:in ``': cannot fork for "gtk-config --libs"
(No such file or directory) (fatal)

gtk-config は,Windows-native GTk+ にはありません.

begin
  $LDFLAGS, *libs = `#{$gtk_config} --libs`.chomp!.split(/(-l.*)/) #12行目
  $libs = libs.join(' ') + ' ' + $libs
  $CFLAGS=`#{$gtk_config} --cflags`.chomp!
rescue
  $LDFLAGS = '-L/usr/X11R6/lib -L/usr/local/lib'
  $CFLAGS = '-I/usr/X11R6/lib -I/usr/local/include'
  $libs = '-lm -lc'
end

$LDFLAGS = '-L/usr/local/lib'
$CFLAGS = '-I/usr/local/include'

に変更します.

12行目は begin ブロックの中なので, 失敗しても rescue の処理に行って欲しいのですがそこで処理が終わります. mswin32版 Ruby のバグなのか, それとも,Windows 95 の DOS プロンプトがタコなせいかも知れません.

mswin32版では12行目の処理で実行に失敗すると C言語レベルで rb_fatal 関数を 実行しているようです. 単純にこれを rb_raise 関数の呼び出しにすれば,終了しなくなるとは思うのですが, それだけで良いのかどうかちょっと自信がありません. 本来の仕様ではどう動くのが正しいのかも良くわかりません.

これ以上追求をしないで先へ進みます.(^^;

追記(1999.06.22)
UNIX 環境での本来の動作は,コマンドが見つからない場合は,Error にならず 実行結果に空文字列を返すのが本来の動作だそうです.


バージョンアップ

・・・とここまで書いてきたのですが・・・

この時点で, Windows native Gtk,ruby-gtk ともにバージョンアップされました. という訳で,ここから先は,現時点での最新版 Windows native Gtk 19990621, ruby-gtk 0.19 を対象にします.


nmake

さらに nmake を実行.さらにエラーが発生. extconf.rb が作成した Makefile の内容を nmake が理解できないのと Windows 95 の command.com では,";" はコマンドの区切り にならないのが原因のようです.

extconf.rb の Makefile を作成している処理の

@cd src; make all

@cd src
nmake

に変更します.


ruby.h

さらに nmake を実行.ようやくコンパイルを開始. いきなり ruby.h が見つからないとエラー.

gtk 拡張モジュールの場合, ext/gtk/src の下に gtk 拡張モジュールのソースがあります. ソースファイルのあるディレクトリ ext/gtk/src を基準にして 相対パスで ruby.h を表現すると

../../../ruby.h

となります.

しかし他の拡張モジュール,例えば socket の場合 ext/socket の下にソースファイルがあるので,相対パスで ruby.h を示すと

../../ruby.h

となります.

mswin32 用の extmk.rb では,

-I../..

とインクルードパスを 指定するようになっていたので,socket 拡張モジュールの例のような相対パスの

../../ruby.h

を見つけることはできても,gtk 拡張モジュールの相対パスの

../../../ruby.h

を見つけることが できなかったためです.

相対パスをやめて, 絶対パスでインクルードパスを指定するように extmk.rb を変更しました. (extmk.rb ファイルの "-I../.." を "-I#{$ruby_inc}" に変更)


Ruby-Gtk 目次へ