Join MDN and developers like you at Mozilla's View Source conference, 12-14 September in Berlin, Germany. Learn more at https://viewsourceconf.org

XPCOM ABI

XPCOM ABIは、XPCOMコンポーネントのバイナリインターフェースです。スクリプト言語(JavaScriptなど)によって書かれたXPCOMコンポーネントは、特に改変をしなくてもプラットフォーム(WindowsやOS Xなど)を越えて動作させられますが、コンパイルが必要な言語(C++など)で書かれたコンポーネントの場合、異なるプラットフォームで動かすためには再コンパイルが必要です。コンパイルされたXPCOMコンポーネントは多くの場合、「バイナリ」や「ネイティブ」などと呼ばれます。

一つのバイナリXPCOMコンポーネントは、すべてのプラットフォームで利用できる.xptファイルと、特定のプラットフォーム用で且つ特定のABIを持ったDLL(Windowsでは.dll、Linuxでは.so)から成ります。このABIを利用するアプリケーションだけが、このXPCOMコンポーネントを利用することができます。簡単に言えば、特定のABI用にビルドされたXPCOMコンポーネントは、同じABI用にビルドされたFirefox、Thunderbird、その他のXULRunnerアプリケーションに対してのみ互換性があります。

ABIのネーミング

各々のABIは、以下の形式の[TARGET_XPCOM_ABI]文字列によって名付けられています。:

{CPU_ARCH}-{TARGET_COMPILER_ABI}

{CPU_ARCH}[Platforms]は、以下のいずれかのCPUのアーキテクチャを意味します:

  • x86 - i386およびそれ以降のシリーズ(x86-64 CPUの32bitモードも含みます)
  • ppc - PowerPCシリーズ
  • Alpha - Alphaシリーズ
  • x86_64 - 64bitモードのAMD64/EMT64シリーズ(32bitモードの場合はx86と見なされます)
  • sparc - SPARCシリーズ
  • ia64 - Itaniumシリーズ

{TARGET_COMPILER_ABI}[Platforms]は、以下のいずれかのコンパイラのABIを意味します:

  • msvc - Microsoft Visual C++
  • n32 - IRIX 6 C++ Compiler
  • gcc2 - GNU C++ Compiler 2.x
  • gcc3 - GNU C++ Compiler 3.x or 4.x
  • sunc - Sun C++ Compiler
  • ibmc - IBM C++ Compiler

例:

  • Intel Pentiumプロセッサ用のGNU C++ Compiler 4.0.0によってビルドされたFirefoxは、x86-gcc3というXPCOM ABIを持ちます。

XPCOM ABI文字列は、nsIXULRuntimeを使うことによってプログラムから取得できます。あなたのFirefoxあるいはThunderbirdのABIを取得するには、エラーコンソールを開いて(ツール | エラーコンソールから開けます)以下のJavaScriptコードを実行してください:

Components.classes["@mozilla.org/xre/app-info;1"]
          .getService(Components.interfaces.nsIXULRuntime)
          .XPCOMABI

もしCPUのアーキテクチャもしくはC++コンパイラのいずれかが未知の場合は、アプリケーションはXPCOM ABI文字列を持たず、それを取得しようと試みた際にはNS_ERROR_NOT_AVAILABLEというエラーを起こすでしょう。それは特徴的なABIだと思われますが、しかし私たちはそれに対して付ける名前を持っていません。

註: Platforms
これは利用可能なCPUアーキテクチャやコンパイラのABIの完全なリストではありません。最新の情報は常に、ビルドシステムの中を探索することで見つけられるでしょう。

註: TARGET_XPCOM_ABI
Mozillaのビルドシステムでは、XPCOM ABIを保持している変数はTARGET_XPCOM_ABIです。(これは内部の詳細情報で、拡張機能の開発者にとっては無関係です。)

Extension Installation

アプリケーション(例:Firefox)がサポートするABIの名前は、ビルド時に埋め込まれます。その後、アプリケーションはサードパーティ製のバイナリXPCOMコンポーネントの互換性を調べるためにその値を使います。

互換性チェックとの共通点は、拡張機能のインストールの間にあります。もし、ある拡張機能がバイナリXPCOMを提供する場合、インストール定義においてそれらのXPCOM ABIが宣言されているべきです。拡張機能の作者は、XPCOMコンポーネントをサポートしているマシンすべてのためにそれぞれビルド(コンパイル)して、プラットフォームごとのサブディレクトリに入れ、すべてのビルドを一つのXPIの中にパッケージングすることができます。拡張機能がインストールされる時、アプリケーションはそれ自身のABIに最も適したコンポーネントのビルドを選択します。もし適合するビルドが見つからなければ、その拡張機能は互換性がないと見なされ、アプリケーションはインストールを中断するでしょう。

もし、(ABIのネーミングで説明しているとおり、CPUアーキテクチャかC++コンパイラのいずれかが不明であった結果として)そのアプリケーションがXPCOM ABI文字列を持っていない場合、あなたはインストール定義などに記述するプラットフォーム名としてOSの名前を(XPCOM ABIを付けずに)使うべきです。

ドキュメントのタグと貢献者

タグ: 
 このページの貢献者: Piro
 最終更新者: Piro,