
GNU Make の展開タイミングと黙って通る失敗
結論 make は Makefile をすべて読み込んで依存グラフを作ってから、レシピを実行する。:= の右辺、ルールの前提条件、include の作り直しは読み込みの段階で走る make は失敗をほとんど報告しない。未定義の変数は空文字になり、.PHONY に名前だけあるターゲットやファイルが既にあるターゲットは「やることなし」で exit 0 になる レシピは既定で /bin/sh が実行し、pipefail が無い。シェルのメタ文字が無い行はシェルすら通らない 前提条件の並び順は実行順ではない。順序は依存関係か .WAIT で書く 外から来た値を $(shell ...) に埋めると、値がコマンドとして実行される 以下のコードはすべて GNU Make 4.4.1 で実測した。 前提: 読み込みと実行の 2 段階 GNU make は 2 つの段階で動く。 読み込み: include 先を含む全 makefile を読み、変数とルールを取り込んで依存グラフを作る 実行: グラフから更新が要るターゲットを決め、レシピを実行する 展開には、読み込みの段階で行う「即時」と、値が使われるまで遅らせる「遅延」がある。 構文 即時に展開 遅延 VAR = value 左辺 右辺 (参照されるたびに展開) VAR ?= value 左辺 右辺 VAR := value 左辺と右辺 - target: prereq ターゲットと前提条件 - レシピ - 全体 以下の罠の多くは、この表と違うタイミングを想定して書いたときに起きる。...