Terminal で 10.2/10.3 用にクロスコンパイル

(2006/09/10 記)

 ./configure; make でビルドするフリーソフトを Mac OS 10.4 で改造していたのだが、古いバージョンでも動くバイナリを作ろうと思って SDK を使ったクロスコンパイルにとりかかったら、ハマってしまった。解決してしまえば非常に簡単だったのだが、たぶんすぐにまた忘れてしまうのでメモ。

 なお、以下の手順は、普通のコマンドラインツールをビルドする時のもので、Core Foundation とか Carbon とかを使うときどうなるかは確かめていません。念のため。

1. 10.3.9 SDK

 SDK を使うためには、gcc (4.0) にオプション -isysroot /PATH/TO/SDK を与えればいいのだが、Xcode 2.1 に付属の gcc-4.0 だとうまくいかないことがある。2.4 に上げてしまえば大丈夫。

export CFLAGS="-isysroot /Developer/SDKs/MacOSX10.3.9.sdk" ./configure make

 参考:pass -isysroot to linker on darwin。Xcode 2.1 付属の gcc-4.0 ではリンク時に -Wl,-syslibroot,/PATH/TO/SDK が必要だったのだが、これと -isysroot /PATH/TO/SDK を同時に与えるとリンク時に syslibroot: multiply specified というエラーになってしまう。

2. 10.2.8 SDK

 10.2.8 SDK は gcc 3.3 を使わないといけない(これに気づくのに半日かかった)。次のようにする。

export CC=gcc-3.3 export NEXT_ROOT=/Developer/SDKs/MacOSX10.2.8.sdk export C_INCLUDE_PATH=$NEXT_ROOT/usr/include ./configure make

3. おまけ

 できあがった実行形式のバイナリがどのダイナミックライブラリをリンクしているかは、otool を使って調べることができる。

$ otool -L xxx_for_10_4 xxx_for_10_4: /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 88.1.6) $ otool -L xxx_for_10_3 xxx_for_10_3: /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 71.1.3) $ otool -L xxx_for_10_2 xxx_for_10_2: /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 63.0.0)

4. 注意

 2. で C_INCLUDE_PATH を指定するのはいいのだが、このパスにヘッダファイルがないと /usr/local/include とか /usr/include を見に行っちゃうみたい。これは問題を起こすことがあるかもしれない。

$ export NEXT_ROOT=/Developer/SDKs/MacOSX10.2.8.sdk $ export C_INCLUDE_PATH=$NEXT_ROOT/usr/include $ gcc-3.3 -v resolvtest.c ...(snip)... #include "..." search starts here: #include <...> search starts here: /Developer/SDKs/MacOSX10.2.8.sdk/usr/include /usr/local/include /usr/include/gcc/darwin/3.3 /usr/include End of search list. ...(snip)...

 1. だとそうはならず、-isysroot で指定したディレクトリの中でちゃんと閉じてくれる。

$ gcc-4.0 -v -isysroot /Developer/SDKs/MacOSX10.3.9.sdk resolvtest.c ...(snip)... #include "..." search starts here: #include <...> search starts here: /Developer/SDKs/MacOSX10.3.9.sdk/usr/lib/gcc/powerpc-apple-darwin8/4.0.1/include /Developer/SDKs/MacOSX10.3.9.sdk/usr/include /Developer/SDKs/MacOSX10.3.9.sdk/System/Library/Frameworks /Developer/SDKs/MacOSX10.3.9.sdk/Library/Frameworks End of search list. ...(snip)...