社内勉強会資料。
Building from Source · v8/v8 Wiki
事前準備
下記が必要
- git
- python
- 2.7以上推奨
depot_tools
depot_tools とは?
depot_toolsは、ChromiumやChromium OSのソースコードのダウンロードやレビューの管理などを行うためのスクリプト集。v8もdepot_toolsを使ってソースコードのダウンロードとビルドができる。
depot_tools のインストール
Linux/macは、git cloneして、PATHに追加すればOK。
$ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
$ export PATH=`pwd`/depot_tools:"$PATH"
Windowsは↑のチュートリアルを読んでください。
depot_toolsの中でも下記を使います
- fetch: ソースコードのダウンロード
- gclient: 3rd partyリポジトリのアップデート&依存関係の解決
- gn: ビルドに使うビルドファイルの生成
- ninja: ビルドツール
v8のソースコードのダウンロード
depot_toolsのfetchで簡単にダウンロード(チェックアウト)できる
$ fetch v8
$ cd v8
その他のプロジェクトもfetchでダウンロードできる
$ fetch chromium # Basic checkout for desktop Chromium
$ fetch android # Chromium checkout for Android platform
$ fetch ios # Chromium checkout for iOS platform
依存関係の解決
v8ディレクトリでgclient sync
すれば、OK。
$ gclient sync
チュートリアルには、
You will need to run this any time you update the main src checkout, including when you switch branches.
と書いており、ソースコードのチェックアウト、ブランチ変更を行った時に実行する必要があるみたい。
ビルドファイルの生成
tools/dev/v8gen.pyを実行すると、out.gn以下にビルドファイルが出力される
v8ディレクトリで
$ tools/dev/v8gen.py x64.debug
out.gn/x64.debugに出力される
$ ls -l out.gn/x64.debug
total 120
drwxr-xr-x 10 XXXX XXXX 340B Apr 14 14:37 ./
drwxr-xr-x 4 XXXX XXXX 136B Apr 14 14:34 ../
-rw-r--r-- 1 XXXX XXXX 16B Apr 14 14:37 .ninja_deps
-rw-r--r-- 1 XXXX XXXX 15B Apr 14 14:37 .ninja_log
-rw-r--r-- 1 XXXX XXXX 119B Apr 14 14:34 args.gn
-rw-r--r-- 1 XXXX XXXX 13K Apr 14 14:34 build.ninja
-rw-r--r-- 1 XXXX XXXX 2.9K Apr 14 14:34 build.ninja.d
-rw-r--r-- 1 XXXX XXXX 2B Apr 14 14:34 mb_type
drwx------ 60 XXXX XXXX 2.0K Apr 14 14:37 obj/
-rw-r--r-- 1 XXXX XXXX 24K Apr 14 14:34 toolchain.ninja
tools/dev/v8gen.py listで事前に用意されているプリセット一覧が出力される
$ tools/dev/v8gen.py list
arm.debug
arm.optdebug
arm.release
arm64.debug
arm64.optdebug
arm64.release
ia32.debug
ia32.optdebug
ia32.release
mips64el.debug
mips64el.optdebug
mips64el.release
mipsel.debug
mipsel.optdebug
mipsel.release
x64.debug
x64.optdebug
x64.release
v8gen.pyはdepot_toolsのラッパーで、gnを直接使う方法は下記に書いてある。
ビルド
depot_toolsのninjaを使う。v8gen.pyで生成したビルドファイルのディレクトリを-Cに指定して、ビルドする。(結構時間が掛かる)
$ ninja -C out.gn/x64.debug
ビルドすると、out.gn/x64.debug以下に色々生成されている。out.gn/x64.debug/d8を実行するとREPLが起動する。
$ ./out.gn/x64.release/d8
V8 version 5.8.0 (candidate)
d8> 1+1
2
d8> function add(a, b) { return a + b; }
undefined
d8> add(1, 1)
2
d8>
その他
Exposing HomeObject – Hacker Noon
上記記事が結構参考になった。ソースを書き換えて再ビルドして、d8で確認したり。あと、ソースを読むだけなら、ブラウザから検索できるっぽい。