ChakraCoreをビルドする


[ChakraCore](https://github.com/Microsoft/ChakraCore)が公開されました。
早速ビルドしてみましょう。

ChakraCoreはMicrosoft EdgeのJavaScriptエンジンのコア部分です。

# 短い結論

1. プラットフォームを`x64`か`x86`に変更
1. 3ファイルの文字コードをBOM付きUTF-8に変更
2. Releaseビルドに変更

# 環境

- VMware Fusion 8 
- Windows 7 Professinal 64 bit
- Visual Studio Community 2015 Update1

# 手順

## チェックアウト

```
git clone https://github.com/Microsoft/ChakraCore.git
```
## ソリューションを開く

`Build\Chakra.Core.sln`をVisual Studioで開きます。

### Visual C++用セットアップ

Visual C++ 用のコンポーネントがない場合は、次の警告が出ます。

```
インストール コンポーネントがないため、プロジェクト 'ch' を読み込めませんでした。修正するには、以下の選択をして Visual Studio セットアップを起動してください:
Install Visual C++ 2015 Tools for Windows Desktop
```

#### 対策

`ファイル(F)` > `新規作成(N)` > `プロジェクト(P)`から`テンプレート` > `Visual C++` > `Install Visual C++ 2015 Tools for Windows Desktop`を選びます。

#### 参考リンク

[C++/Visual Studio 2015 プログラミング](http://y-okamoto-psy1949.la.coocan.jp/booksetc/introvcpp/On_vs2015/)


### ビルドのプラットフォーム

ARM用にビルドするには`Windows 10 SDK`が必要です。
`x64`または`x86`に変更します。

#### 参考リンク
[Building ChakraCore · Microsoft/ChakraCore Wiki](https://github.com/Microsoft/ChakraCore/wiki/Building-ChakraCore)




### 文字コード

***この節の情報は古いです。最新のmasterは修正済みです。***


Microsoftらしからぬことに文字コードがBOM無しUTF-8です。
日本語OSでは文字コードを`CP932`に判定されるファイルがあります。
その場合は以下の警告が出ます。

```
警告	C4819	ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。
```

同時に次のエラーが出てビルドに失敗します。

```
エラー	C2220	警告をエラーとして扱いました。'object' ファイルは生成されません。
```

対策1か対策2のどちらかを行います。

#### 対策1 対象ファイルをBOM付きUTF-8で保存

`CP932`に判定されなくなります。
変更ファイルが次の三つで少ないのでこちらがおすすめです。

- lib/Runtime/Library/ArgumentsObject.h
- lib/Runtime/Library/MathLibrary.cpp
- lib/common/Memory/PageAllocator.h

1. 対象ファイルを開いて、`ファイル(F)` > `保存オプションの詳細設定(V)`を開く
![スクリーンショット 2016-01-16 4.46.42.png](https://qiita-image-store.s3.amazonaws.com/0/15964/4e62271e-f9b5-49d4-3c8c-077c13e23aea.png "スクリーンショット 2016-01-16 4.46.42.png")

1. `Unicode（UTF-8 シグネチャ付き）- コードページ 65001`を選択
![スクリーンショット 2016-01-16 4.49.08.png](https://qiita-image-store.s3.amazonaws.com/0/15964/6921fd2d-a64f-cd39-2970-1ee98aac53d8.png "スクリーンショット 2016-01-16 4.49.08.png")
1. `OK`をクリック


#### 対策2 対象プロジェクトのビルドオプションを変更する

対象プロジェクトから`/WX`フラグを消します。 
対象プロジェクトが多いので大変です。

1. プロジェクトのプロパティを開く
2. `構成プロパティ` > `C/C++` > `全般`を開く
3. `警告をエラーとして扱う`を`いいえ（/WX-）`に変更
![スクリーンショット 2016-01-16 4.40.58.png](https://qiita-image-store.s3.amazonaws.com/0/15964/f1170047-869c-56b1-2400-56ad3ac52fe8.png "スクリーンショット 2016-01-16 4.40.58.png")
1. `OK`をクリック

#### 参考リンク
[コンパイラ エラー C2220](https://msdn.microsoft.com/ja-jp/library/ksk5k0ta.aspx)

#### 本家対応済み
文字コードのissue。
[Compiler Error under Windows 7 SP1 32-bit Chinese Simplified · Issue #99 · Microsoft/ChakraCore](https://github.com/Microsoft/ChakraCore/issues/99)

Pull Request、マージ済み。
[Fix #99: Compiler Error under Windows 7 SP1 32-bit Chinese Simplified due to Encoding issue. by leejingbo · Pull Request #100 · Microsoft/ChakraCore](https://github.com/Microsoft/ChakraCore/pull/100)

ASCIIでない記号が入っているため、文字コードを`CP932`（OSの標準）として判定してしまうようです。
https://github.com/Microsoft/ChakraCore/pull/100/files

### ビルドの構成

次の	エラーが出ます。

```
エラー (アクティブ)		この定数式には、必要な型 "unsigned long long" ではなく型 "Js::OpCode" が指定されています
```

デバッグ用のコードです。

```C++
#if DBG_DUMP
        uint byteCodeDataSize;
        uint byteCodeAuxiliaryDataSize;
        uint byteCodeAuxiliaryContextDataSize;
        uint byteCodeHistogram[OpCode::ByteCodeLast];
        uint32 forinCache;
        uint32 forinNoCache;
#endif
```

#### 対策

ビルドの構成を`Release`に変更します。

### 参考リンク

[ChakraCoreをビルドしてC#から使うはじめの一歩 - ぷろじぇくと、みすじら。 - Misuzilla.org](http://www.misuzilla.org/Blog/2016/01/14/GettingStartedWithChakraCoreFromCSharp)