Windowsでcmakeとmake、gitを併用した時にハマった問題。
chocolateyでmsys2とmakeをインストール。
その後MinGW64のターミナルでpacmanでcmakeとgitをインストール。
ここまでは良いのだけど、一部のgitコマンドを使う時に以下のようなエラーメッセージが表示されました。
‘git submodule update –init ‘ returns fatal: ‘submodule’ appears to be a git command, but we were not able to execute it. Maybe git-submodule is broken?
これはsubmoduleコマンドの例だけど、他のコマンドでも表示されるようす。でもgit statusなどは大丈夫。
これ実はgitの一部のサブコマンドはシェルスクリプトで実装されていて、それがシェルとしてshを使用しているのにMinGW環境にshがインストールされていない事から表示されるようです。
シェルスクリプトの実態は/usr/lib/git-core/git-***として存在します。リストを見ると分かる通り、ほとんどのコマンドは*.exe形式なのに、git-submoduleやgit-stashなどはシェルスクリプトで実装されています。
そしてシェルスクリプトの中を見ると一行目に以下のコマンドが。
!/bin/sh
そしてMinG64のターミナルで “which sh” とすると、どこにも見つからないよと言われます。
よっしゃよっしゃ、sh.exeをインストールすればええんやな~とpacmanでsh.exeをインストールするとgitは動くようになるけど、今度はcmakeが以下のエラーを。
CMake Error at C:/tools/msys64/mingw64/share/cmake-3.8/Modules/CMakeMinGWFindMake.cmake:12 (message):
sh.exe was found in your PATH, here:C:/tools/msys64/usr/bin/sh.exe
For MinGW make to work correctly sh.exe must NOT be in your path.
Run cmake from a shell that does not have sh.exe in your PATH.
If you want to use a UNIX shell, then use MSYS Makefiles.
理由は書いてある通り、sh.exeへのパスが通っているとcmakeはエラーになるらしい。しかしgitのシェルスクリプトはshを必要とするわけで、そこで致し方なくgitのシェルスクリプトをbash.exeを参照するように書き換えて無事解決しました。