MyChromiumビルド

開発:やはりブラウザ本体にも手を突っ込みたいですね。

基盤:先日Mozillaのビルドを試した時には、色々と苦労しました。よくわかりませんが、どうもその、何か開発環境としてしっくりこない。ドキュメントとコードの維持の現状もなんだか心もとない。しかもビルドが非常に重い。VM上のLinuxで環境を作ったのでイマイチアクセスがしにくい。

開発:それなので、Chromiumもやってみようかと思います。今回はMacOSの上で開発環境を作りたい。

基盤:面白そうです。

社長:複数やって比較してみるのは良いことですね。気分を盛り上げるのにはドメイン名を取るのが一番です。・・・ mychromium.com というドメイン名を取りました。

開発:それでは今日は、MyChromium事始めの日ですね。

基盤:さっそく、MacOS での Chrome開発の手引へ。

基盤:まずシステム要件「the releases currently use the 10.15 SDK.」なのでOKです。

MacMini% ls xcode-select -p/Platforms/MacOSX.platform/Developer/SDKs
DriverKit19.0.sdk MacOSX.sdk MacOSX10.15.sdk

開発:わたしは「macOS」とか「Mac OS X」という表記がしっくりこないのですが「MacOSX」という文字列をみるとホッとしますね。

基盤:では depot_tools というのをダウンロードしましょう。

MacMini% time git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
Cloning into 'depot_tools'…
remote: Sending approximately 31.77 MiB …
remote: Counting objects: 5, done
remote: Finding sources: 100% (5/5)
remote: Total 38977 (delta 26902), reused 38976 (delta 26902)
Receiving objects: 100% (38977/38977), 31.77 MiB | 28.36 MiB/s, done.
Resolving deltas: 100% (26902/26902), done.
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git 1.71s user 0.56s system 84% cpu 2.676 total

基盤:3秒で終了です。30MiB/sでダウンロードできてます。

社長:ついでに Machromium.blue というのも取ってみました。

基盤:では、本体のダウンロード開始します。

MacMini% time fetch --no-history chromium

開発:500Mbps出てますね。

基盤:「Expect the command to take 30 minutes on even a fast connection, and many hours on slower ones.」だそうですが、うちは 30分で行けそう。ギガビットのインターネットにして本当に良かったです。あ、終了しました。

fetch --no-history chromium 836.31s user 312.39s system 136% cpu 14:01.15 total

開発:14分でしたね。素晴らしいです。サイズはどのくらいですか?

MacMini% pwd
/Users/ysato/Desktop/MyChromium/mychromium
MacMini% du -s .
34007336
MacMini% find . | wc
632654 632815 51905577

基盤:34GBですね。Mozillaは10GB程度でしたから、かなりでかい。うーん、SSDの残り12GBになってしましました (^-^; HDDの上に移したほうが良さそうです。

開発:まあ、6/29にはiMac来ますから、それまでなんとかやりくりしましょう。

基盤:ではビルドのセットアップ。

MacMini% pwd
/Users/ysato/Desktop/MyChromium/mychromium/src
MacMini% time gn gen out/Default
Done. Made 13801 targets from 2310 files in 9057ms
gn gen out/Default 13.57s user 4.53s system 188% cpu 9.621 total

基盤: Faster build のお勧めに従って、オプション設定。

MacMini% cat > args.gn
is_debug = false
is_component_build = true
symbol_level = 0

基盤:あと、ccache というのを入れるとコンパイルが高速になるよとありますね。「 It speeds up recompilation of C/C++ code by caching previous compilations and detecting when the same compilation is being done again. 」。同じコンパイルって普通Makefileで日付見てスキップされると思うけど、そういう事ではないみたいですね。インストールしておきましょうか。昨日 brew というのも入れましたし。あれ、でも、brew の結果どこにインストールされたやら。よくわかんないのでこれはパスします。

基盤:さて、それではビルド行きます。

MacMini% time autoninja -C out/Default chrome

kaihatsu: nanka nihongo nyuuryokudekinakunarimasita 😉

kiban: this application te kono vivaldi no kotodesukane?

基盤:あ、あのVivaldiのタブのプロセスだけ変換エンジンと切れたんですかね。いやーそれにしても凶暴ですねぇ(笑)

開発:メモリが8GBしか無いのに600もプロセス走ってますしね。これだけひどい目にあってるMacMiniも世の中にそうは無いでしょう(笑)

基盤:このノコギリ状のメモリプレッシャーの遷移が面白いですね。

* * *

社長:MyChromium、どんな感じですか?

開発:いやはや懲りました。Chromiumのビルドがこんなにディスクを食うなんて… これって最終的に200GBくらい行きますかね?

基盤:256GBのSSDでかつかつでやってちゃどうにもならなかったですね。はじめから4TBのHDDのほうでやるべきでした。

開発:足りなくなっては捨てられるゴミを捨てるという繰り返しでした。でも、おかげで100GB以上SSDが空きました。

基盤:半分がゴミだったとは(笑)

開発:しかもVivaldiでメモリがぱんぱんのところで走らせたからスワップしまくりという、悲惨な状態でした。

基盤:プロセスのスワップアウトでだいぶSSDを痛めたでしょうね。

開発:なんか10TBずづ読み書きとか出てたけど、あまり思い出したくない・・・

基盤:アクティビティモニタのスナップショットは撮ったのですが、どっかに消えちゃったみたいです。

開発:しかし、毎秒何十万回もスワップできちゃったりするところがある意味素晴らしいと言うか。

基盤:メモリ不足でスワップはするは、コンパイルでIOしまくるはで、SSDも悲惨だったことでしょう。

基盤:結局HDDでやりなおしたら世の中は平和です。2時間くらいで終わりますかね?

基盤:Mozillaの rustc はめっちゃ重かったイメージがあるんですが、Chromium の C は細切れにしてあるのか、一つずつが軽いですね。

開発:というか、CPUが60%前後になるってことは、やはりディスク I/O がネックなんでしょうかね?tmpfs を RAMディスクにしたら早くなるとか。MacOSでのプロセスのforkのオーバヘッドの関係かも?

基盤:アクティビティモニタで見ると、ユーザ時間はテンパってるんですけどね。

基盤:df してみると、MacOS には tmpfs といのが無いですね。あと、ファイルを rm しても df に反映されないのが気持ちわるくて。ジャーナリングってやつだからでしょうか?

社長:昔、translucent file system (TFS)というのがあって。ファイルシステムを重ね合わせられるという仕組みで、すごく面白いと思ったのですが、なぜか流行らなかったですね。ああいうのができれば、そういうトランスペアレントな配置ができるかなと思うんですが。

開発:アクセス頻度の低いやつ自動的に裏方のHDDに送るって感じですかね。アプリケーションやユーザの見た目にはわからない。まあ、移動中はロックが必要でしょうけど。

社長:めったに使わないファイルとか、遅くても良いファイルとかはHDDに、っていちいち配置を変えるのも面倒だから、SSDをキャッシュ的に、HDDをバックエンドにして、アプリケーション側としてはどっちにあるか気にしなくて良いようなファイルの配置ができると良いのですが。

開発:そもそも移動の判断と実行はユーザの手動でやっても良いかも知れませんね。とにかく、ファイルの論理名は同じであって欲しい。実体を持たない、名前の管理だけするというか、ビューだけ提供するみたいなファイルシステムがあっても良いのではないですかね。リバースプロキシみたいな。

社長:相対パスのシンボリックリンクを提供してくれたりとかが良いですね。というか、もっと機能的な付加価値も。

開発:まあその付加価値的をどこでつけるのか、ずっと考えてきたわけですけども。

基盤:その後1時間経過、毎秒約2ファイル消化で進行しています。残り1万5千くらいありますので、このペースだとあと2時間以上はかかりますね。

開発:結局足掛け2日間ですか(笑)

基盤:でも、No space に怯える必要が無くなって気が楽。

基盤:というかさっきからFinderが固まってますね。

開発:df が固まるって、どこかのマウントが死んでるんですね。

基盤:これ、スクリーンショットが取れなくなっちゃうのが痛いです。

開発:Finderを殺したらデスクトップが超すっきりしました(笑)

基盤:Relaunch とか効かないですね。

開発:initプロセスに何とかしてもらうんだと思うんですが… そもそも、SSD の df が全然回復しないし、あちこち反応しなくなった感じだし、リブートしちゃいましょう。

基盤:そうですね…

* * *

開発:リブートしてしばらくしたら df がスカッと 50% に(笑)

基盤:回収がうまくされなかったんでしょうかね。何にしても、MyChromeビルド再開します。

基盤:なんだかかなり遅い領域に入りました。ファイルがでかいとかですかね。

開発:何にしても数万というファイルをコンパイルするわけで、我々がふだんmakeでやるようなログをダラダラ端末に流すような世界では全くないですね。Mozillaもそうでしたが。

基盤:別ウィンドウを開くとか、詳細なログをファイルに残してそれをtailで見るとかでも良いですけど。やはりなにかビュンビュン流れてれば気休めにもなるような(笑)

開発:ところでこれ、終わると何ができるんでしたっけ?

基盤:Chromium.app ができるそうです。でも朝方まで掛かりそう…

開発:じゃ寝て待ちますか。

* * *

基盤:終わりました。

開発:終わりましたね。

基盤:2,3時間で終わるだろうと思ったらほぼ一日がかかり。ccache というのを入れがほうが良かったかもですね。

開発:次回はそうしましょう。

基盤:711MBのシェアードライブラリというのもなかなかのものです。

MacMini% du -s Chromium.app
417000 Chromium.app

基盤:ビルド使ったディスク容量は、115GBでした。

開発:まあスワップとかtmpとかに使ったり、他の作業してたりとかで、130GBくらいは空きが必要だったわけですね。

* * *

社長:それでは進水しましょう。

基盤:立ち上がれ MyChrome! ・・・

開発:立ち上がらないですね?

基盤:CPUは食ってるみたいですが… あ、なんか動き出した。

開発:MacOS用MyChromium、ただいま立ち上がりました!

社長:記念撮影しましょう。パシャ。

基盤:2度めからの立ち上がりはまだまともですが、でも8秒くらいかかりますね。

Chromium.app/Contents/MacOS/Chromium 16.08s user 1.57s system 211% cpu 8.351 total

開発:確か、shared library 版にするとビルドは速いけど実行速度が遅いって注意書きにあったような。

社長:Mozilla には Mozillaの、ChromiumにはChromium の、一筋縄では行かないところがありそうですね。

-- 2020-0625 SatoxITS