バイナリフォーマットMac OS Xは、CFMとMach-Oの2つのアプリケーションバイナリフォーマットをサポートします。 Mach-Oは、Mac OS Xのネイティブなオブジェクトフォーマットで、gccコンパイラとXcodeによってサポートされています。 CFM(Code Fragment Manager)は、以前のMac OSが稼動するPower Macintoshコンピュータで使われていたレガシーフォーマットであり、Metrowerks CodeWarriorなどのコンパイラによってサポートされています。 Mac OS X用のCarbonコンポーネントは、Mach-OコードかCFMコードとしてビルドすることができますが、CFMの使用は現在は推奨されていません。さらに重要なことは、Mach-Oは、インテルベースのMacintosh上でネイティブに実行できる、唯一のバイナリフォーマットであるということです。 何か新しいコンポーネントをビルドする場合は、Xcodeの最新版(2.1以上)で作業を始めて、Universal Binaryコンポーネント(PowerPCベースのMacintoshとインテルベースのMacintoshの両方で実行が可能なコードを含んだ単一のコンポーネントバイナリ)をビルドします。古いコンポーネントをアップデートする場合は、まず、Xcodeの最新版に移行し、それから必要に応じてコンポーネントコードをアップデートする必要があります。Xcodeに移行するデベロッパ向けの各種ドキュメントのリンクについては、このドキュメントの最後にある「参考資料」のセクションを参照してください。 注: CodeWarriorには、Mach-Oバイナリをビルドする機能はありますが、PowerPCベースのMacintoshコンピュータとインテルベースのMacintoshコンピュータの両方でネイティブに実行できるUniversal Binaryはビルドできません。 Mach-OコンポーネントMac OS X用のMach-Oコンポーネントは、データフォークにダイナミックライブラリ(dylib)を持ち、従来のMac OS用のメカニズムとよく似たメカニズムを使ってビルドされますが、以下の点が異なります。
リスト1: Mach-OとWindowsのエントリポイント
// PowerPCベースとインテルベースのMacとWindowsのコードエントリポイント
resource 'dlle' (256) {
"MyComponentDispatch"
};
リスト2: Mach-O PowerPCベースのMacの'thng'リソース
// 拡張'thng'テンプレート
#define thng_RezTemplateVersion 1
#include <Carbon/Carbon.r>
#include <QuickTime/QuickTime.r>
resource 'thng' (256) {
kSomeComponentType, // タイプ
'DEMO', // サブタイプ
'DEMO', // 製造元
0, // componentHasMultiplePlatformsを使用
0,
0,
0,
'STR ', // 名前のタイプ
128, // 名前ID
'STR ', // Infoタイプ
129, // Info ID
0, // アイコンタイプ
0, // アイコンID
kMyComponentVersion, // バージョン
componentHasMultiplePlatforms + // 登録フラグ
myComponentRegistrationFlags,
0, // アイコンファミリのリソースID
{
kMyComponentFlags,
'dlle', // エントリポイントはシンボル名'dlle'リソースで検索される
256, // 'dlle'リソースのID
platformPowerPCNativeEntryPoint, // アーキテクチャ
};
};
リスト3: Mach-OインテルベースのMacの'thng'リソース
// 拡張'thng'テンプレート
#define thng_RezTemplateVersion 1
#include <Carbon/Carbon.r>
#include <QuickTime/QuickTime.r>
resource 'thng' (256) {
kSomeComponentType, // タイプ
'DEMO', // サブタイプ
'DEMO', // 製造元
0, // componentHasMultiplePlatformsを使用
0,
0,
0,
'STR ', // 名前のタイプ
128, // 名前ID
'STR ', // Infoタイプ
129, // Info ID
0, // アイコンタイプ
0, // アイコンID
kMyComponentVersion, // バージョン
componentHasMultiplePlatforms + // 登録フラグ
myComponentRegistrationFlags,
0, // アイコンファミリのリソースID
{
kMyComponentFlags,
'dlle', // エントリポイントはシンボル名'dlle'リソースで検索される
256, // 'dlle'リソースのID
platformIA32NativeEntryPoint, // アーキテクチャ
};
};
Universal Binaryコンポーネントアーキテクチャ設定ターゲットアーキテクチャの設定を、 図1: Xcodeのアーキテクチャターゲット設定
ComponentPlatformInfoしかし、Component Managerはバイナリファイルのアーキテクチャではなく、コンポーネントの
現在のMach-O Universal Binaryコンポーネントのビルドも同じで、リスト4に示すように、単に リスト4: Universal Binaryコンポーネントの'thng'リソース
// File : My_Component.r
// 拡張'thng'テンプレート
#define thng_RezTemplateVersion 1
#if TARGET_REZ_CARBON_MACHO
#include <Carbon/Carbon.r>
#include <QuickTime/QuickTime.r>
#else
#include "ConditionalMacros.r"
#include "MacTypes.r"
#include "Components.r"
#include "QuickTimeComponents.r"
#include "ImageCompression.r"
#endif
resource 'thng' (256) {
kSomeComponentType, // タイプ
'DEMO', // サブタイプ
'DEMO', // 製造元
0, // componentHasMultiplePlatformsを使用
0,
0,
0,
'STR ', // 名前のタイプ
128, // 名前ID
'STR ', // Infoタイプ
129, // Info ID
0, // アイコンタイプ
0, // アイコンID
kMyComponentVersion, // バージョン
componentHasMultiplePlatforms + // 登録フラグ
myComponentRegistrationFlags,
0, // アイコンファミリのリソースID
{ // コンポーネントのプラットフォーム情報 ----------------------
#if TARGET_OS_MAC
#if TARGET_REZ_CARBON_MACHO
#if !(TARGET_REZ_MAC_PPC || TARGET_REZ_MAC_X86)
#error "Platform architecture not defined!"
#endif
#if TARGET_REZ_MAC_PPC
kMyComponentFlags,
'dlle',
256,
platformPowerPCNativeEntryPoint, // PowerPCベースのMacintosh
#endif
#if TARGET_REZ_MAC_X86
kMyComponentFlags,
'dlle',
256,
platformIA32NativeEntryPoint, // インテルベースのMacintosh
#endif
#else
#error "TARGET_REZ_CARBON_MACHO should be defined."
#endif
#elif TARGET_OS_WIN32
#if TARGET_REZ_WIN32
kMyComponentFlags,
'dlle',
256,
platformWin32,
#else
#error "TARGET_REZ_WIN32 should be defined."
#endif
#else
#error "I have no idea what you're trying to do!"
#endif
};
};
リソースファイル定義コンポーネントリソースファイルをセットアップする簡単な方法の1つは、適切な リスト5に、マスタリソースファイルの内容がどのようなものかを示します。このファイルがどのようにして適切な定義を設定し、 図2: 単一のマスタリソースファイルの追加
リスト5: マスタリソースファイル
// File : My_Component_MachO.r
//
//
// Mac OS X Mach-O Component: Set TARGET_REZ_CARBON_MACHO to 1
//
// In the target settings of your Xcode project, add one or both of the
// following defines to your OTHER_REZFLAGS depending on the type of component
// you want to build:
//
// PPC only: -d ppc_$(ppc)
// x86 only: -d i386_$(i386)
// Universal Binary: -d ppc_$(ppc) -d i386_$(i386)
//
// Windows Component: Set TARGET_REZ_CARBON_MACHO to 0
// ---------------------------------------------------
// Set to 1 == building Mac OS X
#define TARGET_REZ_CARBON_MACHO 1
#if TARGET_REZ_CARBON_MACHO
#if defined(ppc_YES)
// PPCアーキテクチャ
#define TARGET_REZ_MAC_PPC 1
#else
#define TARGET_REZ_MAC_PPC 0
#endif
#if defined(i386_YES)
// x86アーキテクチャ
#define TARGET_REZ_MAC_X86 1
#else
#define TARGET_REZ_MAC_X86 0
#endif
#define TARGET_REZ_WIN32 0
#else
// Windows上でビルドしているはず
#define TARGET_REZ_WIN32 1
#endif
// 個々のコンポーネントリソースファイルをインクルード
#include "My_Component.r"
その他のRezフラグ
図3: Rezの定義のセットアップ
ResourcererツールMathemaesthetics, Inc.のResourcererは、QuickTimeコンポーネントデベロッパ向けの、優れたユーティリティです。これを使って、リソースの表示と編集や、 図4: Resourcererで表示したUniversal Binaryコンポーネントの'thng'
バンドルコンポーネントバンドルとは、関連のあるリソースを1つの場所に集めた、ファイルシステム上のディレクトリです。Xcodeでは、コンポーネントを、バンドルとしても単一ファイルのdylibとしてもビルドすることができます。しかし、QuickTimeコンポーネントは、Mac OS Xバンドルとしてビルドする必要があります。単一ファイルのMach-Oコンポーネントdylibのビルドは推奨されません。 単一ファイルのバイナリとして設定された古いコンポーネントがある場合は、ターゲットを更新し、コンポーネントバンドルをビルドする必要があります。さらに、古いツールを使用している場合は、Mach-Oバイナリのリソースフォークにリソースをビルドしないようにする必要があります。 コンポーネントバンドルをビルドするには、Xcodeの「New Project」ダイアログから「Carbon Bundle」を選択するか、または既存のXcodeプロジェクトにターゲットを追加している場合は「New Target」ダイアログから「Loadable Bundle」を選択します。 lipo
注: リスト6: lipoを使用したUniversal Binaryについての情報の取得
toronto:~ ed$ lipo -detailed_info /ElectricImageUniversal.component/Contents/MacOS/ElectricImageUniversal
Fat header in: /ElectricImageUniversal.component/Contents/MacOS/ElectricImageUniversal
fat_magic 0xcafebabe
nfat_arch 2
architecture ppc
cputype CPU_TYPE_POWERPC
cpusubtype CPU_SUBTYPE_POWERPC_ALL
offset 4096
size 128176
align 2^12 (4096)
architecture i386
cputype CPU_TYPE_I386
cpusubtype CPU_SUBTYPE_I386_ALL
offset 135168
size 132084
align 2^12 (4096)
RosettaRosettaは、PowerPCバイナリをインテルベースのMacintosh上で実行させる翻訳プロセスです。このテクノロジーにより、アプリケーションを非ネイティブバイナリとして実行することが可能になっています。しかしRosettaでは、ネイティブコードと翻訳されたコードを1つのプロセスに混在させることはできません。従来のMac OSの「Mixed Mode(混在モード)」テクノロジーに相当する機能は提供していません。 PowerPC専用のコンポーネントは、インテルベースのMacintoshでネイティブに実行するUniversal Binaryアプリケーションには読み込まれません。つまり、コンポーネントをUniversal Binaryとしてビルドする必要があります。そうしないとユーザは、ネイティブアプリケーション内で非ネイティブのコンポーネントを必要とするコンテンツを扱うことができなくなります。 逆に、Rosettaの下で実行しているアプリケーションは必ず、x86バージョンではなく、PowerPCバージョンのUniversal Binaryコンポーネントを読み込みます。つまり、メディア再生のパフォーマンスは、Universalでないアプリケーションでは制限される可能性があります。 重要: QuickTimeコンポーネントのデベロッパは、Universal Binaryバージョンのコンポーネントをビルドすることが推奨されます。これにより、期待されるタスクをネイティブアプリケーション内から実行する際に問題に直面するといった状況を回避することができます。 ファイルの拡張子と場所コンポーネントファイルには、ファイル名拡張子「.component」を付け、「/Library/QuickTime」ディレクトリに置きます。 サンプルコードElectric Image Component - このサンプルは、このドキュメントで概要を示したテクニックの実例で、5つのQuickTimeコンポーネント、すなわち、Graphics Importer、Graphics Exporter、Movie Importer、Movie Exporter、Image Decompressorのビルド方法を示します。これらのコンポーネントが連携して、Electric Image形式の画像ファイルをQuickTimeで扱えるようにします。 参考資料ドキュメント改訂履歴
掲載日: 2005-07-21 | ||||||||||||
|