Visual Studio 2013 で Vim をビルドする

Visual Studio 2013 で Vim をビルドする。

必要なもの
==========

- Visual Studio Express 2013 for Windows Desktop

  紛らわしいが、for Windows Desktop の方。for Windows は Modern UI アプリ用。

> http://www.visualstudio.com/downloads/download-visual-studio-vs#d-express-windows-desktop

- Git

  ソースを引っ張ってきたり、パッチを当てたりする。本来は Mercurial を使うべきだが、詳しくない為 Git で代用。

ソースの準備、パッチ適用
========================

Vim 本家のリポジトリは Mercurial なので、vim-jp がミラーしている github のリポジトリからクローンする。

```shell:
git clone https://github.com/vim-jp/vim.git
```

パッチの入手
------------

ビルドしておく前に必要に応じて便利なパッチを当てておくといろいろと捗る。代表的なものに kaoriya さんのパッチがある。kaoriya さんが配布されているバイナリには一部の独自仕様が含まれているが、そのパッチがバイナリと共に配布されており、また以下のリポジトリにも公開されている。

> https://bitbucket.org/koron/vim-kaoriya-patches/src

また [vim-jp の issues](https://github.com/vim-jp/issues/issues) で多くのパッチを書かれている k-takata さんもパッチのリポジトリを公開されている。

> https://bitbucket.org/k_takata/vim-ktakata-mq/src

[vim-jp の issues](https://github.com/vim-jp/issues/issues) では Vim に対する提案やバグ報告が日本語で行われており、新機能やバグ修正のパッチが作成されることもあるので、気になるトピックは覗いてみるといいかもしれない。

パッチの適用
------------

`git apply` する。`patch -Np1` でもいいが、バイナリパッチの適用ができない為 kaoriya さんのアイコンをリッチにするパッチなどが扱えない。

参考までに、[自分で Vim に適用しているパッチを集めたリポジトリ](https://github.com/0xBADDCAFE/vim-patches.git)を公開した（ 7.4.205 まで適用できることを確認済)。

```shell:
cd vim
git clone https://github.com/0xBADDCAFE/vim-patches.git
git apply --check vim-patches/*.diff
git apply vim-patches/*.diff
```

ビルド環境
==========

Visual Studio 2013 はインストールしておく。

win32.mak がない
-----------------

この段階でビルドしようとすると win32.mak が無くビルドできないので、以下の対策をとる。

> Visual Studio 2012 および Windows SDK for Windows 8 の製品構成には win32.mak, ntwin32.mak が含まれません
> http://support.microsoft.com/kb/2791460/ja
> 
> > 回避策2
> > 
> > Visual Studio 2012を使用していない場合には、以下のダウンロードサイトより
> > Windows SDK 7.1 をダウンロードして当該環境にインストールします。
> > 
> > Microsoft Windows SDK for Windows 7 and .NET Framework 4
> > http://www.microsoft.com/en-us/download/details.aspx?id=8279

以下はのちのビルド時に設定する。

> > win32.mak と ntwin32.makが展開された Include フォルダのパスを、コンパイル実行時のインクルード ファイルの参照先として追加します。
> > nmake コマンドを実行するコマンド プロンプトで、事前に以下のコマンドを実行します。
> > 追加するパスは SDK v7.1 のインストール フォルダに応じて適宜変更します。
> > 
> > SET Include=%Include%;C:\Program Files\Microsoft SDKs\Windows\v7.1\Include

インストールするものは最低限に絞ると、画像の通り。
![SDK.png](https://qiita-image-store.s3.amazonaws.com/0/21297/29c1d9dc-f425-35b2-6589-389f9fb100ee.png)

インストールに失敗する場合、VC 2010 再配布パッケージ的なものをすべて消し去っておく。

> Windows SDK Fails to Install with Return Code 5100
> http://support.microsoft.com/kb/2717426

ビルド
------

手始めにコマンドプロンプトから vcvarsall.bat を実行する。これは `C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat` (64bit の場合) とかに置いてあり、環境変数やコンパイラのパスなどをよしなにしてくれる。引数に x86 や x86_amd64 と指定する必要があり、クロスコンパイルの指定はここで行う。詳細は中身を読んでほしい。

> 方法: 64 ビットの Visual C++ ツールセットをコマンド ラインから有効にする
> http://msdn.microsoft.com/ja-jp/library/x4d2c09s.aspx

上記にあった SDK v7.1 のインクルードの設定も、この辺りで行っておく。

これらを毎回行うのがめんどくさいので、私の場合バッチファイルに適当にまとめ、src/ 以下で実行したらいい感じにコマンドプロンプトが開くようにしている。

> https://gist.github.com/0xBADDCAFE/9860950#file-inc-bat

環境が整ったらビルドする。ビルドコマンドというかコンパイルオプションなどについては詳しい既存記事があるので割愛する。

> vim-jp » VisualStudio10を使ってのビルド方法
> http://vim-jp.org/docs/build_windows_msvc.html

この辺りも毎回ビルドするたびに打つのもバカらしいのでバッチファイルにしている。
ついでに CUI、GUI 版連続でビルドする。

> https://gist.github.com/0xBADDCAFE/9861126#file-buildmsvc2013-bat

以上でビルド完了。gvim.exe や vim.exe と runtime/ 以下を適当に配置するなり既存の環境に上書きするなりする。

XP 用のバイナリ
---------------

Visual Studio 2012 辺りから標準では XP で実行できるバイナリが作れなくなったらしく、今回の手順で生成したバイナリも例外ではない。

これに対応するには、下記の必要がある。

1. コンパイル時に CFLAGS に -D_USING_V110_SDK71_ を追加する

2. リンク時に LINKARGS1 に /subsystem:$(SUBSYSTEM),5.01 を追加する
  `*` $(SUBSYSTEM) は console、windows のいずれか

`1.` については上記バッチファイル、`2.` についてはリポジトリ中のパッチ `build_for_XP_on_msvc2013.diff` で雑に対応し、x86 を指定してコンパイルした場合は XP 対応のバイナリとなるようにしている。まあ 64bit の XP は絶滅危惧種なので…。


> Windows XP Targeting with C++ in Visual Studio 2012 - Visual C++ Team Blog - Site Home - MSDN Blogs
> http://blogs.msdn.com/b/vcblog/archive/2012/10/08/10357555.aspx?PageIndex=3


まとめ
======

[Visual Studio 2010](http://www.visualstudio.com/downloads/download-visual-studio-vs#d-cpp-2010-express) を使いましょう。

あと自分でビルドすることには意義があって、最新のパッチや、上記で紹介した issues の開発中のパッチが正しく動いているか試したりすることができるので、開発に貢献したいけどコードを書き上げる能力がない、という人は是非試してみて下さい。