Building XULRunner with Python

by 2 contributors:

このページでは、Python拡張をXULRunnerで使えるようにビルドする方法について述べており、これは大抵の場合 accessibility プロジェクトの経験に基づいとても使いやすい記述が可能になります。 XULRunner を参照の事。

Python 拡張が有効な XULRunner ではいつもの JavaScript に加えて python スクリプトでも DOM や XPCOM にアクセスする事が可能です。これは Python の機能やモジュールにアクセスを提供し、Active State で pyXPCOM の仕事をしている Mark Hammond氏 のビルドがあります。XPCOM コンポーネントも Python で作れるようになります。

(2007年5月)現在、Python は標準では有効ではないため、そのためカスタムビルドの Mozilla が必要です。このページでは余計な挑戦やエラーがない事を期待した紹介を提供します。また、開発者向けドキュメントの source codebuilding 、また PyXPCOM を読んでおきましょう。

XULRunner と Python の組み合わせは accessibility プロジェクト にとって良いプラットフォームとなる事を約束し、 Jambu Alternative Input と IAccessible2 テストツールの両方で利用しています。特に興味深いのはPython の comtypes パッケージを通して MSAA や IAccessible2 にアクセスする事です。

Development Machine Setup

最初の警告としては、ZoneAlarm がメモリリークを起こして、かなりの誤ったエラーによってビルドマシンがクラッシュします。これが問題だと疑うようであれば、アンインストールするべきでしょう。また、ウイルススキャンソフトの常駐モニタリングもオフにしておかないとビルドが遅くなるでしょう。

もちろん XP が動いているPCでは最終のサービスパック及びパッチを当てておきます。

Microsoft C++ コンパイラは必須ですが、しかしながら現在フリーなバージョンである Visual Studio 8 Express (MSVC8) ではなく、正式には長く存在しないであろう Visual Studio .NET 2003 (MSVC71) を使うべきでしょう。これは XULRunner は Python と同じ C のバージョンでビルドされなければならず、また Python 2.5 では MSVC71 が使われているからです。それぞれで同じC ランタイムライブラリ MSVCRT?.DLL を使わなければならず、そうでなければクラッシュしてしまうでしょう。他の手段としては Mozilla と同様に MSVC8 で Python をビルドするという方法がありますが、これは問題があるでしょう。また オープンソースの MinGW を正しい MSVC ランタイムと一緒に使う事も可能ですが、これはあまり推奨されません。全てのサービスパックを当ててください、MSVC71 SP 1 が現在利用可能です。適用したプラットフォームSDKも必要です、MSVC71 には .NET Framework SDK 1.1 が相当します。

最終の Mozilla Build system が簡単に使えます。Python のディストリビューションを含んだ python25\python-2.5.msi をインストールします。これはビルドには必要ありませんが、Python パッケージをインストールしたときの Windows のレジストリのエントリを探すので後で便利になります。

Building

バッチファイル start-msvc71.bat はビルドコンソール(MinGW プロジェクトの MSys)を起動するのに使います。もし空のフォルダにチェックアウトしようと考えているなら、CVSROOT 環境変数を設定して反映する必要があります。

set CVSROOT=:pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot

mozilla プロジェクトのディレクトリ (例えば C:\projects\mozilla もしくは msys では /c/projects/mozilla ) を作成したら、 次のような .mozconfig ファイルを作成します。注意として、これは完結していて、.mozconfig ファイルに示しているもの以外のプロジェクトのチェックアウトは要求しないという事です。これはリリースビルドを指定するのに適していて、これ自体で XULRunner をデバッグするのはほとんど適していません。これは trunk (もしくは最終)のコードをCVS から使うため、たぶん不安定でしょう。

mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/../obj-xulrunner
mk_add_options MOZ_CO_PROJECT=xulrunner
ac_add_options --enable-application=xulrunner
ac_add_options --enable-extensions=python,default
ac_add_options --disable-javaxpcom
ac_add_options --disable-activex
ac_add_options --disable-activex-scripting
ac_add_options --disable-tests
ac_add_options --enable-optimize 

最初に必要なソースコードを全てチェックアウトしてビルドするには、存在していない client.mk ファイルを実行します。

cd /c/projects
cvs -d :pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot co mozilla/client.mk
cd mozilla
make -f client.mk

次に CVS からアップデートしてからビルドするには、次を使います

cd /c/projects/mozilla
make -f client.mk

client.mk 自身をチェックアウトもできます

ビルドするだけなら、チェックアウトをせずに次を使います。

make -f client.mk build

また、client.mk の他のオプションを確認してください。

ビルドされた XULRunner は c:\projects\obj-xulrunner\dist\bin\xulrunner.exe に見つかるでしょう。

Using Python in XUL applications

開発中は次の文字列を prefs.js に追加します。

pref("browser.dom.window.dump.enabled", true);
pref("javascript.options.showInConsole", true);
pref("javascript.options.strict", true);
pref("nglayout.debug.disable_xul_cache", true);
pref("nglayout.debug.disable_xul_fastload", true);

Python を HTML の <script> タグでは type="application/x-python" 属性を使います。DOM のスクリプティングは JavaScript ととてもよく似ています。例えば

def onLoad():
    btnTest = document.getElementById("btnTest")
    btnTest.addEventListener('command', onTest, False)

def onTest():
    window.alert('Button activated')
        
window.addEventListener('load', onLoad, False)

一つ分かった事はモジュールを検索する標準の Python のパスに xulrunner の実行ディレクトリを import して明確にインクルードしており、そのディレクトリは XULRunner を起動した現在のディレクトリとなります。しかしながら、動作しているXULアプリケーションの他のどのパスもインクルードしません。いくつかの回避方法を見つける必要があります。

未処理例外は xulrunner -jsconsole を使って開ける JavaScript Error Console で表示されます。一つのソリューションは try .... except: print_exc() を任意のイベントハンドラの周りにおいて traceback を stdout に吐き出し、python console を使ってその出力を捕まえる事です。JSconsole はコードからも開けます、(Javascriptの)例として

function openJavaScriptConsole() {
   var wwatch = Components.classes["@mozilla.org/embedcomp/window-watcher;1"]
                         .getService(Components.interfaces.nsIWindowWatcher);
   wwatch.openWindow(null, "chrome://global/content/console.xul", "_blank",
                    "chrome,dialog=no,all", null);
}


// dump to the js console (xulrunner -jsconsole)
function jsdump(str)
{
  Components.classes['@mozilla.org/consoleservice;1']
            .getService(Components.interfaces.nsIConsoleService)
            .logStringMessage(str);
}

function jserror(str)
{
    Components.utils.reportError(str);
}

最後のヒントとしてはタスクマネージャーを使ってクラッシュした後の xulrunner のゾンビプロセスをチェックする事です。そのゾンビプロセスは開いた古いコードや問題点が残っており、変更を加えた後に xulrunner を再度起動させます。

Deploying

ターゲットとするマシンにはPythonがインストールされていなければなりません。たぶん最終的には XULRunner は py2exepyInstaller のようなもので作られる最小の Python のインストーラと一緒になるでしょう。それまでは単に dist\bin フォルダと XUL アプリケーションを配布する事になります。決してアプリケーションの python モジュールにある .pyo をコピーしないでください。これはターゲットマシン上でエラーを引き起こすでしょう。

これは python のテストをするバッチファイルはこんな風になります

rem Check Python 2.5 installed
reg query "HKLM\SOFTWARE\Python\PythonCore\2.5" > nul 2>&1 || reg query "HKCU\SOFTWARE\Python\PythonCore\2.5" > nul 2>&1
if errorlevel 1 (
    echo Python 2.5 was not found. Please install it.
    echo Exiting...
    pause
    exit /b 1
    )

start "XULRunner with Python" "%moz_bin%\xulrunner.exe" -app application.ini %opts%
exit /b 0

主な情報は XULRunner:Deploying_XULRunner_1.8 をご覧ください。

Sample

Python 機能を含む XULRunner アプリケーションのサンプルがこちらにあります。これには pyXPCOM のテストと Alex Badea による基本的な Python console を含みます。

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

Contributors to this page: ethertank, Btm
最終更新者: ethertank,