はじめに
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の標準ライブラリに入っている。
Ruby/Tk 参考Links
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特有のバグだったもよう
バグだった模様。バッチを発見。
- Japanese user list of the Ruby programming language () https://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/55165
しかし、パッチの当て方がわからない。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はレベル高すぎて使いこなせる気がしない。。。