標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

Windows で使える make

mingw32-make.exe

MinGW でインストール可能な GNU Make。フルセットなので、一般によく読まれる make の解説記事どおりの Makefile を利用することができる。

問題としてはコマンド名が長くて、シェルでコマンド名を補完しようとすると mingw-get-setup.exeが邪魔で、最低 mingw3 とまで打たなくてはいけない。

UNIX系なのでドライブレター系パスの認識が懸念されるが、Makefile ではフルパスを使うことはないので心配する必要はないだろう

コマンドラインの解釈に CMD.EXE を使いたい時は明示的に SHELL:=CMD.EXE と書いておくのが安全だ。

nmake.exe

Visual Studio に入ってくる

  • 通常は Visual Studio Command Prompt の中からでないと PATH が通っていない場所にある (vcvarsall.bat などで PATH が通る)
  • 他の make と互換性のない独自拡張文法が多い
    • 実は Undocumented な拡張がある:SETコマンドが nmake 内蔵処理となっている
      • 設定された環境変数の値が次の行まで継続する
      • CMD.EXE のような SET "FOO=BAR" のような記述ができない
  • 添付元の Visual StudioVC++ のランタイムが必要(例:MSVCR100.DLL 、 VCRUNTIME140.DLL など…)

scoop でインストールできる make.exe

2021/05/15 現在、scoop install make を実行すると、make-4.3-without-guile-w32-bin.zip というパッケージがインストールされる。普通に GNU Make のようだ。一番、無難な make といえる。

どの make でも触りなく動作する Makefile を書くには?

検索したが、世の中 GNU make がほぼ標準扱いで、そういった資料はなかなかないが、「make posix」で検索するとかろうじて英語系のページが見つかる。

とりあえず、共通する特殊マクロをリストアップしてみたが、道はなかなか険しそうだ(ここで自分は諦めた)

特殊マクロ

機能 POSIX nmake 備考
$@ OK OK ターゲットファイル名
$? OK OK ターゲットファイルよりも新しい依存ファイルのリスト
$* OK※ OK 拡張子をのぞいたターゲットファイル名(※推論規則のコマンドでのみ有効な場合がある)
$% OK - ターゲットがライブラリファイル(*.a)の時にそのメンバー
$< OK - 依存ファイル(推論規則のコマンドでのみ有効)
$** - OK すべての依存ファイル