Ruby/Tk - FrontPage  Index  Search  Changes  PageRank  RSS  Login

RubyTk - Ruby/Tk-Kit Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

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 と
Ruby'''''Installer 1.9.1p378rc2 で使えるように作成したものとを
テスト用に公開することにします.
良かったら試してみていただけるとうれしく思います.

* ruby 1.8.8dev (ruby_1_8) 用に作成:
** Tcl/Tk8.4.18 : {{attach_anchor(tcltklib.so-ruby188dev_20100313rev26900_i686-linux)}}
** include BLT and all extensions of Active'''''Tcl-8.4 : {{attach_anchor(tcltklib.so-ruby188dev_20100313rev26900_i686-linux-with-ActiveTcl-BLT)}}

* ruby 1.9.2dev (trunk) 用に作成:
** Tcl/Tk8.4.18 : {{attach_anchor(tcltklib.so-ruby192dev_20100313rev26900_i686-linux)}}
** Tcl/Tk8.5.7  : {{attach_anchor(tcltklib.so-tk8.5.7-ruby192dev_20100313rev26900_i686-linux)}}

* Ruby'''''Installer 1.9.1p378rc2 用に作成 (tested on Windows XP):
** Ruby/Tk environment (please extract at Ruby'''''Installer's lib/ruby/1.9.1) : {{attach_anchor(rubytk-simple-w-img_ext-for-RubyInstaller191.zip)}}{{attach_anchor(rubytk-simple-w-img_ext-20100523-for-RubyInstaller191.zip)}}
** simple tcltklib.so (standard Tcl/Tk only)  : {{attach_anchor(tcltklib.so-simple-20100520-ruby191-mingw-for-RubyInstaller191)}}{{attach_anchor(tcltklib.so-simple-20100523-ruby191-mingw-for-RubyInstaller191)}}
** include some Tcl/Tk extensions : {{attach_anchor(tcltklib.so-w-exts-20100520-ruby191-mingw-for-RubyInstaller191)}}{{attach_anchor(tcltklib.so-w-exts-20100523-ruby191-mingw-for-RubyInstaller191)}}
** tkutil.so : {{attach_anchor(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 が,
Ruby'''''Installer 版では 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で同じに操作,作成できるものになりますし,
少しは嬉しいものにできるかもしれません.