はじめに

Ruby tkを利用しようとしたところ、エラーがでて使えなかった。

% irb
irb(main):001:0> require 'tk'
LoadError: cannot load such file -- tk
        from /home/tsu-nera/.rbenv/versions/2.1.0/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /home/tsu-nera/.rbenv/versions/2.1.0/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from (irb):1
        from /home/tsu-nera/.rbenv/versions/2.1.0/bin/irb:11:in `<main>'

この解決方法についてメモします。

Ruby/TkはTcl/TkのツールキットをRubyから利用するライブラリ。

Rubyの標準ライブラリに入っている。

tk-devを入れてみる

もともと自分のPCに入っていたRubyはrbenvを使ってビルドした。 どうも、Ubuntu(Mint)環境では、tk-devをあらかじめインストールしておかないと、Rubyのビルド時にRuby/Tkがビルドされないようだ。

ということで、

sudo apt-get install tk-dev

他にも、いろいろツールが追加でインストールされる。

libxss-dev tcl tcl-dev tcl-lib tcl8.5-dev tk tk-lib tk8.5 tk8.5-dev tk8.5-lib x11proto-scrnsaver-dev

これで、Rubyを再インストールしてみる。

% rbenv uninstall ruby-2.1.0 % rbenv install ruby-2.1.0 -v

これでOKだろうとおもったけど、やっぱりエラーした。

ビルドログをみると、やっぱりスキップされてしまう。

configuring tk
...........
check struct members..
check libraries....
Use ActiveTcl libraries (if available).
Search tclConfig.sh and tkConfig.sh.....................
WARNING: found "/usr/lib/tclConfig.sh", but cannot find valid Tcl library for the tclConfig.sh. So, ignore it.

WARNING: found "/usr/lib/tkConfig.sh", but cannot find valid Tk library for the tkConfig.sh. So, ignore it.
..........
Fail to find [tclConfig.sh, tkConfig.sh]
Use X11 libraries (or use TK_XINCLUDES/TK_XLIBSW information on tkConfig.sh).

Search tcl.h..
Search tk.h..Search Tcl library..........
Search Tcl library..........
Warning:: cannot find Tcl library. tcltklib will not be compiled (tcltklib is disabled on your Ruby. That is, Ruby/Tk will not work). Please check configure options.

Can't find proper Tcl/Tk libraries. So, can't make tcltklib.so which is required by Ruby/Tk.
If you have Tcl/Tk libraries on your environment, you may be able to use them with configure options (see ext/tk/README.tcltklib).
At present, Tcl/Tk8.6 is not supported. Although you can try to use Tcl/Tk8.6 with configure options, it will not work correctly. I recommend you to use Tcl/Tk8.5 or 8.4.
Failed to configure tk. It will not be installed.
configuring tk/tkutil
Failed to configure tk/tkutil. It will not be installed.
configuring win32
Failed to configure win32. It will not be installed.
configuring win32ole
Failed to configure win32ole. It will not be installed.

Ubuntu特有のバグだったもよう

バグだった模様。バッチを発見。

しかし、パッチの当て方がわからない。30分で挫折。

途方にくれていたが、ズバリ解決する記事を発見!

sudo apt-get remove tk-dev
sudo apt-get install tk8.4-dev tcl8.4-dev

sudo ln -sfn /usr/lib/tcl8.4/tclConfig.sh /usr/lib/tclConfig.sh
sudo ln -sfn /usr/lib/tk8.4/tkConfig.sh /usr/lib/tkConfig.sh

このとおりに実施したら、なんとなくうまくいったっぽい。

configuring tk
........
check struct members..
check libraries....
Use ActiveTcl libraries (if available).
Search tclConfig.sh and tkConfig.sh...............................
Valid [tclConfig.sh, tkConfig.sh] are found in [["/usr/lib", "/usr/lib"]]
Use [tclConfig.sh, tkConfig.sh] == ["/usr/lib/tclConfig.sh", "/usr/lib/tkConfig.sh"]
Use X11 libraries (or use TK_XINCLUDES/TK_XLIBSW information on tkConfig.sh).

Find Tcl/Tk libraries. Make tcltklib.so which is required by Ruby/Tk.
configuring tk/tkutil

成功、よかった ^_^;

% irb
irb(main):001:0> require 'tk'
=> true

ついでに拡張tkも

tkはrequireできたけど、拡張tkをrequireするとエラーする。

require "tkextlib/tkimg/png"
require "tkextlib/tkimg/jpeg"

これは、libtk-imgを入れることで解決。

sudo apt-get install libtk-img

tkextlib/tileがつかえない!

tkextlib/tileをrequireすると、エラーした。tk-tileを入れる。

sudo apt-get install tk-tile

それでもエラーする!これもバグみたい。tcltk 8.5をインストールすればいいよとのこと。

*Tk and Tile with Tk8.5 - Ruby Forum

結局8.5を頑張って入れる

tileを利用するには、8.5を入れる必要がある。 しかし、パッチを当てても自分の環境ではうまくいかない。 こまりあぐねていたが、以下のエントリを発見。

Ruby 1.8でも tcltk8.5をいれようという内容。これを真似してRuby2.0でも入れてみる。

tcl/tk8.5をインストール。

sudo apt-get install tcl8.5-dev tk8.5-dev

tk-devをいれていなかったらこれもインストール。(いろいろやりすぎて、どれが正解なのかわからない)

シンボリックリンクも作成。

sudo ln -sfn /usr/lib/tcl8.5/tclConfig.sh /usr/lib/tclConfig.sh
sudo ln -sfn /usr/lib/tk8.5/tkConfig.sh /usr/lib/tkConfig.sh

Ruby公式サイトから2.0をダウンロード。

あとはコンパイルするのみ。

cd ruby2.0.0-p353/ext/tk
CONFIGURE_ARGS='--with-tcl-include=/usr/include/tcl8.5/ --with-tcllib=tcl8.5 --with-tklib=tk8.5' ruby extconf.rb
make

rubyはシステムのrubyを利用してコンパイルする。 mkmfというライブラリをつかっているので、ruby-devか入っていなかったら入れておく。

これで、コンパイルに成功すると、tcl/tk8.5版の tcltklib.soができるはず!

これを、既存のtcltklib.soと置き換える。

cd ~/.rbenv/versions/2.0.0-p353/lib/ruby/2.0.0/x86_64-linux
sudo mv tcltklib.so tcltklib.so.bak
suod cp (コンパイルしたtcltklib.so) .

これで、tkextlib/tileがつかえるようになった。

irb(main):004:0* require 'tkextlib/tile'
=> true

なんか、Mint 64bit環境ででRuby/tkをつかうのがめちゃくちゃ大変なのだけれども。ボクには ruby/tkはレベル高すぎて使いこなせる気がしない。。。