このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

諸悪の根源は擬似ターゲット その3:名前空間の問題

擬似ターゲットの問題のさらにその奥には、名前空間と名前の取り扱いの問題がある。

makeはリソース名空間とタスク名空間を区別できない。そこで:

  • .PHONYはタスク名空間に名前を登録する。
  • タスク名は、それが存在すれば(.PHONY登録済みなら)リソース名より優先される。
  • タスク名でないターゲット名はリソース名と解釈はするが、
  • リソースが存在しないならタスク名と再解釈する。
  • つまり、リソースとして存在しないターゲット名はタスク名空間に存在する、と解釈。極めて不適切なフォールバックだ。

一方で:

  • ターゲットではない名前(ソース名)は常にリソース名と解釈する。

もともとがリソース名空間しかないのに、概念としてタスクを持ち込んでしまったために、.PHONYで僅かに修正したが、結局は無茶苦茶になった、ということだろう。

現状の名前の使用法は:

  1. .PHONYで登録されたタスク名:リソース名とは切り離される。
  2. みなしタスク名、リソースが不在の時にタスクと解釈される
  3. リソース名: 存在するターゲット名、または非ターゲット名(=ソース名)

結局、.PHONYされてないターゲット名が曖昧な存在となる。名前空間の設計がイイカゲンだとゲに恐ろしき事になる。