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 Mode
はC/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/
というディレクトリ内のファイルが悪さをしている可能性が有ります
ここはapt
やapt-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で行いました