こん○○は、よふかしわーくすのよふかしさんです
以前投稿した、VSD for GPSのビルド手順の記事で、V8エンジンがどうしてもうまくビルドできませんでした
今回、重い腰を上げて(?)再トライしてみたところ、うまくいったので備忘録として残しておきます
そもそもV8って何?
V8とは、Googleが開発した高性能なJavaScriptエンジンでして
もともとはChromeブラウザのために設計されましたが、現在ではNode.jsやElectronなど、さまざまなプロジェクトで利用されている様です
V8の最大の特徴は、JavaScriptをネイティブコードにコンパイルして高速に実行できる点で
従来のインタプリタ型エンジンよりも圧倒的なパフォーマンスを実現している、らしい…
V8の主な用途
- Chromeブラウザ:WebページのJavaScriptを高速に処理
- Node.js:サーバーサイドJavaScriptの実行環境
- Electron:デスクトップアプリ開発(VSCodeなど)
- VSD for GPS:GPSログ解析ツールでのスクリプト処理にV8を活用
VSD for GPSでのV8の役割
VSD for GPSでは、ユーザー定義のJavaScript処理向けにV8エンジンを組み込んで使われています
これにより、以下のような高度な処理を可能にされています
- ログデータの入力や変換をJavaScriptで記述
- Skinなどをプラグイン形式で追加・拡張
- 高速な実行により、大量のログでもスムーズに処理
V8を組み込むことで、柔軟性とパフォーマンスを両立したGPS解析環境が実現されているんですねぇ
なぜV8を自前でビルドするのか?
V8は公式にビルド済みのバイナリを配布していないため、基本的には独自の環境に合わせてソースコードからビルドする必要があります
以前の記事では、既にビルドされたものを使用させてもらいましたが、ビルド済みのものってほとんど見つからないかちょっと怪しいヤツしかなくて使用を躊躇してしまいます
今回はとある意図があって自前ビルドを再トライをしてみた次第です
V8ビルドに必要なツール
V8のビルドにはいくつかのツール導入が必要です
- Visual Studio&Clang
- C++コンパイラとして使用
- Git
- V8のソースの取得
- Python
- depot_toolsの動作に必要
- depot_tools
- Google製のビルド支援ツール群
以降にそれらの導入、使用手順を解説します
Visual Studio 2022 CommunityとClangのインストール
まずはVS2022をインストールします
Communityは個人でもフリーで使用できます
下記URLから取得できます

DLしたら実行します
続行を選択

ワークロードの中から、C++によるデスクトップ開発を選択

個別のコンポーネント、のタブを選択し、clangと入れて検索
下記の2つの選択
- LLVM (clang-cl) ツールセットのMSBuildサポート
- Windows用 C++ Clangコンパイラ(19.1.5)
インストール、を選択

こんな感じでインストールが始まります

インストールが完了したら、一旦PCを再起動します

Git for Windowsのインストール
V8のソースコードを取得するために、Git for Windowsをインストールします
下記URLから取得しますが、こちらは一般的な作業なので、詳細は割愛します
インストール完了後、一旦再起動します
depot_toolsの取得
下記コマンドでGitを使用してdepot_toolsを取得します
cd c:\
mkdir v8
cd v8
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
今回取得したリビジョンは、下記のTortoise Gitのログの通り、11640でした

V8の取得
V8のソースコードをdeport_toolsで取得します
Googleが提供するdepot_toolsは非常に便利なツールセットなのですが
デフォルトでは Google社内向けのVisual Studioツールチェーンを自動的にダウンロードしようとしてしまうため
これを回避するために環境変数をセットしてから使用します
:: depot_tools を PATH に追加(fetch, gclient, gn, ninja などを使うために必須)
set PATH=C:\v8\depot_tools;%PATH%
:: Google製ツールチェーンを無効化(ローカルのVisual Studioを使う)
set DEPOT_TOOLS_WIN_TOOLCHAIN=0
fetch v8
fetch v8の実行結果例です
下記の様になれば成功です
Updating depot_tools...
WARNING:root:depot_tools recommends setting the following for
optimal Chromium development:
$ git config --global core.autocrlf false
$ git config --global core.filemode false
$ git config --global core.fscache true
$ git config --global core.preloadindex true
You can silence this message by setting these recommended values.
You can allow depot_tools to automatically update your global
Git config to recommended settings by running:
$ git config --global depot-tools.allowGlobalGitConfig true
To suppress this warning and silence future recommendations, run:
$ git config --global depot-tools.allowGlobalGitConfig false
Running: 'C:\Users\yofukashi\AppData\Local\vpython-root.0\store\python_venv-k8oefljjki133rd42po4ai8fe8\contents\Scripts\python3.exe' 'C:\v8\depot_tools\gclient.py' root
Running: 'C:\Users\yofukashi\AppData\Local\vpython-root.0\store\python_venv-k8oefljjki133rd42po4ai8fe8\contents\Scripts\python3.exe' 'C:\v8\depot_tools\gclient.py' config --spec 'solutions = [
{
"name": "v8",
"url": "https://chromium.googlesource.com/v8/v8.git",
"deps_file": "DEPS",
"managed": False,
"custom_deps": {},
},
]
'
Running: 'C:\Users\yofukashi\AppData\Local\vpython-root.0\store\python_venv-k8oefljjki133rd42po4ai8fe8\contents\Scripts\python3.exe' 'C:\v8\depot_tools\gclient.py' sync --with_branch_heads
________ running 'git -c core.deltaBaseCacheLimit=2g clone --no-checkout --progress https://chromium.googlesource.com/v8/v8.git c:\v8\_gclient_v8_865848xv' in 'c:\v8'
Cloning into 'c:\v8\_gclient_v8_865848xv'...
remote: Sending approximately 1.44 GiB ...
remote: Counting objects: 7469, done
remote: Finding sources: 100% (7/7)
remote: Total 1208282 (delta 958662), reused 1208280 (delta 958662)
Receiving objects: 100% (1208282/1208282), 1.44 GiB | 38.94 MiB/s, done.
Resolving deltas: 100% (958662/958662), done.
1>Syncing projects: 0% ( 0/ 2)
[0:05:16] Still working on:
[0:05:16] v8
[0:05:16] Still working on:
[0:05:16] v8
Syncing projects: 100% (44/44), done.
________ running 'python3 third_party/depot_tools/download_from_google_storage.py --no_resume -u --bucket v8-wasm-spec-tests -s test/wasm-spec-tests/tests.tar.gz.sha1' in 'c:\v8\v8'
0> Downloading test/wasm-spec-tests/tests.tar.gz@e8f855c3f80301e3f127eaf18ba426dd6208c4bb...
0> Extracting 483 entries from test/wasm-spec-tests/tests.tar.gz to test/wasm-spec-tests/tests
Downloading 1 files took 8.155261 second(s)
Running hooks: 43% (10/23) wasm_js
________ running 'python3 third_party/depot_tools/download_from_google_storage.py --no_resume -u --bucket v8-wasm-spec-tests -s test/wasm-js/tests.tar.gz.sha1' in 'c:\v8\v8'
0> Downloading test/wasm-js/tests.tar.gz@8a69e14a26326662093099426eff78db6d409761...
0> Extracting 252 entries from test/wasm-js/tests.tar.gz to test/wasm-js/tests
Downloading 1 files took 4.370902 second(s)
Running hooks: 95% (22/23) configure_reclient_cfgs
________ running 'python3 buildtools/reclient_cfgs/configure_reclient_cfgs.py --rbe_instance projects/rbe-chrome-untrusted/instances/default_instance --reproxy_cfg_template reproxy.cfg.template --rewrapper_cfg_project --skip_remoteexec_cfg_fetch' in 'c:\v8\v8'
generate reproxy.cfg using c:\v8\v8\buildtools\reclient_cfgs\reproxy_cfg_templates\reproxy.cfg.template
Running hooks: 100% (23/23), done.
Running: git config --add remote.origin.fetch '+refs/tags/*:refs/tags/*'
Running: git config diff.ignoreSubmodules dirty
- depot_tools 更新
- 成功。警告は無視OK
- gclient 初期化
- .gclient 生成済み
- V8 ソース取得
- 約1.44 GiBの clone完了
- 依存ファイル取得
- wasm テストデータなど
- フック実行
- 23/23 成功
- Git 設定追加
- タグと差分の扱い
ちなみに、取得したリビジョンは、96362でした

下記は公式では推奨されていますが、fetchが成功していたため、未実施でも問題ありませんでした
但し、fetchが途中で中断されたりした場合は下記を実施するか
一旦削除してから、fetchを再実行するかになるのでご参考まで
cd v8
gclient sync
V8ビルド用Pythonのバージョン確認とインストール
後に実施するninjaコマンドで、V8内のPythonを指定していると途中でエラーになったので
V8内のPythonのバージョンを調べて、それと同じバージョンを通常インストールしておきます
cd C:\v8\depot_tools\python-bin
python3 --version
今回は、Python 3.11.8が返ってきました
Pythonのインストールは一般的なのでURLのみで詳細は割愛します

環境変数を通すために、一旦再起動します
再起動後、下記コマンドでPythonのバージョンを確認します
python --version
Python 3.11.8が返ってこない場合は環境変数の優先順位を変更します
GN設定とargs.gnの編集
V8 をビルドするには、GN(Generate Ninja)による設定生成と、args.gnの編集が必要です
ここでは、環境変数の設定からGNの初期化、カスタムビルド構成の編集方法までを解説します
:: depot_tools を PATH に追加(fetch, gclient, gn, ninja などを使うために必須)
set PATH=C:\v8\depot_tools;%PATH%
:: Google製ツールチェーンを無効化(ローカルのVSを使う)
set DEPOT_TOOLS_WIN_TOOLCHAIN=0
:: GYP に VS2022 を使わせる(任意)
:: set GYP_MSVS_VERSION=2022
:: VS2022 のインストールパス(任意)
:: set GYP_MSVS_OVERRIDE_PATH=C:\Program Files\Microsoft Visual Studio\2022\Community
:: Windows SDK のパス(任意)
:: set WINDOWSSDKDIR=C:\Program Files (x86)\Windows Kits\10
:: V8 のルートディレクトリに移動
cd C:\v8\v8
:: GN 設定を生成(args.gn と build.ninja を作成)
python tools\dev\v8gen.py x64.release
:: args.gn を手動で編集する
gn args out.gn\x64.release
開いたエディタに下記を入力
dcheck_always_on = false # DCHECK(デバッグ用チェック)を無効化してパフォーマンス向上
is_debug = false # リリースビルド(最適化あり、デバッグ情報なし)
target_cpu = "x64" # 64bit アーキテクチャ向けにビルド
is_component_build = false # コンポーネント分割なし(単一バイナリ化)
use_custom_libcxx = false # Google製の libc++ を使わず、標準ライブラリを使用
v8_static_library = true # 静的ライブラリとして V8 を出力(.lib)
v8_monolithic = true # 依存関係をすべて1つのバイナリに統合
v8_enable_pointer_compression = true # ポインタ圧縮を有効化(メモリ使用量削減)
v8_use_external_startup_data = false # 起動時の外部データ(snapshot)を使わない
v8_postmortem_support = false # クラッシュ後のヒープ解析機能を無効化
v8_enable_i18n_support = false # ICUベースの国際化機能(文字列処理など)を無効化
v8_enable_temporal_support = false # Temporal API(高精度な日付/時間処理)を無効化
v8_enable_webassembly = false # WebAssembly 機能を無効化(不要なら除外)
実行して、下記の様な結果が返ってくれば成功です
Waiting for editor on "C:\v8\v8\out.gn\x64.release\args.gn"...
Generating files...
Done. Made 563 targets from 141 files in 6647ms
ninjaによるビルド
GNで設定を済ませたら、いよいよninjaを使ってV8をビルドします
今回は静的ライブラリ向けの生成コマンドです
:: フルビルドする場合は、ninja -C out.gn\x64.release、とする
ninja -C out.gn\x64.release v8_monolith
実行結果が下記の様になれば成功です
ninja: Entering directory `out.gn\x64.release'
[1565/1565] LIB obj/v8_monolith.lib
メッセージ上でビルドステップが完了し、v8_monolith.libが生成されたことが確認できます
念のため、実際にファイルが生成されているかも確認してみます
c:\v8\v8\out.gn\x64.release\obj、の中に、v8_monolith.libが生成されていれば成功です

終わりに
今回は、Windows環境でV8を静的ライブラリとしてビルドする手順を紹介しました
fetchから、args.gnの編集、そしてninjaによるビルドまで、一連の流れを再現できるのではと思います
この自前ビルドを応用すれば、機能の取捨選択やサイズ最適化ができるかと思います
さて、やっと自前ビルドができたので、次の何かをやってみようかな、と思います。。。
コメント