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 で使えるように作成したものとを テスト用に公開することにします. 良かったら試してみていただけるとうれしく思います.
- ruby 1.8.8dev (ruby_1_8) 用に作成:
- Tcl/Tk8.4.18 : tcltklib.so-ruby188dev_20100313rev26900_i686-linux
- include BLT and all extensions of ActiveTcl-8.4 : tcltklib.so-ruby188dev_20100313rev26900_i686-linux-with-ActiveTcl-BLT
- ruby 1.9.2dev (trunk) 用に作成:
- Tcl/Tk8.4.18 : tcltklib.so-ruby192dev_20100313rev26900_i686-linux
- Tcl/Tk8.5.7 : tcltklib.so-tk8.5.7-ruby192dev_20100313rev26900_i686-linux
- RubyInstaller 1.9.1p378rc2 用に作成 (tested on Windows XP):
- Ruby/Tk environment (please extract at RubyInstaller's lib/ruby/1.9.1) : rubytk-simple-w-img_ext-20100523-for-RubyInstaller191.zip
- simple tcltklib.so (standard Tcl/Tk only) : tcltklib.so-simple-20100523-ruby191-mingw-for-RubyInstaller191
- include some Tcl/Tk extensions : tcltklib.so-w-exts-20100523-ruby191-mingw-for-RubyInstaller191
- tkutil.so : tkutil.so-20100518-ruby191-mingw-for-RubyInstaller191
ダウンロードしたファイルの名前を 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で同じに操作,作成できるものになりますし, 少しは嬉しいものにできるかもしれません.
Keyword(s):[Ruby/Tk] [Ruby] [Tclkit]
References:[SideMenu] [Ruby/Tk - FrontPage]