ロクでもない用語法
あまりの酷さに、ほんとにムカムカしてきた。
- 公式マニュアルでは、ゴールとターゲットが区別されているが、通常は区別されない。ターゲットは構文上の概念。ゴールは実行時の動的概念。違う!!
- ルール内での役割としてのターゲット(左辺)と、依存関係グラフにおける非湧き出しノードがある。(ここではビルドフローの流れに対して湧き出しと吸い込みを考えている。)二者は違う概念。
- 有向グラフのトポロジーからは、(フローの)湧き出しノードと中間ノードと吸い込みノード=シンクノードがある。
- 非ターゲットノード(ソースノード)と湧き出しノードは異なる概念。ターゲットである湧き出しノードが存在する。
- つまり、湧き出しノードが(ルールの)ターゲットになることがあるのだ。この場合は、ノードはタスクを意味することが多い。
- 非ソース=ターゲットである湧き出しノードは、稀に、一度だけ作るファイル(例:README.md, .gitignor)のこともある。そのレシピは一度だけ作る作り方。
- ターゲットである湧き出しノードにレシピがないことは許される(エラーにならない)。レシピなしは一般的に許されることだ。
- ターゲットである湧き出しノードに空レシピは許される。(一般的に許される)
「レシピがない」の意味も色々ある。
- 特定の(構文上の)ルールにレシピがないのは特に問題ではない。同じターゲットを持つ他のルールからレシピが供給されるかも知れない。
- 特定のターゲットに対して、どのルール(パターンルール含む)からもレシピが供給されないなら、そのターゲットにレシピはない。Makeはエラーとは考えない。
- ターゲットは空なレシピを持つことができる。空なレシピはパターンルールからのレシピの供給を排除できる。が極めて奇妙な挙動を誘発する(別に書く→ ロクでもない仕様とロクでもないメッセージ:レシピがないとき - 檜山正幸のキマイラ飼育記 メモ編)。
あまり考えもなく作ったものを、行き当たりばったりで拡張するとこんなことになるのだろう。一番の悲劇は、他のツールがもっとダメなことだ。