2013年6月1日土曜日

Chromiumをビルドする(ninja編)

2015/01/28 追記: ビルド方法が大幅に変わったので、新たに記事を書きました。


今回は、WindowsでChromiumをninjaというビルドシステムでビルドする方法を、メモ程度に書きます。

2014/05/27 追記

Chromium 35以上では、toolchain + ninjaによるビルドがデフォルトとなりました。
"gclient runhooks"コマンドでビルドに必要なtoolchainが自動的にダウンロードされるようになっています。
ほか、/ShowIncludes消去がいらなくなった、など手順が一部異なります。
以下、参考のためそのまま残しておきます。


ninjaってなに?

Googleが(Chromeのために?)開発したビルドシステムです。
通常のビルドシステム(UNIX系のmakeや、WindowsであればVisual StudioのMSBuildなど)よりも コード編集とコンパイルを繰り返し行う際の効率をよくするために作られたそうです。
高速なビルドを謳うために、並列ビルドをはじめ、MSBuildでは(不具合回避のため)デフォルトで無効になっている インクリメンタルリンクを有効にしたりしています。
Chromiumの開発でビルドにかかる時間が大幅に短縮され、デバッグ効率が非常によくなります。

ninjaの詳細は、NinjaBuild(英語)へ。

toolchainを使うとninjaビルド用の設定を自動的に行うそうです。
(なお、筆者はtoolchainを一度も使ったことがありません)

環境構築、ソースコード取得

環境構築、ソースコード取得は、前回書いた方法と同じ方法で構築されていることを前提とします。
Chromiumをビルドする(Visual C++ 2010 Express編)

ビルド手順

ソースコードがW:\Chromium\src以下に格納されていることを前提します。
なお、この例はライブラリをスタティックにしない(つまりDLLを作る)、Debugビルドです。

  1. Visual C++ コマンドプロンプトを開く。
  2. 以下、順にコマンドを実行します。
    cd /d W:\chromium
    set GYP_DEFINES=component=shared_library
    set GYP_GENERATORS=ninja
    cd src
    python build\gyp_chromium
    ninja -C out\Debug chrome.exe
    
  3. ビルド完了までひたすら待つ。

リリースビルドでは、以下の手順のようになると思いますが、 筆者はデバッグビルドでしか使用していないため、試していません。

  1. Visual C++ コマンドプロンプトを開く。
  2. 以下、順にコマンドを実行します。
    cd /d W:\chromium
    set GYP_DEFINES=branding=Chromium buildtype=Official
    set GYP_GENERATORS=ninja
    cd src
    python build\gyp_chromium
    ninja -C out\Release chrome.exe
    
  3. ビルド完了までひたすら待つ。

ビルド中の余計な表示を省いて高速化

上記の方法をそのまま行うと、インクルードファイルの一覧が表示されてしまいます。 この表示を抑止することで、ビルド時間を短縮できます。

  1. src\tools\gyp\pylib\gyp\generator\ninja.pyを開く。
  2. 1480行目、1483行目の/showIncludesを削除する。
  3. 上記ビルド手順の最初からやり直す。

# なんでこんな設定になっているんでしょう・・・?
2014/08/02 追記
これは、ソースファイルとヘッダーファイルの依存関係を記憶するためです。 英語版のコンパイラを使っていれば、インクルードファイル一覧の表示をフィルタリングして表示させないようにし、 依存関係を記憶してくれますが、フィルタリングの条件が英語でハードコーディングされているせいで、 英語版以外ではインクルードファイル一覧が表示されてしまっていました。 最新版のninjaでは、この問題が修正されたようです。

Q & A

Q.ninjaビルドってMSBuildと比べて速いの?
A.筆者の環境では、コンパイル済みのデータがない初期のビルドはそんなに差がありませんでしたが、 コードを編集した後でビルドしたときは圧倒的に速いです。MSBuildで40分かかっていたのが、1分足らずで終わることもあります。 ninjaビルドではインクリメンタルリンクが有効になることが速い理由の1つです。

Q.ヘッダーファイルだけを変更してビルドしようとするがビルドしてくれない。 ヘッダーファイルとソースファイルを変更してビルドしたらおかしな動きになった。
A.ヘッダーファイルの変更を検知してくれないようです。 ヘッダーファイルの依存関係がはっきりとわからない場合はリビルドを推奨します。
# ヘッダーファイルを変更しても一発でビルドできる方法があったら教えてください
2014/08/02 追記: 上述のとおり、/showIncludesを削除したのが原因です。

Q.編集した後でビルドしたが、不具合があったのでソースファイルのバックアップを使って元に戻した。 ところが、これでninjaビルドしようとしてもビルドしてくれない。
A.ninjaビルドは、変更点を検出するのに更新日時を参照するようで、 更新日時が古いファイルはビルドの対象にならないようです。 上書き保存などで更新日時を更新してからビルドしてください。