LoginSignup
7
6

More than 5 years have passed since last update.

Windows下でmake.exeを使うとき、sh.exeが動作してしまう問題

Last updated at Posted at 2016-01-07

http://www.equation.com/servlet/equation.cmd?fa=make で配布されているGNU Makeでは解決できるようですが、MinGWのGNU Makeで試したところ上手く作動しないようです。

Windows下でmakeを使うときに、cmdではなくsh.exeが動いてしまう問題があります。

問題の発生するMakefile

下のような内容のMakefileが存在するとします。

Makefile
test: Makefile
    IF NOT EXIST test ( mkdir test )

Makefileの内容は、testディレクトリがなければtestディレクトリを作り、存在していれば作らない、といったものです。
見て分かる通り、バッチスクリプト的なコマンドプロンプトの構文がMakefile内に含まれており、Windowsのコマンドプロンプトにコマンドを投げる前提で書かれています。

このMakefileが存在するディレクトリで以下のようなコマンドを打ちます。
make test

通常であれば、ディレクトリ下にtestディレクトリが作成される、もしくは既に存在していれば何もしません。
しかし、次のようなエラーが表示されることがあります。

sh.exe : -c : line 0: syntax error near unexpected token `(' 
sh.exe : -c : line 0: 'IF NOT EXIST test ( mkdir test )' 

これはMakefile内に書かれているコマンドをsh.exeが解釈できないため、発生しているエラーです。

問題の根幹

おそらく、問題が発生する原因はmake.exeがコマンドを実行するシェルを指定するときに、sh.exeを優先した結果だと考えられます。
解決方法としては、sh.exeへのpathを消すことで、make.exeにsh.exeを発見させない方法が考えられますが、環境によっては別の問題が発生してしまいます。

Makefileでシェルの指定

pathの設定を変更しなくても、Makefileにシェルの指定する文を1行加えるだけで解決します。
次が修正したMakefileになります。

Makefile
SHELL=cmd

test: Makefile
    IF NOT EXIST test ( mkdir test )

SHELL=cmdと1行加えることで、コマンドプロンプトが指定され問題なく動作するようになります。

7
6
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6