Ruby mswin32拡張ライブラリィMSVCR80版ビルド覚書き No.3

  • Tcl/Tk

こいつもバイナリは普通にMSVCRTを使うので、ソースからビルドすることにする。
sourceforge.net Tcl Files
今回はバージョン8.5.7のソースを使わせて頂くことにする。
tcl857-src.zip
tk857-src.zip

ビルドには順番がある。Tkはビルド時からTclのソースを必要とするので、Tcl -> Tkの順でビルドする必要がある。

    • Tcl

ソースコードを展開するとwinディレクトリが出来るので、その下のMakefile.vcを使用する。

e:\tcl8.5.7\win>nmake -f makefile.vc release OPTS=threads
e:\tcl8.5.7\win>nmake -f makefile.vc install INSTALLDIR=e:\tcl 
    • Tk

同様にwinディレクトリが出来るが、こちらのビルドでは上記Tclのソースコードを展開したディレクトリをオプションで指定する

e:\tk8.5.7\win>nmake -f makefile.vc release TCLDIR=e:\tcl8.5.7 OPTS=threads
e:\tk8.5.7\win>nmake -f makefile.vc install INSTALLDIR=e:\tcl 

あと、Tkのインストール先はTclと同じディレクトリとしている。

また、オプション"OPTS=threads"は重要である。
rubyはデフォルトでpthread有効状態でビルドされるが、Tcl/Tkはデフォルトではマルチスレッドサポートが無効になっている。従ってデフォルトままビルドするとrubyとTcl/Tkのスレッドサポートに違いが出てしまうので、必ず明示的にスレッドサポートを有効にする必要がある。
なお、スレッドサポートを有効にしてビルドするバイナリには"tcl85t.dll" "tk85t.dll"等と"t"サフィックスがつくのでそれと分る。

ここまでで、e:\tcl\下にRubyの拡張ライブラリィで必要なファイルが作られるので、extconf.rb実行時に指定してMakefileを作ることができる。

E:\ruby-1.8.7-p160\ext\tk>ruby extconf.rb --with-winsock2 --with-tk-include=e:\tcl\include --with-tk-lib=e:\tcl\lib --enable-tcl-thread

ここでも"--enable-tcl-thread"でtclのスレッドサポートを有効にしている。がしかし、ここで問題が。
上述したがTcl/Tkはスレッドサポートを有効にするとバイナリの名前が変わる("t"がサフィクスに付く)ので、このままではextconf.rbがスレッドサポートが有効になったバイナリを探すことが出来ずに失敗する。なので、extconf.rbを書き換えて今回対象となる "tk85t.dll" "tcl85t.dll"が対象に掛かるようにする必要があった。

extconf.rb :116
:
    versions = %w[8.6 8.5t 8.4 8.3 8.2 8.1 8.0 7.6] #8.5tが対象となるように
:

ベタな方法だが、他にスマートな方法も知らないので取りあえずこれで逃げることにする。
これで、Tcl/Tk MSVCR80版のビルドと対応するrubyの拡張ライブラリィのインストールが出来た。

上手くいったかどうかはまだテストしていないが、今日はこれだけでお腹いっぱい。