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

Technical Note TN2163
ユニバーサルなI/O Kitドライバの作成

このテクニカルノートでは、ユニバーサルドライバを作成するための、Xcode I/O Kitカーネルドライバプロジェクトの設定手順について説明します。また、ユニバーサルドライバをロードする際によく見られる問題についても説明します。





はじめに

ユニバーサルなI/O Kitドライバの作成は、ユニバーサルアプリケーションの作成によく似ていますが、ドライバのバイナリ互換性に影響する可能性のある決定的な違いがあります。このテクニカルノートでは、ユニバーサルドライバを作成するための、Xcode I/O Kitカーネルドライバプロジェクトの設定手順と、ユニバーサルドライバに関してよく見られるバイナリ互換性の問題について説明します。

先頭に戻る

どのバージョンのXcodeとMac OS X SDKを使用するか

Xcode 2.2.1は、ユニバーサルなI/O Kitドライバをビルドするのに使用できる最も古いバージョンのXcodeです。

インテルベースのMacコンピュータ向けのビルド

インテル側のI/O Kit KEXTは、GCC 4.0、およびXcode 2.2.1以降に含まれるユニバーサルなMac OS X 10.4uを使ってビルドする必要があります。これによって、Mac OS X 10.4.4以降で動作するインテルベースのMacintoshコンピュータでドライバをロードし、実行できるようになります。

先頭に戻る

PowerPCベースのMacコンピュータ向けのビルド

PowerPC側のKEXTは、サポートしたいMac OS Xの最も古いバージョンのMac OS X SDKを使ってビルドする必要があります。

PowerPCベースのMacコンピュータ向けのビルド: 10.4より前のMac OS Xがターゲット

バージョン10.4以前のMac OS X用のビルドの場合は、GCC 3.3を使ってビルドする必要もあります。

先頭に戻る

PowerPCベースのMacコンピュータ向けのビルド: Xcode 2.2.xまたはXcode 2.3を使用してMac OS X 10.4.xをターゲットとする

Xcode 2.2.xまたは2.3を使用している場合、PowerPCベースシステムのMac OS X 10.4.xをターゲットとするI/O Kitドライバは、ユニバーサルでないMac OS X 10.4.0 SDKを使ってビルドする必要があります。これは、両方のアーキテクチャでユニバーサルな10.4u SDKを使用してビルドできる、ユニバーサルアプリケーションとは異なります。

10.4.0 SDKは単体インストーラとしてApple Developer ConnectionのWebサイトから入手できます。SDKインストーラのRead Meファイルがあります。

10.4.0 SDKは、Mac OS X 10.4のインストールDVDに含まれているXcode 2.0のインストーラからもインストールできます。「Cross Development」の下のXcodeカスタムインストールの中にあります。

先頭に戻る

PowerPCベースのMacコンピュータ向けのビルド: Xcode 2.4以降を使用してMac OS X 10.4.xをターゲットとする

Xcode 2.4以降には、もう1つの選択肢があります。つまり、PowerPCアーキテクチャ向けにビルドするときに、プリプロセッサシンボルKPI_10_4_0_PPC_COMPATを定義します。このプリプロセッサシンボルを定義すると、10.4u (Universal) SDKでも10.4.0 SDKを使用したのと同じ結果をもたらします。そのため、PowerPCおよびインテルアーキテクチャに同じSDKを使用できます。

先頭に戻る

ユニバーサルなI/O KitカーネルドライバのためのXcodeプロジェクト設定

適切なバージョンのSDKとコンパイラの使用は、Xcodeのアーキテクチャ別ビルド設定で容易に実現できます。

PowerPC専用のXcode I/O Kitドライバプロジェクトをユニバーサルプロジェクトへ変換するには、まずプロジェクト内のすべてのターゲットがネイティブなXcodeターゲットであることを確認します。これはXcodeでプロジェクトを開くことで確認できます。「プロジェクト」メニューを選択し、「プロジェクト内のすべてのターゲットをネイティブにアップグレード」が有効かどうか確認します。有効になっていた場合は、プロジェクトのバックアップコピーを作成し、このコマンドを使って旧来のターゲットをすべてネイティブに変換します。

次に、プロジェクト設定またはターゲットビルド設定に以下の変更を行います。プロジェクト内のすべてのターゲットに設定を適用する場合は、プロジェクト設定を変更してください。特定のターゲットからユニバーサルなKEXTを作成する場合は、ターゲット設定を変更してください。

  1. アーキテクチャ」を「ppc i386」に設定します 「アーキテクチャ」の文字列をダブルクリックし、「PowerPC」と「Intel」のチェックボックスを選択します。

  2. SDK Path」および「VALID_ARCHS」の設定を削除するには、そのオプションを選択し、ウインドウの下部にある「-」ボタンをクリックします。

  3. SDKROOT_i386」および「SDKROOT_ppc」というカスタム設定を追加します。それぞれの値として、各アーキテクチャでビルドに使用するSDKのパスを設定します。「SDKROOT_i386」には/Developer/SDKs/MacOSX10.4u.sdkを設定し、「SDKROOT_ppc」は、/Developer/SDKs/MacOSX10.2.8.sdkのように、サポートしたいMac OS Xのメジャーリリースでも最も古いバージョンに合うSDKを表す必要があります。

  4. GCC_VERSION_i386」および「GCC_VERSION_ppc」という設定を追加し、それぞれのアーキテクチャのビルドで使うコンパイラのバージョンを指定します。「GCC_VERSION_i386」は、4.0以上に設定する必要があります。Mac OS X 10.4以前のバージョンをサポートする場合は、「GCC_VERSION_ppc」を3.3に設定する必要があります。

  5. Xcode 2.4以降を使用していて、PowerPC側のKEXTがMac OS X 10.4.xをターゲットにしている場合は、PowerPCアーキテクチャ向けにビルドする場合にのみGCCに渡すコンパイラフラグを指定するPER_ARCH_CFLAGS_ppc設定を追加します。PER_ARCH_CFLAGS_ppcの値を-DKPI_10_4_0_PPC_COMPATに設定します。

  6. Mac OS Xデプロイメントターゲット」を「コンパイラのデフォルト」に設定します。

  7. MACOSX_DEPLOYMENT_TARGET_i386」および「MACOSX_DEPLOYMENT_TARGET_ppc」という設定を追加します。これらの設定は、10.210.4のようにMac OS Xのメジャーリリースのバージョン番号の値にする必要があります。10.3.9など、ソフトウェアのアップデートバージョンは指定しません。「MACOSX_DEPLOYMENT_TARGET_i386」を10.4以降に設定し、「MACOSX_DEPLOYMENT_TARGET_ppc」を、サポートするMac OS Xの最も古いメジャーリリースに設定する必要があります。

先頭に戻る

ユニバーサルなI/O Kitドライバのよくある問題

ユニバーサルドライバのビルド後に直面する問題のほとんどは、ロードする際に生じます。たとえば、kextloadから以下のようなエラーが報告されることがあります。

com.mycompany.driver.MyDriverClass is not compatible with its superclass,
<superclass name> superclass changed?

ほとんどのロード時エラーの原因は、ドライバをビルドするときに間違ったSDKを使用したことです。たとえば、PowerPC側のドライバはMac OS X 10.3.xをターゲットにしているのに、10.4u SDKを使用してビルドした場合などです。「どのバージョンのXcodeとMac OS X SDKを使用するか」に前掲したSDKバージョン情報を参照してください。次に、「ユニバーサルなI/O KitカーネルドライバのためのXcodeプロジェクト設定」で前述したように、Xcodeプロジェクトをセットアップしていることを確認します。

先頭に戻る

ドキュメント改訂履歴

日付メモ
2006-08-25Xcode 2.4に合わせて更新。
2006-02-02よくある落とし穴を回避しながら、ユニバーサルなI/O Kitカーネルドライバをビルドする方法。

掲載日: 2006-08-25




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.