大規模ソフトウェア(Chromium)を手探る 導入・ビルド編

このブログは電気系3年生後期実験の大規模ソフトウェアを手探るの最終報告ブログです。

「大規模ソフトウェアを手探る」とは?

東大工学部電気系3年生は3~6個のテーマの実験を行うことが必修となっており、「大規模ソフトウェアを手探る」とは田浦健二郎先生による「演習レベルの小さなプログラムが作れること」と,「実用規模のプログラムが作れること」のギャップを埋める (ための知識と経験を得ることを目的に、1〜数百万行のオープンソースソフトウェアをソースからビルドし新しい機能を加えたりします。
今回私たちのチームでは、みんなが使う大規模なものをやりたいという気持ちと、個人的にChromeのBlink周りの開発をしたことがあったのでChromiumをテーマに選びました。

そもそもChromiumとは

GoogleのブラウザであるChromeを使っている方も多いのではないでしょうか。ChromiumとはオープンソースソフトウェアとしてChromeを見たときの名称です。

Chromiumクロミウム)はオープンソースのウェブブラウザのプロジェクト名で、Google Chromeはこのソースコードを引き抜いて開発されたものである。 -- Chromium - Wikipedia

ちなみにChromiumがどのくらい大規模かというと、 英語圏の質問投稿サイトQuoraの質問How many lines of code is Google Chrome?によると、2012年の時点で400~500万行のコードが存在しているみたいです。

4,490,488 lines of code, 5,448,668 lines with comments included, spread over 21,367 unique files.

現在の正確なChromiumソースコード行数については見つけられていないのですが、この数字だけでも私たちが普段使っているブラウザがどれほど大きく複雑なものかわかります。

このブログ記事について

この「大規模ソフトウェアを手探る」実験では、一般的な実験レポートの代わりにこういったブログ形式でのレポートの提出が推奨さえています。
私たちもChromiumという(超)大規模ソフトウェアをて探るにあたって、かなり昨年の方の丁寧なブログレポートが参考になったため、できるだけ詳細に どういった作業を行っていったのか、何に途中つまづいたのかをまとめています。
Chromiumのソースをいじってみたいという方以外だともしかしたら少し冗長かもしれませんが、今後「大規模ソフトウェアを手探る」でChromiumをやりたい方、 もしくは趣味でChromiumをゴニョゴニョしたい方の参考になれば嬉しいです。

今回の実験で実装しようと思った機能

今回の実装しようと思った機能はChromeの上部にでる検索ボックス上に入力に応じて現れる過去の履歴やサーチエンジンの検索サジェスチョンから、指定したキーワードを含む過去の検索履歴を表示しないようにする機能です。 この検索ボックスのことはOmniboxというChromium BrowserのComponentです。

スライドを投影している時やペアプロの時にChrome検索を開いた時に表示したくないような検索履歴がサジェストされることがあるという話を聞いた(見た)のと、 なんとなく面白そうだからというこれまた雑な理由で決めたのですが、結果的にBrowserのコアの部分からフロントエンドまで、またC++からJavaScriptの世界でどうやりとりがされているか等を知ることができ、 とても勉強になりました。

大まかな作業スケジュールとブログ記事リスト

以下が大まかな作業スケジュールになります。できるだけ来年以降大規模ソフトウェアを手探る人に参考になるように細かく書いたら長くなったのでブログ記事を分割しました。

まずはビルドから

とはいうもののまずビルドができないと話になりません。 この記事では開発を始める前のChromiumソースコードを引っ張ってきて手元のPCでビルドするまでをまとめたいと思います。 今回のチームメンバーはみんなLinux(Ubuntu)を使用していたので、ChromiumのLinux向けコンパイル、ビルドのイントラクションを参考にしました。 基本的には順に従って行けばいいのですが、いくつかハマりポイントがあったのでそれも含めて追っていきます。

depot_toolsをインストールする

depot_toolsはソースコードのチェックアウトや依存パッケージのダウンロードなどの、Chromiumのビルドやコントリビュートに必要な機能を提供してくれます。

$ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
$ export PATH="$PATH:/path/to/depot_tools"

Chromiumソースコードを取ってくる

Chromiumソースコードを取ってきます。まず適当な場所にChromium作業用のディレクトリを作りましょう。 今回は~/crというディレクトリ以下ににChromiumソースを落としてくることを想定しています。

$ mkdir ~/cr && cd cr

次に、先ほどインストールしてきたdepot_toolsのfetchというツールを使ってコードと依存ライブラリをチェックアウトします(ローカルに持ってきます)。

$ fetch --nohooks--no-history chromium

基本的には--no-historyオプションをつけることをオススメします。--no-historyをつけないと、レポジトリの全ての履歴を取ってくるので時間もストレージも倍くらいかかります… --no-historyをつけた場合はだいたい30分程度でコードがチェックアウトできます。

hookを走らせる

フェッチが完了したらChromium特有のhooksを走らせて必要な追加バイナリをインストールします。 ただUbuntuの場合、この前にフェッチしてきたsrc/以下でbuild/install-build-deps.shを走らせる必要があります。これ公式だとあまり大きく書いてないので見落としがちですが、先にこちらを走らせないと「dependenciesがないよ!」って怒られます。

$ cd src
$ build/install-build-deps.sh
$ gclient runhooks

ビルドのためのセットアップをする

必要なダウンロードが終わりました…!いよいよビルドしていきましょう。まず、セットアップをします。

$ gn gen out/Default

次にいよいよninjaでコンパイルし、実行ファイルをRunします。

$ ninja -C out/Default chrome
$ out/Default/chrome

学科の8コアのマシンでだいたい5時間程度で完了しました…さすが大規模ソフトウェア... 電気系3年生は実験の前にビルドまで終らせてから来ような、初回にやることがなくなるからな ここまででChromeのビルドが完了しました。ここまでは割とトラブルなくできると思います。 次回からは実際に検索フィルター機能を追加するための手順を順にまとめていきます。

Chrome開発に当たって便利なもの

  • Chrome code search
    Chromiumのコードの検索ができる。個人的にはhistory, xsearch(referenceやcall hierarchy)がすごい便利だと思いました。
  • The Chromium Project For Developers Design Documents
    Chromeの様々な機能や全体のアーキテクチャのdesign documents(設計書、機能書)が集まっています。500万行以上あるコードから自分の変更したい機能に関わる部分をcode searchのみで発掘するのはなかなか厳しいので、こういったdesign documentsを見て関連するモジュールの実装等を参考にするといいかもしれません。