はじめにXcode IDEは、Universal Binaryのビルドの複雑さをほとんど意識させない、簡素化されたビルドシステムを提供しています。ソースファイルを実際にビルドしてリンクするための各種設定、環境変数、コマンドは、あらかじめ設定された暗黙的なビルド設定があり、XcodeのUIからも簡単に調節できます。 多くのオープンソースプロジェクトは、ビルド時の設定スクリプトを使用して、プログラムをコンパイルし実行する環境(たとえば、CPUの型、ワード順序、ポインタサイズなどのマシン情報)と、システムで利用できるヘッダファイルとライブラリを決定します。このスクリプトは、通常1つまたは複数のmakefileとヘッダファイルを作成します。makefileにはコンパイラオプションとリンカオプションが含まれており、Xcode IDEの自動化された設定を利用することはできません。このプロセスで生成されたヘッダファイルには、通常、機能の有無を確認するための定数が含まれます。たとえば、 #ifdef HAVE_UNISTD_H # include <unistd.h> #endif という具合です。ここで この方法は従来のコンパイル環境でうまく動作し、多くのオープンソースプロジェクトをMac OS Xへ比較的簡単に移植することを可能にしています。しかし、設定環境は、Universal Binaryのような状況を念頭に置いて計画されたものではないため、問題が生じます。 注:このテクニカルノートでは、インテルベースのMacintoshへ既存のプロジェクトを移行するために必要なコード変更については説明しません。必要なコード変更の詳細については『Universal Binaryプログラミングガイド』を参照してください。 この問題に対処し、Universal Binaryを生成する方法は主に2つあります。その2つの方法を、設定スクリプトの使用方法を示すことを目的として作られた“Hello, World”プログラムである「GNU Hello」パッケージを使用して説明します。「GNU Hello」のソースはFree Software Foundationからダウンロードできます。 Universal Binaryのための設定最初の方法は、環境変数
env CFLAGS="-O -g -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc" \
LDFLAGS="-arch i386 -arch ppc" ./configure --prefix=${HOME}/Hello --disable-dependency-tracking
./configure --help helpオプションにより、configureの使い方を説明するメッセージと、configureが処理方法を認識している引数が表示されます。 注:インテルベースのMacintoshシステムでは、ライブラリはすでにユニバーサルでありインテルアーキテクチャとPowerPCアーキテクチャをサポートするため、 configureを実行しmakeでビルドすると、結果として file ./src/hello 出力結果は、以下のようになります。 src/hello: Mach-O fat file with 2 architectures src/hello (for architecture i386): Mach-O executable i386 src/hello (for architecture ppc): Mach-O executable ppc 実行ファイルは、PowerPCベースとインテルベースの両方のMacintoshでネイティブに実行できます。 複数のビルドのマージ「GNU Hello」プログラムはこれまで書かれた“Hello, World”プログラムの中でもっとも複雑なものの1つですが、それでも比較的単純なプログラムです。バイト順序、ワードサイズ、またはポインタサイズを意識することはなく、設定プロセスが、マシンターゲットに基づいた設定ファイルを生成する実行ファイルを生成することもありません。オープンソースプロジェクトのすべてがこのように単純ではありません。そうしたプロジェクトに対しては、 上記のプロセスを使用して「GNU Hello」プログラムの設定とビルドができなくても、(ほとんどの場合複数のマシンで)プログラムを複数回設定し、ビルドすることで、Unibersal Binaryを生成することができるはずです。 インテルベースとPowerPCベース両方のMacintoshで、以下のようにプログラムを設定し、ビルドします。
./configure --prefix=${HOME}/Hello
make
結果の lipo -create hello-intel hello-ppc -output hello 前述のように、 file hello 結果は次のように報告されます。 hello: Mach-O fat file with 2 architectures hello (for architecture i386): Mach-O executable i386 hello (for architecture ppc): Mach-O executable ppc もっと複雑なプロジェクトの場合は、各設定をインストールし、Mach-Oファイル(ライブラリと実行ファイル)のリストを生成し、それぞれに対して 注意すべき点この方法を使用しても注意すべき点がいくつかあります。 まず、すべてのアーキテクチャは同じ方法で設定される必要があります。あるアーキテクチャの設定で実行時ファイルが 次に、このような状況は避けられない場合があります。たとえば、設定プロセスが実行時ディレクトリで(“ppc”や“i386”や“i686”などの)プロセッサタイプを使用している場合などです。バイナリリリースのためのプロジェクトをビルドする時には、インストールプロセスで作成されたツリーを手動で調査し、すべてのバリエーションがファイナルリリースにあるか、またはシンボリックリンクを使用してこれをエミュレートしていることを確認する必要があります(例: ドキュメント改訂履歴
掲載日: 2006-10-05 | ||||||||||||
|