読者です 読者をやめる 読者になる 読者になる

Microsoft Visual Studio 14.0でVimをビルドする。

今までMacBook AirのTerminal上でvimをビルドするか、もしくはWindowsMinGWでビルドしていました。 今回、Microsoft Visual Studio 14.0でビルドをしてみました。 で、ビルドしてみたけど結構はまりどころがあったのでここに適当にまとめます。

まず、最終的にできた私のビルドスクリプトを載せておきます。

vimbuild.bat

@echo off

set PATH=%SystemRoot%
set PATH=%PATH%;%SystemRoot%\System32
set PATH=%PATH%;%SystemRoot%\System32\Wbem
set PATH=%PATH%;C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin

set INCLUDE=
set LIBPATH=

call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\vcvars32.bat"

set OPT1= IME=yes MBYTE=yes ICONV=yes CSCOPE=yes NETBEANS=no
set OPT2= PLATFORM=x86 SDK_INCLUDE_DIR="C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include" XPM=no

pushd .\vim\src
nmake -f Make_mvc.mak %OPT1% %OPT2% GUI=no clean
nmake -f Make_mvc.mak %OPT1% %OPT2% GUI=yes clean
nmake -f Make_mvc.mak %OPT1% %OPT2% GUI=no
nmake -f Make_mvc.mak %OPT1% %OPT2% GUI=yes
popd

はまりどころ

Microsoft Visual Studio 14.0でVimをビルドする上で注意した方がいいオプションが以下になります。

INCLUDE, LIBPATH

これは直接的にはVimに関係ないけど、vcvars32.batINCLUDELIBPATHにどんどん値を追加していくようになっていて、 vcvars32.batを20回くらい呼ぶと限界を超え、以下のエラーになります。

入力行が長すぎます。
コマンドの構文が誤っています。

なので、vcvars32.batを呼ぶ前に初期化しておくとよいです。

set INCLUDE=
set LIBPATH=

call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\vcvars32.bat"

PLATFORM

私のビルド環境がPLATFORM=MCDだったのですが、Make_mvc.makはMCDのプラットフォームに対応してないっぽいので 以下のエラーになってしまいました。

Microsoft(R) Program Maintenance Utility Version 14.00.23918.0
Copyright (C) Microsoft Corporation.  All rights reserved.

Make_mvc.mak(228) : fatal error U1050: *** ERROR Unknown target platform "MCD". Make aborted.
Stop.

なので、私は対応しているPLATFORM=x86にして対処してみました。

PLATFORM=x86

SDK_INCLUDE_DIR

ビルドにはWin32.makを必要らしく、SDK_INCLUDE_DIRを設定していないと以下のエラーになってしまいます。

Microsoft(R) Program Maintenance Utility Version 14.00.23918.0
Copyright (C) Microsoft Corporation.  All rights reserved.

Make_mvc.mak(254) : fatal error U1052: ファイル 'Win32.mak' が見つかりません。
Stop.

なので、SDK_INCLUDE_DIRWin32.makがあるフォルダを指定します。

SDK_INCLUDE_DIR="C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include"

XPM

Vimはpre-compiledなXPMがレポジトリに含まれていて、それがLIBC.libにリンクしているみたいです。

最近のMicrosoft Visual StudioはLIBC.libを含んでいないため、以下のようなエラーが出てしまいます。

link /RELEASE /nologo /subsystem:windows /LTCG:STATUS -out:gvim.exe .\ObjGi386\blowfish.obj  .\ObjGi386\buffer.obj
.\ObjGi386\charset.obj  .\ObjGi386\crypt.obj  .\ObjGi386\crypt_zip.obj  .\ObjGi386\diff.obj  .\ObjGi386\digraph.obj
.\ObjGi386\edit.obj  .\ObjGi386\eval.obj  .\ObjGi386\ex_cmds.obj  .\ObjGi386\ex_cmds2.obj  .\ObjGi386\ex_docmd.obj
.\ObjGi386\ex_eval.obj  .\ObjGi386\ex_getln.obj  .\ObjGi386\fileio.obj  .\ObjGi386\fold.obj  .\ObjGi386\getchar.obj
.\ObjGi386\hardcopy.obj  .\ObjGi386\hashtab.obj  .\ObjGi386\json.obj  .\ObjGi386\main.obj  .\ObjGi386\mark.obj
.\ObjGi386\mbyte.obj  .\ObjGi386\memfile.obj  .\ObjGi386\memline.obj  .\ObjGi386\menu.obj  .\ObjGi386\message.obj
.\ObjGi386\misc1.obj  .\ObjGi386\misc2.obj  .\ObjGi386\move.obj  .\ObjGi386\normal.obj  .\ObjGi386\ops.obj  .\ObjGi386\option.obj
.\ObjGi386\os_mswin.obj  .\ObjGi386\winclip.obj  .\ObjGi386\os_win32.obj  .\ObjGi386\pathdef.obj  .\ObjGi386\popupmnu.obj
.\ObjGi386\quickfix.obj  .\ObjGi386\regexp.obj  .\ObjGi386\screen.obj  .\ObjGi386\search.obj  .\ObjGi386\sha256.obj
.\ObjGi386\spell.obj  .\ObjGi386\syntax.obj  .\ObjGi386\tag.obj  .\ObjGi386\term.obj  .\ObjGi386\ui.obj  .\ObjGi386\undo.obj
.\ObjGi386\window.obj  .\ObjGi386\vim.res .\ObjGi386\gui.obj  .\ObjGi386\gui_beval.obj  .\ObjGi386\gui_w32.obj  .\ObjGi386\os_w32exe.obj
.\ObjGi386/if_cscope.obj  .\ObjGi386/channel.obj  .\ObjGi386/xpm_w32.obj .\ObjGi386\version.obj oldnames.lib kernel32.lib advapi32.lib
shell32.lib gdi32.lib  comdlg32.lib ole32.lib uuid.lib /machine:i386 gdi32.lib version.lib   winspool.lib comctl32.lib advapi32.lib
shell32.lib  /machine:i386  libcmt.lib  user32.lib          WSock32.lib xpm\x86\lib\libXpm.lib /PDB:gvim.pdb -debug
LINK : fatal error LNK1104: ファイル 'LIBC.lib' を開くことができません。
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\link.EXE"' : リターン コード '0x450'
Stop.

なので、XPM=noにして対処しました。

環境