Apple Developer Connection
高度な検索
Member Login ログイン | ご入会 ADC連絡先

Technical Note TN2137
“configure”ベースのオープンソースプロジェクトからのUniversal Binaryのビルド

このテクニカルノートでは、いくつかの“configure”ベースのオープンソースプロジェクトからUniversal Binaryをビルドする方法を説明します。





はじめに

Xcode IDEは、Universal Binaryのビルドの複雑さをほとんど意識させない、簡素化されたビルドシステムを提供しています。ソースファイルを実際にビルドしてリンクするための各種設定、環境変数、コマンドは、あらかじめ設定された暗黙的なビルド設定があり、XcodeのUIからも簡単に調節できます。

多くのオープンソースプロジェクトは、ビルド時の設定スクリプトを使用して、プログラムをコンパイルし実行する環境(たとえば、CPUの型、ワード順序、ポインタサイズなどのマシン情報)と、システムで利用できるヘッダファイルとライブラリを決定します。このスクリプトは、通常1つまたは複数のmakefileとヘッダファイルを作成します。makefileにはコンパイラオプションとリンカオプションが含まれており、Xcode IDEの自動化された設定を利用することはできません。このプロセスで生成されたヘッダファイルには、通常、機能の有無を確認するための定数が含まれます。たとえば、

#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif

という具合です。ここで#define HAVE_UNISTD_Hは生成されたconfig.hファイルに含まれています。

この方法は従来のコンパイル環境でうまく動作し、多くのオープンソースプロジェクトをMac OS Xへ比較的簡単に移植することを可能にしています。しかし、設定環境は、Universal Binaryのような状況を念頭に置いて計画されたものではないため、問題が生じます。

注:このテクニカルノートでは、インテルベースのMacintoshへ既存のプロジェクトを移行するために必要なコード変更については説明しません。必要なコード変更の詳細については『Universal Binaryプログラミングガイド』を参照してください。

この問題に対処し、Universal Binaryを生成する方法は主に2つあります。その2つの方法を、設定スクリプトの使用方法を示すことを目的として作られた“Hello, World”プログラムである「GNU Hello」パッケージを使用して説明します。「GNU Hello」のソースはFree Software Foundationからダウンロードできます。

先頭に戻る

Universal Binaryのための設定

最初の方法は、環境変数CFLAGSLDFLAGSに適切な値を渡し、configureで単純に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--disable-dependency-trackingオプションを指定すると、複数の-archターゲットに対応することができない、gccの組み込み依存関係生成コードが使用されなくなります。お使いの構成スクリプトが--disable-dependency-trackingオプションを正しく処理するかどうか確認するには、次のようにconfigureに対してhelpオプションを使います。

./configure --help

helpオプションにより、configureの使い方を説明するメッセージと、configureが処理方法を認識している引数が表示されます。

注:インテルベースのMacintoshシステムでは、ライブラリはすでにユニバーサルでありインテルアーキテクチャとPowerPCアーキテクチャをサポートするため、CFLAGSには-arch i386 -arch ppcオプションのみ指定できます。PowerPCベースのMacintoshでは、MacOSX10.4u SDKを使う必要があります。

configureを実行しmakeでビルドすると、結果として./src/helloにUniversal Binaryができます。これは、fileコマンドを使用してファイルタイプを問い合わせることで確認できます。

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つですが、それでも比較的単純なプログラムです。バイト順序、ワードサイズ、またはポインタサイズを意識することはなく、設定プロセスが、マシンターゲットに基づいた設定ファイルを生成する実行ファイルを生成することもありません。オープンソースプロジェクトのすべてがこのように単純ではありません。そうしたプロジェクトに対しては、lipoコマンドを使用する、もう1つの方法があります。

上記のプロセスを使用して「GNU Hello」プログラムの設定とビルドができなくても、(ほとんどの場合複数のマシンで)プログラムを複数回設定し、ビルドすることで、Unibersal Binaryを生成することができるはずです。

インテルベースとPowerPCベース両方のMacintoshで、以下のようにプログラムを設定し、ビルドします。

./configure --prefix=${HOME}/Hello
make

結果のsrc/helloプログラムを1つのマシンへコピーします。たとえば、PowerPCベースのMacintoshの/tmphello-intelhello-ppcの名前でそれぞれコピーします。その後、lipoコマンドを使って2つを結合します。

lipo -create hello-intel hello-ppc -output hello

前述のように、fileコマンドを使ってファイルの内容を確認できます。

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ファイル(ライブラリと実行ファイル)のリストを生成し、それぞれに対してlipoコマンドを実行する必要が生じる場合があります。

先頭に戻る

注意すべき点

この方法を使用しても注意すべき点がいくつかあります。

まず、すべてのアーキテクチャは同じ方法で設定される必要があります。あるアーキテクチャの設定で実行時ファイルが/usr/local/etcにあると想定されていながら、別のアーキテクチャの設定では/etcにあると想定されていると、実行時の動作は異なってしまいます。

次に、このような状況は避けられない場合があります。たとえば、設定プロセスが実行時ディレクトリで(“ppc”や“i386”や“i686”などの)プロセッサタイプを使用している場合などです。バイナリリリースのためのプロジェクトをビルドする時には、インストールプロセスで作成されたツリーを手動で調査し、すべてのバリエーションがファイナルリリースにあるか、またはシンボリックリンクを使用してこれをエミュレートしていることを確認する必要があります(例:/usr/local/myproj/etc/i386/input.confおよび/usr/local/myproj/etc/ppc/input.confはどちらも存在する必要があります。またはシンボリックリンクを使用して、/usr/local/myproj/etc/i386/usr/local/myproj/etc/ppcをポイントしているはずです)。

先頭に戻る

ドキュメント改訂履歴

日付メモ
2006-10-05LDFLAGSのセクションを修正。--disable-dependency-trackingに対応していない構成スクリプトの処理に関する情報を追加。
2005-08-25いくつかの既存の“configure”ベースのオープンソースパッケージをUniversal Binaryとしてビルドするいくつかの方法を記述。

掲載日: 2006-10-05




Did this document help you?
Yes: Tell us what works for you.

It’s good, but: Report typos, inaccuracies, and so forth.

It wasn’t helpful: Tell us what would have helped.