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 のリポジトリからクローンする。
git clone https://github.com/vim-jp/vim.git
パッチの入手
ビルドしておく前に必要に応じて便利なパッチを当てておくといろいろと捗る。代表的なものに kaoriya さんのパッチがある。kaoriya さんが配布されているバイナリには一部の独自仕様が含まれているが、そのパッチがバイナリと共に配布されており、また以下のリポジトリにも公開されている。
また vim-jp の issuesで多くのパッチを書かれている k-takata さんもパッチのリポジトリを公開されている。
vim-jp の issuesでは Vim に対する提案やバグ報告が日本語で行われており、新機能やバグ修正のパッチが作成されることもあるので、気になるトピックは覗いてみるといいかもしれない。
パッチの適用
git apply
する。patch -Np1
でもいいが、バイナリパッチの適用ができない為 kaoriya さんのアイコンをリッチにするパッチなどが扱えない。
参考までに、私が今 Vim に適用しているパッチを集めたリポジトリを公開してみた。これらは 7.4.205 まで適用できることを確認しているので、興味があれば試してみるといいかもしれない。
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
インストールするものは最低限に絞ると、画像の通り。
インストールに失敗する場合、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/ 以下で実行したらいい感じにコマンドプロンプトが開くようにしている。
環境が整ったらビルドする。ビルドコマンドというかコンパイルオプションなどについては詳しい既存記事があるので割愛する。
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 で実行できるバイナリが作れなくなったらしく、今回の手順で生成したバイナリも例外ではない。
これに対応するには、下記の必要がある。
コンパイル時に CFLAGS に -D_USING_V110_SDK71_ を追加する
リンク時に 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を使いましょう。
あと自分でビルドすることには意義があって、最新のパッチや、上記で紹介した issues の開発中のパッチが正しく動いているか試したりすることができるので、開発に貢献したいけどコードを書き上げる能力がない、という人は是非試してみて下さい。