V8エンジン

JavaScript組み込みエンジン「V8」にちょっとだけ手を出してみました。
なぜ?lua言語にちょっとイライラしたから…つい魔が。
Chormiumeプロジェクトのアレです。ブラウザからJavaScriptエンジン部分だけをぶち抜いたもので、みんなもプログラムに組み込んでみよう!というアレです。
windowsでもほら簡単!って事だったんですけど…気軽に言ってくれるなぁ。

ビルド方法が大きく変わりました

ふふーん。なーんだgoogleからgit.cloneしておっぱいそんいれてgypするれば終わりじゃん!って思ってたんですがダメでした。
どうやらファイルが足りないみたいです。確認したところではClangあたりでしょうか。
というわけで、googleさんからではなく、Chormiumeプロジェクトさんの方から一式セットを頂くことにします。
と、数行で済ませてますがすでに1日が経過して若干やつれてます。

  • depot tools

https://www.chromium.org/developers/how-tos/install-depot-tools
(これもURL変わったりするのでだめな場合はgoogleさんに「depot tools V8 install」と聞いてみてください)
このあたりは過去と同じなので詳細は省きます。
これで揃うのは、python、git、gyp環境(ninja含む)です。
展開して、フォルダのルートで以下のバッチを実行するのですが、いくつか(DEPOT_TOOLS_WIN_TOOLCHAIN,GYP_MSVS_VERSION)windows環境変数に登録が必要なので、以下の内容なバッチファイルを作って一時的に登録させる手法を使うと楽ちんだと思います。

set DEPOT_TOOLS_WIN_TOOLCHAIN=0
set CPPFLAGS=/WX-
set GYP_MSVS_VERSION=2015
set GYP_DEFINES=component=shared_library
set GYP_GENERATORS=ninja,msvs-ninja

rem 環境変数のパスに入れるなら不要
set PATH=%PATH%;******\depot_tools
set PATH=%PATH%;******\depot_tools\python276_bin
  • depot tools update/setup

depottools展開フォルダのルートでバッチ作成後実行

gclient
  • ツールパス指定

windows環境変数(ユーザ)にbin,root,gypのパスを追加。

  • git.clone

お好きな場所にフォルダを作ってそこでバッチ作成後実行。
VSの環境に合わせて「GYP_MSVS_VERSION」は変えてください。私は2015でやりました。

set DEPOT_TOOLS_WIN_TOOLCHAIN=0
set GYP_MSVS_VERSION=2015
fetch v8

上手くいかない場合は、コマンドプロンプトを終了させたり、パスが通っているか「~> path」で確認してみてください。
というのもね、Explolerで「シフトを押しながらフォルダを右クリックでコマンドプロンプトを開く」が便利で使うんですけど、環境変数の反映は「次回”親”アプリケーション起動時」なんです。
この時、開いたコマンドプロンプトは子プロセスなので、開き直しても反映されないのをすっかり忘れて2時間時間を無駄にしました…。調べると設定するとイベントが飛んでくる筈なんですけどね…対応していないみたいで。

やったーコンパイル…できない!

コンパイルの流れは「gypさんにお願いするとsln(VSプロジェクトファイル)が貰えるのであとはVS上でやる」というのが以前までの方法でした。
これが新しくなって「gypさんにお願いするとninjaが出てきてlibまでケジメしてくれる」ということで根本的に変わってまして、slnを吐いてくれません!おのれninjaslayer!
ともあれ、とりあえずはninjaであってもコンパイルを通さないと行けませんのでそこまではやりましょう。
今回も環境変数の登録があるので以下のようなバッチをcloneした一番上(.gitignoreがあるところ)作り、念のためVisualStudioコマンドプロンプトから実行します。(風通のでも行けた気がするような)

set DEPOT_TOOLS_WIN_TOOLCHAIN=0
set GYP_MSVS_VERSION=2015
python gypfiles/gyp_v8

なんだか幾つかのファイルでエラーが出てると思います。
よくある日本語環境下でのsjis認識によるものらしいので、この際USモードでOSを再起動させます。
「コントロールパネル−言語−地域−管理−システムローケル」で「英語(米国)」にして再起動。
(これがユーザー単位に切り替えできたら良いのですが…プログラムのUnicodeチェックするときに使ってますがいつも再起動面倒です)
これで通るはずです:Q
終わったものの、特にメッセージも無いのでどこに何が生成されたのかさっぱりですが、これで「out\」というフォルダにninjaのmakeファイルが展開されました。
なのでコンパイルしないと。
ninjaと打ち込むと「build.ninja」のあるフォルダを指定してね!って言われるので以下のようにoutのなかの「任意のフォルダ」を指定してください。

ninja -C out/release

これでとりあえずはninjaコンパイルは上手くいく行ったと思います。おつかえさま:Q
ほほーlibファイル群がよゆーで10Mこえてるぜー!でけぇ!

ちげーよ!slnが欲しいんだよ!

ですよねー。

  • Cannot generate solution file of v8 with gyp for visual studio 2013

http://stackoverflow.com/questions/38015585/cannot-generate-solution-file-of-v8-with-gyp-for-visual-studio-2013
KAOMOJIまでつかって実にチャーミングです。泣いてます。かわいそう。
私なんてもう流す涙も枯れてしまったわとかそんな危険な状態です。
gypさんに以下のようにお伺いを立てればslnが出力されます。

set DEPOT_TOOLS_WIN_TOOLCHAIN=0
set GYP_MSVS_VERSION=2015
gn gen --ide=vs out/VSproject

やった!これで「out/VSproject」にslnとその部下達(プロジェクト)が吐き出されて…いました……。
現在ではいくつかDLLのコピーで引っかかります。「program files(x86)\Windows Kits\10\」に「debuggers\」が無ければ、Windows 10 SDKをもう一度インストールしましょう。

https://developer.microsoft.com/ja-jp/windows/downloads/windows-10-sdk
めっちゃいっぱいのDLLとともにソリューションが出来ましたが…こんなにいるのでしょうか?


とここまでやって貰って申し訳ないのですが、slnを開いてコンパイル……出来ません。
どうも最終的に外部コンパイラでninjaに投げるような設定みたいなので、結局sln出力の意味がありません。
マクロあたりを見てなんとか再構成とも思ったのですが、どのプロジェクトもほぼ初期状態に近い状態で、明らかにバグってるように思えます(外部コンパイラの項目も真っ白ですし…)。
luaのようにシンプルなら1からビルド用のプロジェクトが組めるのですがちょっと複雑すぎて……V8コアを突っ込んでobj作ってlinkとは行かないようですので。

結局使ってるの?

使ってません…。今のところ。力尽きました。
いつか使うかも知れません。