永井@知能.九工大です.

From: Yutaka Hara <yutaka.hara / gmail.com>
Subject: [ruby-dev:41896] Re: failed to build ext/tk of ruby-1.9.2-rc2 on Mac OS X
Date: Thu, 29 Jul 2010 21:26:50 +0900
Message-ID: <AANLkTi=H3H66b2P+rqtdR8dqUcBfCffr95MBCThkkVuF / mail.gmail.com>
> > % ./configure --enable-shared=true --with-opt-dir=/opt/local --with-tcl-dir=/opt/local --with-tk-dir=/opt/local --disable-tcltk-framework
> > という指定で大丈夫なのではないかと思います.
> > # 最後の --disable-tcltk-framework は無くても良い気がします.
> 上記の指定でうまく行きました。ありがとうございました。
> (--disable-tcltk-frameworkは無くて大丈夫でした)

良かったです.
Mac OS X の場合は,標準添付版 (framework),ActiveTcl 版 (framwork),
MacPorts 版 (/opt/local),/usr or /usr/local への独自インストール版
という四つ (加えて X11 版か Aqua 版か) は
少なくとも考慮しなければいけないということなのでしょうね.
とはいえ,どういう優先順位やデフォルト選択をすべきやら???(^_^;

> 一応、エラーになるケース(./configure --enable-shared=true --with-opt-dir=/opt/local)
> について調査してみました。

ありがとうございます.助かります.

> make中に
> --
> Use [tclConfig.sh,tkConfig.sh] ==
> ['/System/Library/Frameworks/Tcl.framework/tclConfig.sh','/System/Library/Frameworks/Tk.framework/tkConfig.sh']
> Use MacOS X Frameworks.
> --
> と表示されるので、tkConfig.shの位置は正しく検出できているようです。
> 本来ならば、Tcl・Tk共にFrameworkのものが使われそうに見えます。
> 
> しかし、このtkConfig.shを見ると、TK_INCLUDE_SPECが定義されていませんでした。
> (TK_XINCLUDESは定義されていて、
> '-I/System/Library/Frameworks/Tk.framework/Versions/8.4/Headers' になっています。)
> このせいで、tkだけ/opt/localのものが使われてしまうようです。
> 
> /System以下のtclConfig.shとtkConfig.shを以下にアップロードしました。
> * http://gist.github.com/497979
> 何かの参考になれば幸いです。

う〜む.
Aqua 版にもかかわらず,X11 版用の TK_XINCLUDES を使用しているのですね.
コンパイルが止まってしまう問題は,以下のパッチで大丈夫だと思います.
検索の優先順位をどうするかについては判断がつかないので
保留とさせてください.

Index: extconf.rb
===================================================================
--- extconf.rb	(revision 28788)
+++ extconf.rb	(working copy)
@@ -1224,11 +1224,11 @@
       puts("Can't find X11 libraries. So, can't make tcltklib.so which is required by Ruby/Tk.")
       exit
     end
+  end
 
-    if TkConfig_Info['TK_XINCLUDES'] &&
-        !TkConfig_Info['TK_XINCLUDES'].strip.empty?
-      $INCFLAGS << " " << TkConfig_Info['TK_XINCLUDES'].strip
-    end
+  if TkConfig_Info['TK_XINCLUDES'] &&
+      !TkConfig_Info['TK_XINCLUDES'].strip.empty?
+    $INCFLAGS << " " << TkConfig_Info['TK_XINCLUDES'].strip
   end
 
   use_X

-- 
永井 秀利  (nagai / ai.kyutech.ac.jp)
九州工業大学大学院情報工学研究院知能情報工学研究系知能情報メディア部門助教