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で同じに操作,作成できるものになりますし,
少しは嬉しいものにできるかもしれません.
単一バイナリ化した 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) :
** simple tcltklib.so (standard Tcl/Tk only) :
** include some Tcl/Tk extensions :
** 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で同じに操作,作成できるものになりますし,
少しは嬉しいものにできるかもしれません.