Neunomizuの日記

俺だけが俺だけじゃない

Firefoxのビルド方法

tags: 情報

動機

EEICの後期実験で「大規模ソフトウェアを手探る」というものを取りました

この実験はチームに分かれて(最低限の目安として)10万行以上のソースコードのソフトウェアの改変,拡張をするというものです

僕はここで以下の点からブラウザのソースコード手探ってみたいと思いました

  • 個人的に改善したい点がある
  • Rustを使っていたりセキュリティに注力していたり技術的に面白そう
  • 非営利団体であるMozillaによって運営されている(他己的な点)
  • ブラウザで使われている技術が幅の広いことから自分でも貢献できる部分はあると思った

というわけで実際にビルドするまでの解説です

ビルド前のSetup

基本的には公式のFirefoxのビルドに関する記事に従います

ただ,自分の環境ではところどころエラーが出たのでそれに関しても適宜話したいと思います

まずはビルド用のディレクトリを作ります

cd && mkdir src # srcでなくてfirefoxでも良い
cd src

bootstrap.pyというファイルをダウンロードし実行します(vscオプションはgitで管理がしたい人のみでそうでない人は付ける必要はありません)

wget https://hg.mozilla.org/mozilla-central/raw-file/default/python/mozboot/bin/bootstrap.py -O bootstrap.py
python bootstrap.py --vcs=git

実行をすると

Please choose the version of Firefox you want to build:
  1. Firefox for Desktop Artifact Mode
  2. Firefox for Desktop
  3. GeckoView/Firefox for Android Artifact Mode
  4. GeckoView/Firefox for Android

と聞かれます

Artifact ModeC/C++ソースコードをいじらない人用らしいので僕は2を選択しました

このときに以下のようなエラーが出てきた時は

Executing as root: sudo pip install --upgrade Mercurial
Traceback (most recent call last):
  File "/usr/bin/pip", line 9, in <module>
    from pip import main
ImportError: cannot import name main
Traceback (most recent call last):
  File "bootstrap.py", line 194, in <module>
    sys.exit(main(sys.argv))
  File "bootstrap.py", line 185, in main
    dasboot.bootstrap()
  File "/tmp/tmp0g3sqwqd/mozboot/bootstrap.py", line 451, in bootstrap
  File "/tmp/tmp0g3sqwqd/mozboot/base.py", line 553, in ensure_mercurial_modern
  File "/tmp/tmp0g3sqwqd/mozboot/debian.py", line 184, in upgrade_mercurial
  File "/tmp/tmp0g3sqwqd/mozboot/base.py", line 354, in run_as_root
  File "/home/denjo/.pyenv/versions/3.6.8/lib/python3.6/subprocess.py", line 311, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['sudo', 'pip', 'install', '--upgrade', 'Mercurial']' returned non-zero exit status 1.

/etc/apt/sources.list.d/というディレクトリ内のファイルが悪さをしている可能性が有ります

ここはaptapt-getで入れたパッケージの管理ファイルが入っている場所なのでいらなそうなものは消しましょう

僕は全部いらなそうだったので全て削除しました

cd /etc/apt/sources.list.d
rm -rf *

これでエラーが消えました

その後,

How would you like to continue?
  1. Install a modern Mercurial via pip (recommended)
  2. Install a legacy Mercurial via apt
  3. Do not install Mercurial

という選択肢が出てきます

1で試した所エラーが出たので3でやったところ上手く行きました(こわい)

その後,RETURNキーを押すように言われるので言われるがままに押します

そして色々質問が出てきます.

質問形式はYES/NOです.僕は全てyと答えました

下のような文言が出てきたら準備は完了です.次はソースコードcloneしてビルドをします

Installing Stylo and NodeJS packages requires a checkout of mozilla-central.
Once you have such a checkout, please re-run `./mach bootstrap` from the
checkout directory.

ソースコードのダウンロードとビルド

ソースコードのダウンロード

以下のコードでソースコードをダウンロードすることができます

hg clone https://hg.mozilla.org/mozilla-central
cd mozilla-central

オプションに関して

C/C++のファイルを扱わない場合は以下のオプションを./mozconfigに書き込みます

# Automatically download and use compiled C++ components:
# This option will disable C/C++ compilation
ac_add_options --enable-artifact-builds

# Write build artifacts to (not mandatory):
mk_add_options MOZ_OBJDIR=./objdir-frontend

もし,デバッガを使う場合は以下のコードも

ac_add_options --disable-optimize
ac_add_options --enable-debug

いざビルド

最後に以下のコマンドでビルドをします

./mach build

すると以下のようなエラーが..

 0:09.93 ERROR: Cannot find cbindgen. Please run `mach bootstrap`,
 0:09.94 `cargo install cbindgen`, ensure that `cbindgen` is on your PATH,
 0:09.94 or point at an executable with `CBINDGEN`.
 0:09.99 *** Fix above errors and then restart with\
 0:09.99                "./mach build"
 0:09.99 client.mk:111: recipe for target 'configure' failed

ということなので

./mach bootstrap

cargo install cbindge

をします(ちなみに僕は下から読んで焦ってcargoの方からしました)

./mach bootstrapを済ませると

Your system should be ready to build Firefox for Desktop!

というメッセージが...(わくわく)

そして再度

./mach build

をしてみます

夜中に実行して朝見てみると...

If filing a bug, please include the full output of mach, including this error
message.

The details of the failure are as follows:

IOError: [Errno 28] No space left on device

というエラー文が...

どうやら容量が足りなかった模様...

容量の確認

なのでビルドする前には容量の確認をした方が良いでしょう

ncduコマンドを使うと下のようにグラフィカルに容量が確認でき,またvimキーバインド,十字キーディレクトリの移動も可能です

だからncduを以下のコマンドでインストールして先に確認を済ませてから./mach buildをしましょう

sudo apt install ncdu

iキーを押すと詳細も表示してくれます

再びビルド

./mach build

をします

エラーなしで完了した場合

./mach run

をすると以下のような表示が出て成功です

初回のビルドの時間は大体20分でした

メモリは16GBで,CPUはCore i5 vPro 第8世代のPCで行いました