きりかノート 3冊め

おあそびプログラミング

まだ、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"

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

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

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