NeovimをVisual Studio 2017でコンパイルする。

必要要件

  • Windowsのシステムロケールを「英語(米国)」に変更しておく。
  • Git for Windowsをインストールし、パスを通しておく。
  • CMakeをインストールし、パスを通しておく。
  • 必要に応じてPython2、Python3、RubyおよびNode.jsをインストールし、パスを通しておく。特にShougo/dein.vimを使う場合にはPython3は必須となる。
  • gettext0.19.8.1-iconv1.15-shared-64.zipをダウンロードしておく。
  • Neovimインストーラを作成する場合にはNSISをインストールしておく。
パスについては、
setx GITPATH=C:\Program Files\Git\bin;C:\Program Files\Git\usr\bin;C:\Program Files\Git\mingw64\bin
setx CMAKEPATH=C:\Program Files\CMake\bin
setx PATH=%PATH%;%GITPATH%;%CMAKEPATH%
などとしておきます。こうしておくと、Git for Windowsに同梱されているMSYS系のコマンド (cpやpatchなど) が使えるようになります。CygwinやMSYSなどを別途インストールしておく必要はありません。

ビルドオプション

以下の条件でビルドします。
  • x64-Release
  • +iconv、+tui、-acl、-jemalloc
  • 作業は %USERPROFILE%/build ディレクトリで行う。
  • インストール先は c:\Apps\Neovim とする。
  • MSBuild を使うので、作業は「VS2017用 x64 Native Toolsコマンドプロンプト」で行う。(iconvは除く)

準備: libiconvのコンパイル

cd %USERPROFILE%\build
git clone https://github.com/kiyolee/libiconv-win-build
cd libiconv-win-build/build-VS2017-MT
  1. ここにある libiconv.sln をダブルクリックしてVS2017を起動する。
  2. このままビルドすると「Windows SDKバージョンが違う」というエラーが出るので、それぞれのプロジェクトのプロパティから変更する。
  3. 「Release」「x64」を選択してビルドする。

準備: 依存ライブラリのコンパイル

cd %USERPROFILE%\build
git clone https://github.com/neovim/neovim
cd neovim
mkdir .deps
mkdir build
cd .deps
"\Program Files\CMake\bin\CMAKE.exe" -G "Visual Studio 15 2017 Win64" ..\third-party
MSbuild ALL_BUILD.vcxproj /p:Configuration=Release
2018/5/1現在のmasterでは libuv にパッチが追加されたもののパッチできないため、libuv のコンパイルが失敗します。その場合にはなんとか自力で (libuv.vcprojなどを見ながら手動で) コンパイルしておきます。
ここまででツリー構造は以下のようになっているはずです。.deps以下にディレクトリが作られ、依存ライブラリはここにコピーされています。

build -+- neovim -+- .deps -- usr -+- bin
       |          |                +- include
       |          |                +- lib
       |          |
       |          +- build
       |
       +- libiconv-win-build -+- include -- iconv.h
                              +- build-VS2017-MT -- x64 -- Release -+- libiconv.dll
                                                                    +- libiconv.lib
                                                                    +- iconv.exe

ここで、iconvのヘッダファイルとDLLをコピーします。
cd %USERPROFILE%\build\neovim\.deps
copy ..\..\libiconv-win-build\include\iconv.h usr\include
copy ..\..\libiconv-win-build\build-VS2017-MT\x64\Release\iconv.exe usr\bin
copy ..\..\libiconv-win-build\build-VS2017-MT\x64\Release\libiconv.dll usr\bin
copy ..\..\libiconv-win-build\build-VS2017-MT\x64\Release\*.lib usr\lib

また、ダウンロードしてある gettext0.19.8.1-iconv1.15-shared-64.zip を展開して libintl-8.dll を取り出し、usr\bin にコピーしておきます。

準備: cmakeファイルの変更

cmakeが libiconv と libintl を見つけられるようにcmakeファイルを変更します。
--- cmake\FindIconv.cmake.orig Wed Apr 18 18:08:38 2018
+++ cmake\FindIconv.cmake Wed Apr 18 18:05:32 2018
@@ -8,7 +8,7 @@
 include(LibFindMacros)
 
 find_path(ICONV_INCLUDE_DIR NAMES iconv.h)
-find_library(ICONV_LIBRARY NAMES iconv)
+find_library(ICONV_LIBRARY NAMES iconv libiconv libiconv-2)
 
 set(Iconv_PROCESS_INCLUDES ICONV_INCLUDE_DIR)
 if(ICONV_LIBRARY)
--- cmake\FindLibIntl.cmake.orig Wed Apr 18 18:08:28 2018
+++ cmake\FindLibIntl.cmake Wed Apr 18 18:04:29 2018
@@ -27,7 +27,7 @@
 )
 
 find_library(LibIntl_LIBRARY
-    NAMES intl libintl
+    NAMES intl libintl libintl-8
 )
 
 if (LibIntl_INCLUDE_DIR)

パッチは %USERPROFILE%\neovim ディレクトリで行います。上記のdiffを cmake.patch という名前で保存し、
cd %USERPROFILE%\neovim
patch -p0 < cmake.patch
でパッチがあたります。patch コマンドはGit for Windowsに含まれています。

Neovimをビルドする

cd %USERPROFILE%\build\neovim\build
"\Program Files\CMake\bin\CMAKE.exe" -DCMAKE_BUILD_TYPE=RelWithDebInfo -CMAKE_INSTALL_PREFIX=\Apps\Neovim -G "Visual Studio 15 2017 Win64" ..
MSbuild ALL_BUILD.vcxproj /p:Configuration=Release
ConfigurationRelease もしくは RelWithDebInfo を指定します。

Neovimをデプロイする

前の記事ではちまちまコピーしていたのでいっそ cp なんかを使ってスクリプトでも作ろうかと思ったのですが、INSTALL.vcxproj を使います。
cd %USERPROFILE%\build\neovim\build
MSbuild INSTALL.vcxproj /p:Configuration=Release
これで -CMAKE_INSTALL_PREFIX= で指定した場所にデプロイされます。ここでは c:\Apps\Neovim になっています。

Neovimインストーラを作成する

NSIS (Nullsoft Scriptable Install System) を使って、Neovim.exeという形でインストーラを作成できます。NSISはインストールしておけばパスを通す必要はないようです。
cd %USERPROFILE%\build\neovim\build
MSbuild PACKAGE.vcxproj /p:Configuration=Release
これで %USERPROFILE%\buildNeovim.exe が生成されます。 これは-CMAKE_INSTALL_PREFIX= で指定した場所ではなく、c:\Program Files\Neovim にインストールされるようです。
また証明書のついていないインストーラなので、セキュリティポリシーを上げたWindowsではインストールできないかもしれません。

以上で一通りNeovimのビルドは終わりです。
Have a good Neovim life!

0 件のコメント:

コメントを投稿

Windowsでシンボリックリンクを試してみる。

きっかけは、1つのファイルを別の名前で起動したら違う動きになるようなスクリプトを書く、でした。  busybox なんかでは、同じ実行形式ファイルの名前を、lsにすればlsと同じ、cpとすればcpと同じ動作をするようにしてますが、Pythonスクリプトでそれと同じように argv...