WindowsでV8を静的ライブラリとしてビルドする完全ガイド【2025年8月版】

アプリ
スポンサーリンク

こん○○は、よふかしわーくすのよふかしさんです

以前投稿した、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から取得できます

Visual Studio: ソフトウェア開発者とチーム向けの IDE およびコード エディター
Visual Studio 開発ツールとサービスによって、開発者が任意のプラットフォームや言語でアプリの開発を行うのが容易になります。 コード エディターまたは IDE を使用してどこでも無料で開発できます。

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

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

個別のコンポーネント、のタブを選択し、clangと入れて検索
下記の2つの選択

  • LLVM (clang-cl) ツールセットのMSBuildサポート
  • Windows用 C++ Clangコンパイラ(19.1.5)

インストール、を選択

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

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


Git for Windowsのインストール

V8のソースコードを取得するために、Git for Windowsをインストールします
下記URLから取得しますが、こちらは一般的な作業なので、詳細は割愛します

Git for Windows
We bring the awesome Git VCS to Windows

インストール完了後、一旦再起動します


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のみで詳細は割愛します

Welcome to Python.org
The official home of the Python Programming Language

環境変数を通すために、一旦再起動します
再起動後、下記コマンドで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によるビルドまで、一連の流れを再現できるのではと思います
この自前ビルドを応用すれば、機能の取捨選択やサイズ最適化ができるかと思います

さて、やっと自前ビルドができたので、次の何かをやってみようかな、と思います。。。

コメント

タイトルとURLをコピーしました