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の拡張ライブラリィのインストールが出来た。
上手くいったかどうかはまだテストしていないが、今日はこれだけでお腹いっぱい。