« 推測 - RubyCocoa のユニバーサルバイナリが i386 で動かない | トップページ | RubyCocoa 0.5.0 リリース延期のお知らせ »

2006.10.25

まだ、RubyCocoa のユニバーサルバイナリが i386 で動かない

ダメだった…。3度目の正直なるかっ!?

ええと、0.4.3d2 は大丈夫だったんだよな。じゃあそれの setup 時の出力と比較してみよう。

てきとうに省略。

 (0.4.3d2)
 CompileC .o .m
 DynamicLibrary.LinkUsingFileList /Users/kimuraw/proj/rubycocoa/src/rubycocoa-0.4
 .3d2/framework/build/Default/RubyCocoa.framework/Versions/A/RubyCocoa /Users/kim
 uraw/proj/rubycocoa/src/rubycocoa-0.4.3d2/framework/build/RubyCocoa.build/Defaul
 t/RubyCocoa.build/Objects-normal/LinkFileList
     /usr/bin/gcc-4.0  -o /Users/kimuraw/proj/rubycocoa/src/rubycocoa-0.4.3d2/fra
     mework/build/Default/RubyCocoa.framework/Versions/A/RubyCocoa   "-L/Users/kimura
     w/proj/rubycocoa/src/rubycocoa-0.4.3d2/framework/build/Default" "-L/usr/lib"  "-
     F/Users/kimuraw/proj/rubycocoa/src/rubycocoa-0.4.3d2/framework/build/Default"  -
     filelist /Users/kimuraw/proj/rubycocoa/src/rubycocoa-0.4.3d2/framework/build/Rub
     yCocoa.build/Default/RubyCocoa.build/Objects-normal/LinkFileList  "-framework" "
     Cocoa" "-lruby.1"  "-arch" "ppc" "-dynamiclib" "-compatibility_version" "1" "-cu
     rrent_version" "1" "-undefined" "suppress" "-flat_namespace" "-arch" "ppc" "-arc
     h" "i386" "-Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk"  -install_name "`ech
     o "@executable_path/../Frameworks/RubyCocoa.framework/Versions/A/RubyCocoa" | /u
     sr/bin/sed 's!//*!/!g'`"
 (svn trunk)
 CompileC .o .m normal ppc objective-c com.apple.compilers.gcc.4_0
 Ld /Users/kimuraw/proj/rubycocoa/src/framework/build/Default/RubyCocoa.framework
 /Versions/A/RubyCocoa normal ppc
     cd /Users/kimuraw/proj/rubycocoa/src/framework
  /usr/bin/gcc-4.0 -o /Users/kimuraw/proj/rubycocoa/src/framework/build/Defaul
  t/RubyCocoa.framework/Versions/A/RubyCocoa -L/Users/kimuraw/proj/rubycocoa/src/f
  ramework/build/Default -L/usr/lib -F/Users/kimuraw/proj/rubycocoa/src/framework/
  build/Default -filelist /Users/kimuraw/proj/rubycocoa/src/framework/build/RubyCo
  coa.build/Default/RubyCocoa.build/Objects-normal/ppc/RubyCocoa.LinkFileList -fra
  mework Cocoa -arch ppc -Wl,-single_module -compatibility_version 1 -current_vers
  ion 1 -install_name @executable_path/../Frameworks/RubyCocoa.framework/Versions/
  A/RubyCocoa -Wl,-Y,1455 -dynamiclib -undefined suppress -flat_namespace -arch pp
  c -arch i386 -Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk -lxml2 /usr/lib/lib
  ruby.1.dylib

これらを比較してみると、

  • CompileC では -arch ppc -arch i386 はついてる
  • リンク(DynamicLibrary / Ld) でも、-arch ppc -arch i386 はついてる

これだけ見ると問題なさそうだよなあ。

でも後者のリンク対象で、Objects-normal/ppc とかあるのがヤバそうだよな。対応するような i386 がないし。これまでの手順は Makefile ベースの手順 と同じようにしていた。でも、Xcode ネイティブのプロジェクトにしてるときは、それじゃあマズかったりするんじゃないだろうか?

というわけで、Xcode ネイティブの手順に従ってやってみよう。ビルド設定は次の2つだ。

  • ARCH = ppc i386
  • SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk

これらを設定したかわりに、CFLAGS と LDFLAGS の -arch と -isysroot, -libsysroot は不要になるね。これの setup 時の出力は

 (Xcode ネイティブに対応後)
 CompileC .o .m normal ppc objective-c com.apple.compilers.gcc.4_0
 Ld .build/Objects-normal/ppc/RubyCocoa normal ppc
 CompileC .o .m normal i386 objective-c com.apple.compilers.gcc.4_0
 Ld .build/Objects-normal/i386/RubyCocoa normal ppc
 CreateUniversalBinary RubyCocoa normal "ppc i386"

となる。ppc と i386 でそれぞれ RubyCocoa オブジェクトをビルドし、それを CreateUniversalBinary 時に lipo でファットバイナリにしている。

これでまたダメだと厳しいけど、ここまでくるともう「大丈夫」とは言えないよなあ。

どうでもいい知識が増えたような気がするけど、Xcode ではそれぞれのアーキテクチャ(このケースでは ppc と i386)でビルドフェーズを分けることによって、(BUILD_SETTING)_ppc といった形式のアーキテクチャごとの設定が利用できるようにしているんだろうな。gcc だけでも複数の -arch オプションを渡せば、一発で複数アーキテクチャのオブジェクトがコンパイル、リンクできるのだから。

|

« 推測 - RubyCocoa のユニバーサルバイナリが i386 で動かない | トップページ | RubyCocoa 0.5.0 リリース延期のお知らせ »