いつだかにActiveTclを8.5.9にアップデートしてからRuby-1.9.2-p180をビルドし直したらext/tkのコンパイルに失敗していたことに最近気づいた。
昨日の夜からいろいろ調べたら、どうやら要因が2個あるっぽいことがわかった。
一つ目は、ActiveTcl側の変更でextconf.rb でのライブラリチェックに失敗していたこと。二つ目は、同じActiveTcl側の変更でVC++2010のヘッダーでdefineの競合がおきていたこと。
どちらも、C:\Tcl\lib\tclConfig.sh にある「-Dintptr_t=int -Duintptr_t=unsigned\ int」が悪さをしているよう。そういう意味では根本は1つか。
一つ目の方は、ここのパッチをあてる。ただし、そのままでは通らないので少し修正必要。要は途中に半角スペースのある「-Duintptr_t=unsigned\ int」をそのままコマンドラインオプションで指定するのではなくヘッダーファイルで指定するようにする変更。
2つ目の方は、c:\Program Files\Microsoft Visual Studio 10.0\VC\include\crtdefs.hの以下の部分。
#ifndef _INTPTR_T_DEFINED #ifdef _WIN64 typedef __int64 intptr_t; #else typedef _W64 int intptr_t; #endif #define _INTPTR_T_DEFINED #endif #ifndef _UINTPTR_T_DEFINED #ifdef _WIN64 typedef unsigned __int64 uintptr_t; #else typedef _W64 unsigned int uintptr_t; #endif #define _UINTPTR_T_DEFINED #endif
さっきの-Dで定義済みだとtypedefで同じ名前の型を定義することになってしまうので、とりあえずtclConfig.shに「-D_INTPTR_T_DEFINED=1 -D_UINTPTR_T=1」を追加。
これで無事コンパイルが通った。めでたしめでたし。