[PR]NI50餅攵渺:FSヤI

goto TOP


VS 2005/2008 ProfessionalでPGOを使ってFirefoxを作成する



for Firefox 2

ちょーっとイレギュラーな方法かもしれないけど、これが一番お手軽かも。

  1. .mozconfigでobjディレクトリを指定しておく。
  2. .mozconfigに.pgd/.pgcファイルを作成するためのオプションを追加
    export LDFLAGS="-LTCG:PGI"
    mk_add_options LDFLAGS="-LTCG:PGI"
  3. Firefoxをmake
  4. Firefoxを実行&終了してpgcファイルを作成。このとき、なるべく普通に使ってプロファイルを作ること。下手にベンチマークなどを走らせると、ベンチマークに特化して早くて普段使いが遅くなるかもしれない
  5. 生成されたpgcファイルを対応するpgdファイルのあるフォルダにコピー
  6. $(OBJ)/config/autoconf.mkの中にある-LTCG:PGIを-LTCG:PGUに変更。.mozconfigでは無いことに注意。
  7. 実際にパッケージに含まれているexeとdllを、objディレクトリから削除して、そのファイルのあったディレクトリにおいてあるMakefileを元にmakeを実行。サンプルとして以下のようなシェルスクリプトをくんでおくといいかも。
    #!/bin/sh
    
    _OBJDIR=/c/mozbuild/deerpark151/obj
    
    # change PGI to PGO of config/autoconf.mk
    mv $_OBJDIR/config/autoconf.mk $_OBJDIR/config/autoconf.mk.pgi
    sed 's/PGI/PGU/g' $_OBJDIR/config/autoconf.mk.pgi > $_OBJDIR/config/autoconf.mk
    
    # nspr4.dll
    cd $_OBJDIR/nsprpub/pr/src
    rm nspr4.dll
    make
    
    # plc4.dll
    cd $_OBJDIR/nsprpub/lib/libc/src
    rm plc4.dll
    make
    
    # plds4.dll
    cd $_OBJDIR/nsprpub/lib/ds
    rm plds4.dll
    make
    
    # xpcom.dll
    cd $_OBJDIR/xpcom/stub
    rm xpcom.dll
    make
    
    # xpcom_compat.dll
    cd $_OBJDIR/xpcom/obsolete
    rm xpcom_compat.dll
    make
    
    # xpcom_core.dll
    cd $_OBJDIR/xpcom/build
    rm xpcom_core.dll
    make
    
    # xpicleanup.exe
    cd $_OBJDIR/xpinstall/cleanup
    rm xpicleanup.exe
    make
    
    # xpistub.dll
    cd $_OBJDIR/xpinstall/stub
    rm xpistub.dll
    make
    
    # xpinstall.dll
    cd $_OBJDIR/xpinstall/src
    rm xpinstall.dll
    make
    
    # myspell.dll
    cd $_OBJDIR/extensions/spellcheck/myspell/src
    rm myspell.dll
    make
    
    # spellchk.dll
    cd $_OBJDIR/extensions/spellcheck/src
    rm spellchk.dll
    make
    
    # npnul32.dll
    cd $_OBJDIR/modules/plugins/samples/default/windows
    rm npnul32.dll
    make
    
    # js3250.dll
    cd $_OBJDIR/js/src
    rm js3250.dll
    make
    
    # jsd3250.dll
    cd $_OBJDIR/js/jsd
    rm jsd3250.dll
    make
    
    # firefox.exe
    cd $_OBJDIR/browser/app
    rm firefox.exe
    make
    
    # root...
    cd $_OBJDIR/../mozilla
    
    なお、NSS関連のモジュールは作り直す必要はありません。
  8. この方法でも=LTCG:PGOだとタイムスタンプが違う!と怒られます。

for Firefox 3

手順そのものはFx2と同じ。なお、公式でもPGO buildはサポートされているのでそちらのスタイルでもokかもしれない。
なお、mozcrt19.dllを使う場合は環境変数LIBにmozcrt19用msvcrt.libのパスを先頭に追加するのを、環境変数PATHにmozcrt19.dllのパスを追加しておくのを忘れずに。

サンプルバッチ

#!/bin/sh

date +"%H:%M" > compiletime.txt

BUILD_OFFICIAL=1
export BUILD_OFFICIAL
MOZCONFIG=/c/mozbuild/fx3/mozilla/.mozconfig.u9
export MOZCONFIG
cp .mozconfig.u9 .mozconfig

_OBJDIR=/c/mozbuild/fx3/obj9u
_MOZCRT_W='c:\mozbuild\fx3\obj9u\memory\jemalloc\src\build\intel;'
_MOZCRT_U=$_OBJDIR'/memory/jemalloc/src/build/intel'

# we must use mozcrt!!
LIB=$_MOZCRT_W$LIB
LIBPATH=$_MOZCRT_W$LIBPATH
PATH=$PATH':'$_MOZCRT_U

# change PGI to PGO of config/autoconf.mk
mv $_OBJDIR/config/autoconf.mk $_OBJDIR/config/autoconf.mk.pgi
sed 's/PGI/PGU/g' $_OBJDIR/config/autoconf.mk.pgi > $_OBJDIR/config/autoconf.mk

# AccessibleMarshal.dll
cd $_OBJDIR/accessible/public/msaa
rm AccessibleMarshal.dll
cd ..
make

# browserdirprovider.dll
cd $_OBJDIR/browser/components/dirprovider
rm browserdirprovider.dll
make

# brwsrcmp.dll
cd $_OBJDIR/browser/components/build
rm brwsrcmp.dll
make

# browser/app firefox.exe
cd $_OBJDIR/browser/app
rm firefox.exe
make

# js3250.dll
cd $_OBJDIR/js/src
rm js3250.dll
make

# npnul32.dll
cd $_OBJDIR/modules/plugins/samples/default/windows
rm npnul32.dll
make

# nspr4.dll
cd $_OBJDIR/nsprpub/pr/src
rm nspr4.dll
make

# plc4.dll
cd $_OBJDIR/nsprpub/lib/libc/src
rm plc4.dll
make

# plds4.dll
cd $_OBJDIR/nsprpub/lib/ds
rm plds4.dll
make

# sqlite3.dll
cd $_OBJDIR/db/sqlite3/src
rm sqlite3.dll
make all

# xpcom.dll
cd $_OBJDIR/xpcom/stub
rm xpcom.dll
make

# xpicleanup.exe
cd $_OBJDIR/xpinstall/cleanup
rm xpicleanup.exe
make

# xul.dll
cd $_OBJDIR/toolkit/library
rm xul.dll
make

# root...
cd $_OBJDIR/../mozilla

date +"%H:%M" >> compiletime.txt
echo start - end :
cat compiletime.txt

旧手順

時間がかかるけど、ある意味確実。

  1. .mozconfigでobjディレクトリを指定しておく。これは手順7で*.dllと*.exeを一括削除するのに便利だから。
  2. .mozconfigに.pgd/.pgcファイルを作成するためのオプションを追加
    export LDFLAGS="-LTCG:PGI"
    mk_add_options LDFLAGS="-LTCG:PGI"
  3. Firefoxをmake
  4. Firefoxを実行&終了してpgcファイルを作成。このとき、なるべく普通に使ってプロファイルを作ること。下手にベンチマークなどを走らせると、ベンチマークに特化して早くて普段使いが遅くなるかもしれない
  5. 生成されたpgcファイルを対応するpgdファイルのあるフォルダにコピー
  6. .mozconfigのLDFLAGSを変更
    export LDFLAGS="-LTCG:PGU"
    mk_add_options LDFLAGS="-LTCG:PGU"
    ここで注意すべき点は-LTCG:PGOを使わないこと。-LTCG:PGOだとエラーが発生してmakeが途中で止まる(注)
  7. 再makeの前に、objディレクトリ以下にある全ての*.dllと*.exeを削除する。そうしておかないと、dllとexeが再作成されず、-LTGC:PGIが有効になったままになる
  8. 再make


本当は-LTCG:PGOなんだけど、Fxのmakeの場合、一部ライブラリが強制的にrebuildされるためpgdファイルで保持されているタイムスタンプと再作成されたライブラリのタイムスタンプが変わってしまい、エラーとなる。しょうがないのでPGUを使ってます。
旨くDLLとEXEをリンクしている部分だけを実行できればいいんだけどね。
あと、PGOを使った最適化はしゃれにならんほどメモリを食う。1GBじゃ足りなかったよ....。2GBは欲しいかも。


goto TOP


[PR]TO:Iw祝烱銑悦x