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:[Ruby/Tk - FrontPage] [SideMenu]