http://www.equation.com/servlet/equation.cmd?fa=make で配布されているGNU Makeでは解決できるようですが、MinGWのGNU Makeで試したところ上手く作動しないようです。
Windows下でmakeを使うときに、cmdではなくsh.exeが動いてしまう問題があります。
#問題の発生する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になります。
SHELL=cmd
test: Makefile
IF NOT EXIST test ( mkdir test )
SHELL=cmdと1行加えることで、コマンドプロンプトが指定され問題なく動作するようになります。