GNでV8を構築する
V8はGNの助けを借りて構築されています。GNは他の多くの構築システムに対する構築ファイルを生成するもので、ある種のメタ構築システムです。したがって、構築方法は使用している「バックエンド」構築システムとコンパイラによって異なります。
以下の手順では、すでにV8のチェックアウトがあり、構築の依存関係をインストールしていることを前提としています。
GNの詳細については、ChromiumのドキュメントまたはGN独自のドキュメントで確認できます。
ソースからV8を構築するには3つの手順が必要です
- 構築ファイルの生成
- コンパイル
- テストの実行
V8を構築するための2つのワークフローがあります
- 3つの手順をすべて適切に組み合わせた
gm
と呼ばれるヘルパースクリプトを使用する簡易ワークフロー - 各手順を手動で低レベルの別々のコマンドを実行する未加工のワークフロー
gm
を使用してV8を構築する(簡易ワークフロー) #
gm
は、構築ファイルの生成、構築のトリガー、場合によってはテストの実行もすべて行う利便性の高いオールインワンスクリプトです。V8のチェックアウトでtools/dev/gm.py
にあります。シェル構成にエイリアスを追加することをお勧めします
alias gm=/path/to/v8/tools/dev/gm.py
次に、gm
を使用して、x64.release
などの既知の構成でV8を構築できます。
gm x64.release
構築直後にテストを実行するには、実行します
gm x64.release.check
gm
は実行しているすべてのコマンドの出力を表示するため、必要に応じてそれらのコマンドを追跡して再実行するのが容易です。
gm
を使用すると、必要なバイナリを構築し、単一のコマンドで特定のテストを実行できます
gm x64.debug mjsunit/foo cctest/test-bar/*
V8の構築:未加工の手動ワークフロー #
手順1:構築ファイルの生成 #
構築ファイルを生成する方法にはいくつかあります
- 未加工の手動ワークフローでは、
gn
を直接使用します。 v8gen
という名前のヘルパースクリプトは、一般的な構成のプロセスを簡素化します。
gn
を使用して構築ファイルを生成する #
gn
を使用して、out/foo
ディレクトリの構築ファイルを生成します
gn args out/foo
これにより、gn
引数を指定するためのエディタウィンドウが開きます。または、コマンドラインで引数を渡すことができます
gn gen out/foo --args='is_debug=false target_cpu="x64" v8_target_cpu="arm64" use_goma=true'
コンパイルにgoma
を使用したリリースモードで、arm64シミュレーターを使用してV8をコンパイルするための構築ファイルが生成されます。
使用可能なすべてのgn
引数の概要については、実行します
gn args out/foo --list
v8gen
を使用して構築ファイルを生成する #
V8リポジトリには、一般的な構成の構築ファイルをより簡単に生成するためのv8gen
利便性スクリプトが含まれています。シェル構成にエイリアスを追加することをお勧めします
alias v8gen=/path/to/v8/tools/dev/v8gen.py
詳細についてはv8gen --help
を呼び出します。
使用可能な構成(またはマスターのボット)を一覧表示する
v8gen list
v8gen list -m client.v8
client.v8
ウォーターフォールから特定のボットのようにfoo
フォルダに構築する
v8gen -b 'V8 Linux64 - debug builder' -m client.v8 foo
手順2:V8のコンパイル #
V8のすべてを構築するには(gn
によってx64.release
フォルダに生成されたと想定して)、実行します
ninja -C out/x64.release
d8
のような特定のターゲットを作成するには、それらをコマンドに追加します
ninja -C out/x64.release d8
手順3:テストの実行 #
テストドライバに出力ディレクトリを渡すことができます。その他の関連フラグは構築から推測されます
tools/run-tests.py --outdir out/foo
最も最近コンパイルしたビルド(out.gn
内)をテストすることもできます
tools/run-tests.py --gn
構築の問題が発生しましたか?バグをv8.dev/bugで報告するか、v8-users@googlegroups.comでサポートをリクエストしてください。