Ruby/Tk - FrontPage  Index  Search  Changes  PageRank  RSS  Login

Ruby/Tk-Kit

Tcl/Tk には,Tcl/Tk 環境(更には実行スクリプトまで含めて)を 単一バイナリ化した Tclkit と呼ばれるものがあります.

この Tclkit に基づき, Ruby/Tkを構成するライブラリの一つである tcltklib.so に Tcl/Tkライブラリを一体化させることを試みました. この tcltklib.so を使えば,Tcl/Tkがインストールされていない環境でも Ruby/Tkを使うことができますし, 逆に複数のバージョンのTcl/Tkがインストールされていても 決められた(一体化させた)バージョンのTcl/Tkが必ず使われることになります.

作成には tcltklib.c へのパッチが必要であり, 通常の tcltklib.so との作り分けの方法をどうするかを含めて 作成手順がまだ十分に整備できていないため, まずは Linux 向けに作成した tcltklib.so と RubyInstaller 1.9.1p378rc2 で使えるように作成したものとを テスト用に公開することにします. 良かったら試してみていただけるとうれしく思います.

ダウンロードしたファイルの名前を tcltklib.so に変更して, Rubyのダイナミックライブラリが置かれている場所にコピーしてください.

作成した tcltklib.so が動的ライブラリを一切使わないというわけではありません. 例えば,Linux 版では X Window Systemのライブラリなどが必要です. 環境によっては,そうした必要ライブラリの不整合により 正常に動かないということがあるかもしれません. 作成された Linux 版の tcltklib.so に対し, 私の手元の環境で ldd コマンドで調べた結果は次のようになっています.

$ ldd tcltklib.so-ruby192dev_20100313rev26900_i686-linux
       linux-gate.so.1 =>  (0xffffe000)
       libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0xb7c79000)
       libdl.so.2 => /lib/libdl.so.2 (0xb7c65000)
       libpthread.so.0 => /lib/i686/libpthread.so.0 (0xb7c14000)
       librt.so.1 => /lib/i686/librt.so.1 (0xb7c00000)
       libcrypt.so.1 => /lib/libcrypt.so.1 (0xb7bd3000)
       libm.so.6 => /lib/i686/libm.so.6 (0xb7bb1000)
       libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0xb7af9000)
       libc.so.6 => /lib/i686/libc.so.6 (0xb79bf000)
       libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb79b7000)
       /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000)

$ ldd tcltklib.so-ruby188dev_20100313rev26900_i686-linux
       linux-gate.so.1 =>  (0xffffe000)
       libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0xb7d62000)
       libdl.so.2 => /lib/libdl.so.2 (0xb7d4e000)
       librt.so.1 => /lib/i686/librt.so.1 (0xb7d3b000)
       libcrypt.so.1 => /lib/libcrypt.so.1 (0xb7d0d000)
       libm.so.6 => /lib/i686/libm.so.6 (0xb7ceb000)
       libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0xb7c33000)
       libc.so.6 => /lib/i686/libc.so.6 (0xb7af9000)
       libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7af1000)
       /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000)
       libpthread.so.0 => /lib/i686/libpthread.so.0 (0xb7aa0000)

$ ldd tcltklib.so-tk8.5.7-ruby192dev_20100313rev26900_i686-linux
       linux-gate.so.1 =>  (0xffffe000)
       libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0xb7c7a000)
       libXss.so.1 => /usr/X11R6/lib/libXss.so.1 (0xb7c77000)
       libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0xb7c69000)
       libXft.so.2 => /usr/X11R6/lib/libXft.so.2 (0xb7c54000)
       libfreetype.so.6 => /usr/local/lib/libfreetype.so.6 (0xb7bef000)
       libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0xb7bc8000)
       libXrender.so.1 => /usr/X11R6/lib/libXrender.so.1 (0xb7bc0000)
       libpthread.so.0 => /lib/i686/libpthread.so.0 (0xb7b5e000)
       librt.so.1 => /lib/i686/librt.so.1 (0xb7b4b000)
       libdl.so.2 => /lib/libdl.so.2 (0xb7b47000)
       libcrypt.so.1 => /lib/libcrypt.so.1 (0xb7b1a000)
       libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0xb7a62000)
       libm.so.6 => /lib/i686/libm.so.6 (0xb7a40000)
       libc.so.6 => /lib/i686/libc.so.6 (0xb7906000)
       libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb78fe000)
       libexpat.so.0 => /usr/lib/libexpat.so.0 (0xb78df000)
       libz.so.1 => /usr/lib/libz.so.1 (0xb78d1000)
       /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000)

今回作成した Linux 版 tcltklib.so では Tcl/Tk 8.4.18 が, RubyInstaller 版では Tcl/Tk 8.5.1 が動くはずです. デフォルトの Tclkit では日本語に対応していないので, encoding を追加して日本語 OK にしてあります. また,Tcl/Tk拡張を追加するテストとして,tkImg拡張を加えています. ですので,Rubyのソースに付属のext/tk/sample/tkextlib/tkimg/demo.rbが きちんと動くはずです.

Ruby/Tk-Kit の tcltklib.so はTclkitと同様の単一ファイル化を行っていますから, Tclkit (Starkit) のツールである SDX (http://www.equi4.com/starkit/sdx.html) を使って,tcltklib.so に一体化されているファイル一覧の参照や操作が可能です. ファイル構造としては OS に依存しないので, Linux 上の SDX で Windows 版の tcltklib.so を操作したり, 逆に Windows 上で Linux 版を操作したりとかも可能なはずです.

これをさらに発展させて, Tclkitの実装となっているVFS (Virtual File System)を RubyからもVFSとして利用できるようにできれば, それなりに便利に使えるかもしれません. 例えば,VFSを展開したディレクトリ上で実行テストを行い, 正常に動くことを確認したらそのVFSを丸ごとwrapして単一バイナリ化して 配布するというようなイメージです. Rubyの標準ライブラリも,必要なものだけをVFS上に置くようにすれば, 配布物はコンパクトにできそうです. exerb等の再発明に過ぎないといわれるかもしれませんが, うまくいけばWindows, Linux, MacOSXで同じに操作,作成できるものになりますし, 少しは嬉しいものにできるかもしれません.

Last modified:2010/05/23 06:43:24
Keyword(s):[Ruby/Tk] [Ruby] [Tclkit]
References:[Ruby/Tk - FrontPage] [SideMenu]