nmake と GNU Make の非互換性が大きすぎるので、Windows でポータブルな Makefile を書くのは、簡単なものでないと無理だろうなぁと思ってた (ゆえに多くの場合は簡単なバッチファイルで用をたしていた)
が、「GNU make nmake」でググってみると…あるもんだなぁ
どうやら
- nmake はコメント行の末尾の \ を認識しない ⇒ 次の行はコメントにならない
- GNU Make はコメント行の末尾の \ を行継続文字として認識する ⇒ 次の行はコメントになる
- nmake は !if ~ !else ~ !endif という条件文を認識する(GNU Make のは違う文法)
という違いを利用した技のようだ。これでマクロくらいは nmake と GNU Make で変えることが出来るようだ。ちょっと書いてみよう
# NMAKE code here \ !ifndef 0 # \ ECHO=echo #\ !else # Make code here ECHO=cmd /c echo # \ !endif all : $(ECHO) $(MAKE)
nmake は CMD.EXE をシェルとして呼び出すので、echo は内蔵コマンドとして呼べるが、GNU Make は sh を使おうとするので、echo.exe がパスにとっていなければ cmd.exe /c echo という形にしないといけない。実行結果は次のとおり:
$ nmake Microsoft (R) Program Maintenance Utility Version 10.00.30319.01 Copyright (C) Microsoft Corporation. All rights reserved. echo C:\Users\hymko\Share\bin\nmake.exe C:\Users\hymko\Share\bin\nmake.exe $ mingw32-make.exe cmd /c echo C:/TDM-GCC-64/bin/mingw32-make C:/TDM-GCC-64/bin/mingw32-make
お、おう…