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

以前にNeovimをVisual Studio 2017でコンパイルする。を書いていますが、ちょうど1年経ったことでもあるので、アップデートしてみます。
前提条件ですが、うちでは c:/Apps/Neovim 以下にインストールしていますので、新規ビルドは c:/Apps/Neovim-new にインストールしてから最後にディレクトリ名を変更する形にします。

Neovimをコンパイルする

CMakeのおかげもあって、ものすごく楽になっています。
以前にあった C4819 警告(データの損失を防ぐために、ファイルを Unicode 形式で保存してください。)は出ますが、これは 「ベータ: ワールドワイド言語サポートでUnicode UTF-8を使用(U)」をセットしておくか、Windowsのシステムロケールを「英語(米国)」に変更しておくことで回避できます。お勧めは後者のシステムロケールの変更です。
$ git clone https://github.com/neovim/neovim
$ cd neovim
neovim$ make CMAKE_BUILD_TYPE=Release CMAKE_INSTALL_PREFIX=c:/Apps/Neovim-new
で依存ライブラリまで含めてすべてビルドしてくれます。
ビルドが終わったら
neovim$ make install
です。

Neovim-Qtをコンパイルする

equalsraf/neovim-qtは活発な開発という段階は終わって、API への対応があるくらいでほぼ安定ということなのでしょう、最後のコミットも3ヶ月以上前です。
ただ、Neovim の Windows バイナリに同梱されている Neovim-Qt は 32bit 版なので、好みの問題でしょうが 64bit 版をコンパイルします。

README.mdには
$ mkdir build
$ cd build
$ cmake -G "Visual Studio 14" -DCMAKE_BUILD_TYPE=Release ..
$ cmake --build . --config Release --target install
とありますが、自分の環境ではこれだけではコンパイルできないのでまとめです。

Qt5 は c:\Apps\Qt\ 以下にインストールしています。バージョンは 5.12.2 で、C:\Apps\Qt\5.12.2\msvc2017_64\binをパスに追加しています。これがないと WinDeployQt.exe を見つけられなくてエラーになります。

また CMake は 3.14.4 でパスを通しています。
$ git clone https://github.com/equalsraf/neovim-qt
$ cd neovim-qt
neovim-qt$ mkdir build
$ cd build
build$ set CMAKE_PREFIX_PATH=C:/Apps/Qt/5.12.2/msvc2017_64/lib/cmake/Qt5Core;C:/Apps/Qt/5.12.2/msvc2017_64/lib/cmake/Qt5Gui;C:/Apps/Qt/5.12.2/msvc2017_64/lib/cmake/Qt5Svg;C:/Apps/Qt/5.12.2/msvc2017_64/lib/cmake/Qt5Network;C:/Apps/Qt/5.12.2/msvc2017_64/lib/cmake/Qt5Widgets;C:/Apps/Qt/5.12.2/msvc2017_64/lib/cmake/Qt5Test
build$ cmake -G "Visual Studio 16" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=c:/Apps/Neovim-new ..
build$ cmake --build . --config Release
ここで msgpack-cpp-3.0.1 が C2220 エラーを出してビルドがエラー終了します。なので CMakeLists.txt にパッチを当てます。
neovim-qt$ diff -rub third-party/CMakeLists.txt.orig third-party/CMakeLists.txt
--- third-party/CMakeLists.txt.orig     Sat May 18 09:56:59 2019
+++ third-party/CMakeLists.txt  Sat May 18 09:53:11 2019
@@ -13,17 +13,17 @@
 set(MSGPACK_URL https://github.com/msgpack/msgpack-c/archive/cpp-${MSGPACK_VERSION}.tar.gz)
 set(MSGPACK_SHA256 1b834ab0b5b41da1dbfb96dd4a673f6de7e79dbd7f212f45a553ff9cc54abf3b)

-message(STATUS "Downloading Msgpack...")
-set(MSGPACK_TARBALL msgpack-${MSGPACK_VERSION}.tar.gz)
-file(DOWNLOAD ${MSGPACK_URL} ${CMAKE_CURRENT_SOURCE_DIR}/${MSGPACK_TARBALL}
-       INACTIVITY_TIMEOUT 30
-       EXPECTED_HASH SHA256=${MSGPACK_SHA256})
-execute_process(COMMAND ${CMAKE_COMMAND} -E tar xfz ${MSGPACK_TARBALL}
-       WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
-       RESULT_VARIABLE rv)
-if(NOT rv EQUAL 0)
-  message(FATAL_ERROR "Failed to extract ${MSGPACK_TARBALL}")
-endif()
+#message(STATUS "Downloading Msgpack...")
+#set(MSGPACK_TARBALL msgpack-${MSGPACK_VERSION}.tar.gz)
+#file(DOWNLOAD ${MSGPACK_URL} ${CMAKE_CURRENT_SOURCE_DIR}/${MSGPACK_TARBALL}
+#      INACTIVITY_TIMEOUT 30
+#      EXPECTED_HASH SHA256=${MSGPACK_SHA256})
+#execute_process(COMMAND ${CMAKE_COMMAND} -E tar xfz ${MSGPACK_TARBALL}
+#      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+#      RESULT_VARIABLE rv)
+#if(NOT rv EQUAL 0)
+#  message(FATAL_ERROR "Failed to extract ${MSGPACK_TARBALL}")
+#endif()

 set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR})
 set(MSGPACK_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/msgpack-c-cpp-${MSGPACK_VERSION}/)
上のパッチを当てておかないと、修正しても上書きされてしまいます。
neovim-qt$ diff -rub third-party/msgpack-c-cpp-3.0.1/CMakeLists.txt.orig third-party/msgpack-c-cpp-3.0.1/CMakeLists.txt
--- third-party/msgpack-c-cpp-3.0.1/CMakeLists.txt.orig Sat May 18 09:57:13 2019
+++ third-party/msgpack-c-cpp-3.0.1/CMakeLists.txt      Sat May 18 09:53:42 2019
@@ -251,9 +251,9 @@

 IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
     IF (CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
-        STRING(REGEX REPLACE "/W[0-4]" "/W3 /WX" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
+        STRING(REGEX REPLACE "/W[0-4]" "/W3" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
     ELSE ()
-        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3 /WX")
+        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3")
     ENDIF ()
 ENDIF ()
また、ソースの方では test/tst_neovimconnector.cpp が文字コードの関係でエラーになります。
neovim-qt$ diff -rub test/tst_neovimconnector.cpp.orig test/tst_neovimconnector.cpp
--- test/tst_neovimconnector.cpp.orig   Sat May 18 10:40:47 2019
+++ test/tst_neovimconnector.cpp        Sat May 18 12:00:12 2019
@@ -40,7 +40,7 @@
                NeovimConnector *c = NeovimConnector::spawn({"-u", "NONE"});

                // This will print a warning, but should succeed
-               QString s = "ç日本語";
+               QString s = "nihongo";
                QByteArray bytes = c->encode(s);
                QCOMPARE(c->decode(bytes), s);

そうしたらビルド&インストールします。Neovimよりもあとにインストールすることで、32bit バイナリも上書きしてくれます。
build$ cmake --build . --config Release --target install
実際には本来不要なものまでインストールされますが、気になる場合には本家のビルドとファイルを比べて削除すればよいでしょう。

0 件のコメント:

コメントを投稿

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

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