厨房でもできる windows VS2010 で V8 engine をビルド。

google chrome にも搭載されている V8 engine を VS2010 (VC++ 2010 / visual studio 2010) でビルドしようというお話です。


環境構築 その1 svn を導入。


svn 入れます。
windowsユーザなら、tortoisesvn(とーたす えすぶいえぬ)がオススメです。遅いけど。

ここから落とせます。
http://tortoisesvn.net/downloads.html

インストール後に PC の再起動がかかるので、注意してください。

環境構築 その2 python を導入。


python入れます。
python ってver2系とver3系で違うらしいので、とりあえず2系を入れます。
#もしかしたら 3系でもうごくかもしれんが。
http://www.python.jp/Zope/download/pythoncore
http://www.python.org/ftp/python/2.7.1/python-2.7.1.msi

インストールしたら、パスを通します。


パスを通すのは、結構大変です。


まず、以下の場所に頑張って移動します。
コントロールパネル→システムとセキュリティ→システム→システムの詳細設定→環境変数


そしたら、Path とか書いてある項目を選択して、 編集をクリックします。


入力しづらいダイアログが開くので変数値っていうやつの最後に ;pathonをインストールしたパスを書きます。
私は、C:\Program Files (x86)\python2.7 にインストールしたので、

;C:\Program Files (x86)\python2.7

と、末尾に入力しました。
入力したら、 OK ボタンをくりっく指定って、 ウィンドウを全部閉じます。


で、パスを通したら、 cmd を開いて確認します。


windowsボタンをクリックして、cmd と入力し、 コマンドプロンプトを立ち上げます。

黒い画面が出てきたら、 python --version と入力してみましょう。

python --version 

うまく ver 2.7.1 などとバージョンが表示されたら成功です。


↓こんなふうにエラーが表示されたら、パスがうまく通っていません。または、インストールに失敗しています。

C:\Users\rti>python
'python' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

環境構築 余談

本家のビルド方法では、 SCons も必要と書かれていますが、なくても動くみたいです。
入れたい人は、http://www.scons.org/ から入れてください。
いれたあと、パスを通せと本家のドキュメントには書かれていました。

http://code.google.com/intl/ja/apis/v8/build.html

V8 のソースダウンロード

svn を利用してソースをダウンロードします。

適当な場所に適当なフォルダを作ります。(デスクトップのように日本語が入るフォルダがあるとダメ。)
フォルダの名前は、v8 とします。


v8 フォルダを開いて、適当な場所で右クリックします。
そうするとメニューが開いて SVN Checkout... という項目があるので、これを選択します。

すると、ダイアログが開くので、 URL of repository っていう項目に以下の内容を入れます。

http://v8.googlecode.com/svn/trunk/ 

あとは OK ボタンを押すと、ソースコードのダウンロードが始まります。

V8 ビルドへ ステップ1

さて、ビルドしてみましょう。
ダウンロードして v8 エンジンのソースーコードの、v8\tools\visual_studio というフォルダに移動してみます。


そしたら、v8.sln というファイルがあるので、これをダブルクリックで開きます。


VS2010 が起動して、変換するとか言ってくるので、完了をクリックして変換します。

さて、VS2010 が起動しました。
まずは、何も考えずに F7 を押してみます。

そうすると、コンパイルがはじまり、しばらく待っていると、エラーが表示されます。

1>2010/12/06 0:03:45 にビルドを開始しました。
1>InitializeBuildStatus:
1>  "C:\Users\rti\Desktop\v8\tools\visual_studio\Debug\obj\v8_base\v8_base.unsuccessfulbuild" のタッチ タスクを実行しています。
1>ClCompile:
1>  profile-generator.cc
1>..\..\src\profile-generator.cc(936): error C2220: 警告をエラーとして扱いました。'object' ファイルは生成されません。
1>..\..\src\profile-generator.cc(936): warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。

わけがわからない警告ですね。
適当なエディタで、 v8\src\profile-generator.cc を開いて、 Unicode で保存してあげてください。
または、警告をエラーとしないとしても回避することができます。(あんまり推奨されません)


今回はサクラエディタで v8\src\profile-generator.cc を開き、 Unicode で保存しました。

V8 ビルドへ ステップ2

ステップ1の修正をしたら、また F7 を押してコンパイルします。

1>------ ビルド開始: プロジェクト: v8_base, 構成: Debug Win32 ------
1>2010/12/06 0:07:19 にビルドを開始しました。
1>InitializeBuildStatus:
1>  "C:\Users\rti\Desktop\v8\tools\visual_studio\Debug\obj\v8_base\v8_base.unsuccessfulbuild" のタッチ タスクを実行しています。
1>ClCompile:
1>  profile-generator.cc
1>MakeDirsForLib:
1>  ディレクトリ "C:\Users\rti\Desktop\v8\tools\visual_studio\Debug\lib" を作成しています。
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(1151,5): warning MSB8012: TargetPath(C:\Users\rti\Desktop\v8\tools\visual_studio\Debug\v8_base.lib) が Library の OutputFile プロパティ値 (C:\Users\rti\Desktop\v8\tools\visual_studio\Debug\lib\v8_base.lib) と一致しません。このため、プロジェクトが正常にビルドされない可能性があります。この問題を解決するには、$(OutDir)、$(TargetName)、および $(TargetExt) の各プロパティ値が、%(Lib.OutputFile) で指定されている値と一致することを確認してください。

また、訳の変わらないエラーですね。

VS2010 では、以下のように設定を直さないとダメらしいです。
参考: http://www.firefly-vj.net/imagery/2010/05/25/visual-studio-2010-%E3%81%A8-windows-sdk-v7-1-%E3%81%A7-baseclasses-%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%82%92%E3%81%99%E3%82%8B/

$(OutDir)lib\$(ProjectName).lib
↓
$(OutDir)$(TargetFileName)

で、それをするにためには、GUIからやると大変なのでファイルを直接書き換えます。

以下のファイルを開きます。
\v8\tools\visual_studio\common.props

<Lib>
  <OutputFile>$(OutDir)lib\$(ProjectName).lib</OutputFile>
</Lib>

↓

<Lib>
  <OutputFile>$(OutDir)$(TargetFileName)</OutputFile>
</Lib>


書き換えたら、もう一度 F7 でビルドしてみましょう。

こんな警告がでますが、とりあえず動くから気にしない!!

1>regexp-macro-assembler-irregexp.obj : warning LNK4221: このオブジェクト ファイルは、以前に未定義であったパブリック シンボルを定義していないため、このライブラリを使用するリンク操作では使用されません
1>  v8_base.vcxproj -> C:\Users\rti\Desktop\v8\tools\visual_studio\Debug\v8_base.lib

V8 ビルドへ ステップ3

ここらへんで、pythonがねーよってエラーがでいる人は、人の話をちゃんと聞かない人です。
python 入れてくださーい。
#アイツは話を聞かないからな。

2>CustomBuild:
2>  Processing js files...
2>  'python.exe' は、内部コマンドまたは外部コマンド、
2>  操作可能なプログラムまたはバッチ ファイルとして認識されていません。
2>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets(151,5): error MSB6006: "cmd.exe" はコード 1 を伴って終了しました。

pythonのエラーは出ていないけど、↓のエラーがでちゃったーって人はここまでは正しく出来ています。

5>2010/12/06 0:31:28 にビルドを開始しました。
5>InitializeBuildStatus:
5>  "C:\Users\rti\Desktop\v8\tools\visual_studio\Debug\obj\v8_snapshot\v8_snapshot.unsuccessfulbuild" のタッチ タスクを実行しています。
5>ClCompile:
5>  natives-empty.cc
5>c1xx : fatal error C1083: ソース ファイルを開けません。'C:\Users\rti\Desktop\v8\tools\visual_studio\Debug\obj\v8_snapshot\\v8\DerivedSources\natives-empty.cc': No such file or directory
5>  snapshot.cc
5>c1xx : fatal error C1083: ソース ファイルを開けません。'C:\Users\rti\Desktop\v8\tools\visual_studio\Debug\obj\v8_snapshot\\v8_snapshot_cc\DerivedSources\snapshot.cc': No such file or directory
5>  コードを生成中...


これは、 VS2010 から(?)パスのチェックが厳しくなったために発生しています。
具体的には、 c:\\windows\ のように、 \ が二つ重なっていたパスをエラーとして弾くためです。アホですね。

仕方ないので、ファイルを修正します。
v8_snapshot.vcproj と v8_snapshot_x64.vcproj と v8_snapshot.vcxproj と v8_snapshot.vcxproj.filtersの4つを修正します。

//v8_snapshot.vcproj
RelativePath="$(IntDir)\..\v8\DerivedSources\natives-empty.cc"
↓
RelativePath="$(IntDir)..\v8\DerivedSources\natives-empty.cc"

//v8_snapshot_x64.vcproj
RelativePath="$(IntDir)\..\v8_snapshot_cc\DerivedSources\snapshot.cc"
↓
RelativePath="$(IntDir)..\v8_snapshot_cc\DerivedSources\snapshot.cc"

//v8_snapshot.vcxproj
<ItemGroup>
  <ClCompile Include="$(IntDir)\v8\DerivedSources\natives-empty.cc">
    <Filter>generated files</Filter>
  </ClCompile>
  <ClCompile Include="$(IntDir)\v8_snapshot_cc\DerivedSources\snapshot.cc">
    <Filter>generated files</Filter>
  </ClCompile>
</ItemGroup>
↓
<ItemGroup>
  <ClCompile Include="$(IntDir)..\v8\DerivedSources\natives-empty.cc">
    <Filter>generated files</Filter>
  </ClCompile>
  <ClCompile Include="$(IntDir)..\v8_snapshot_cc\DerivedSources\snapshot.cc">
    <Filter>generated files</Filter>
  </ClCompile>
</ItemGroup>

//v8_snapshot.vcxproj.filters
<ItemGroup>
  <ClCompile Include="$(IntDir)\v8\DerivedSources\natives-empty.cc">
    <Filter>generated files</Filter>
  </ClCompile>
  <ClCompile Include="$(IntDir)\v8_snapshot_cc\DerivedSources\snapshot.cc">
    <Filter>generated files</Filter>
  </ClCompile>
</ItemGroup>
↓
<ItemGroup>
  <ClCompile Include="$(IntDir)..\v8\DerivedSources\natives-empty.cc">
    <Filter>generated files</Filter>
  </ClCompile>
  <ClCompile Include="$(IntDir)..\v8_snapshot_cc\DerivedSources\snapshot.cc">
    <Filter>generated files</Filter>
  </ClCompile>
</ItemGroup>

気をとりなおして、もう一度 F7 でビルドしてみます。

4>ビルドに成功しました。
4>
4>経過時間 00:00:02.85
========== ビルド: 6 正常終了、0 失敗、3 更新不要、0 スキップ ==========

やった!今度は成功しました。

V8 ビルド終了

作られたバイナリは、以下のディレクトリに入っています。
v8\tools\visual_studio\Debug


v8\tools\visual_studio\Debug\d8.exe を起動すると、
対話型の javascript コンソールが立ち上がります。

とりあえずはここまで。
私たちは V8 engine を VS2010 でビルドすることができました。
お疲れさまでした。