諸悪の根源は擬似ターゲット その3:名前空間の問題
擬似ターゲットの問題のさらにその奥には、名前空間と名前の取り扱いの問題がある。
makeはリソース名空間とタスク名空間を区別できない。そこで:
- .PHONYはタスク名空間に名前を登録する。
- タスク名は、それが存在すれば(.PHONY登録済みなら)リソース名より優先される。
- タスク名でないターゲット名はリソース名と解釈はするが、
- リソースが存在しないならタスク名と再解釈する。
- つまり、リソースとして存在しないターゲット名はタスク名空間に存在する、と解釈。極めて不適切なフォールバックだ。
一方で:
- ターゲットではない名前(ソース名)は常にリソース名と解釈する。
もともとがリソース名空間しかないのに、概念としてタスクを持ち込んでしまったために、.PHONYで僅かに修正したが、結局は無茶苦茶になった、ということだろう。
現状の名前の使用法は:
- .PHONYで登録されたタスク名:リソース名とは切り離される。
- みなしタスク名、リソースが不在の時にタスクと解釈される
- リソース名: 存在するターゲット名、または非ターゲット名(=ソース名)